Saya memiliki sumber untuk Linux 2.6.27.8 berguna karena saya sedang melakukan pengembangan driver saat ini pada target ARM tertanam.
File ... linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
di baris 934 berisi, misalnya
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));
output yang mana
[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
...
dalam fungsi raw_sock_seq_show()
yang merupakan bagian dari hierarki fungsi penanganan procfs . Teks tidak dihasilkan sampai read()
permintaan dibuat dari /proc/net/tcp
file, suatu mekanisme yang masuk akal karena membaca procfs pasti jauh lebih jarang daripada memperbarui informasi.
Beberapa driver (seperti milik saya) mengimplementasikan fungsi proc_read dengan satu sprintf()
. Komplikasi ekstra dalam implementasi driver inti adalah untuk menangani output yang berpotensi sangat panjang yang mungkin tidak sesuai dengan buffer ruang-menengah saat membaca tunggal.
Saya mengujinya dengan sebuah program menggunakan buffer baca 64K tetapi menghasilkan buffer ruang kernel 3072 byte di sistem saya untuk proc_read untuk mengembalikan data. Dibutuhkan banyak panggilan dengan pointer maju untuk mendapatkan lebih dari itu banyak teks yang dikembalikan. Saya tidak tahu apa cara yang benar untuk membuat data yang dikembalikan konsisten ketika lebih dari satu i / o diperlukan. Tentu saja setiap entri /proc/net/tcp
konsisten. Ada beberapa kemungkinan bahwa garis berdampingan adalah potret pada waktu yang berbeda.