У меня есть источник для Linux 2.6.27.8, так как я сейчас занимаюсь разработкой драйвера для встроенной цели ARM.
Файл ... linux-2.6.27.8-lpc32xx/net/ipv4/raw.c
в строке 934 содержит, например,
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));
, который выводит
[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
...
в функции raw_sock_seq_show()
, которая является частью иерархии procfs функций обработки.Текст не генерируется до тех пор, пока из файла /proc/net/tcp
не будет сделан запрос read()
, что является разумным механизмом, поскольку операции чтения procfs , безусловно, встречаются гораздо реже, чем обновление информации.
Некоторые драйверы(например, мой) реализовать функцию proc_read с одним sprintf()
.Дополнительным усложнением в реализации драйверов ядра является обработка потенциально очень длинных выходных данных, которые могут не помещаться в промежуточный буфер пространства ядра во время одного чтения.
Я протестировал это с программой, использующей буфер чтения 64K, ноэто приводит к тому, что в моей системе буфер пространства ядра составляет 3072 байта для proc_read для возврата данных.Многократные вызовы с продвигающимися указателями необходимы, чтобы получить больше, чем столько возвращаемого текста.Я не знаю, как правильно сделать согласованные возвращаемые данные, когда требуется более одного ввода-вывода.Конечно, каждая запись в /proc/net/tcp
является самосогласованной.Существует некоторая вероятность того, что линии рядом друг с другом являются снимками в разное время.