J'ai la source pour Linux 2.6.27.8 à portée de main puisque je suis en train de développer des pilotes sur une cible ARM intégrée.
Le fichier ... linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
à la ligne 934 contient, par exemple
seq_printf(seq, "%4d: %08X:%04X %08X:%04X"
" %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d\n",
i, src, srcp, dest, destp, sp->sk_state,
atomic_read(&sp->sk_wmem_alloc),
atomic_read(&sp->sk_rmem_alloc),
0, 0L, 0, sock_i_uid(sp), 0, sock_i_ino(sp),
atomic_read(&sp->sk_refcnt), sp, atomic_read(&sp->sk_drops));
quelles sorties
[wally@zenetfedora ~]$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 017AA8C0:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 15160 1 f552de00 299
1: 00000000:C775 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 13237 1 f552ca00 299
...
en fonction raw_sock_seq_show()
qui fait partie d'une hiérarchie de fonctions de traitement procfs . Le texte n'est pas généré tant qu'une read()
requête n'est pas faite sur le /proc/net/tcp
fichier, un mécanisme raisonnable puisque les lectures procfs sont sûrement beaucoup moins courantes que la mise à jour des informations.
Certains pilotes (comme le mien) implémentent la fonction proc_read avec un seul sprintf()
. La complication supplémentaire dans l'implémentation des pilotes de base est de gérer une sortie potentiellement très longue qui peut ne pas tenir dans le tampon intermédiaire de l'espace noyau lors d'une seule lecture.
J'ai testé cela avec un programme utilisant un tampon de lecture de 64 Ko, mais il en résulte un tampon d'espace de noyau de 3072 octets dans mon système pour que proc_read renvoie des données. Plusieurs appels avec des pointeurs avancés sont nécessaires pour obtenir plus de texte renvoyé. Je ne sais pas quelle est la bonne façon de rendre les données renvoyées cohérentes lorsque plus d'une entrée / sortie est nécessaire. Certes, chaque entrée dans /proc/net/tcp
est auto-cohérente. Il est probable que les lignes côte à côte soient instantanées à des moments différents.