Ich habe die Quelle für Linux 2.6.27.8 zur Hand, da ich derzeit die Treiberentwicklung auf einem eingebetteten ARM-Ziel durchführe.
Die Datei ... linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
in Zeile 934 enthält zum Beispiel
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));
welche Ausgänge
[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
...
in function, raw_sock_seq_show()
die Teil einer Hierarchie von procfs- Handling-Funktionen ist. Der Text wird erst generiert, wenn eine read()
Anfrage an die /proc/net/tcp
Datei gestellt wird. Dies ist ein vernünftiger Mechanismus, da Procfs- Lesevorgänge sicherlich viel seltener sind als das Aktualisieren der Informationen.
Einige Treiber (wie meine) implementieren die Funktion proc_read mit einem einzigen sprintf()
. Die zusätzliche Komplikation bei der Implementierung der Kerntreiber besteht darin, möglicherweise sehr lange Ausgaben zu verarbeiten, die während eines einzelnen Lesevorgangs möglicherweise nicht in den dazwischen liegenden Kernel-Space-Puffer passen.
Ich habe das mit einem Programm getestet, das einen 64-KB-Lesepuffer verwendet, aber es führt zu einem Kernel-Space-Puffer von 3072 Bytes in meinem System, damit proc_read Daten zurückgibt. Es sind mehrere Aufrufe mit fortschreitenden Zeigern erforderlich, um mehr als so viel Text zurückzugeben. Ich weiß nicht, wie ich die zurückgegebenen Daten richtig konsistent machen kann, wenn mehr als eine E / A benötigt wird. Sicherlich ist jeder Eintrag in /proc/net/tcp
sich selbst konsistent. Es besteht eine gewisse Wahrscheinlichkeit, dass Zeilen nebeneinander zu unterschiedlichen Zeiten als Schnappschuss erstellt werden.