2010-12-07 2 views
1

Мне нужно передать несколько мегабайт данных в секунду из модуля Linux-Kernel в User-Space, и я не хочу пропускать какое-либо сообщение из модуля, если Я читал оттуда. Каков наилучший способ сделать это?Лучший способ передачи больших данных из ядра в пользовательское пространство

Существует довольно мало возможных решений для этого: Named-Pipes, Proc-File и Block-Device Но я не уверен, какой из них выбрать, а какой обещает лучшая производительность, так как я являюсь новичком-новичком.

В настоящий момент я использую кольцевой буфер (с винтовыми зажимами) в модуле ядра для хранения сообщений, и если файл Proc-файла читается, я помещаю данные из Ring-Buffer в Proc-File; на стороне пользователя У меня есть программа, которая запускает cat /proc/procfile несколько раз и показывает результат. Проблема с этим решением является то, что вместо того, чтобы

СООБЩЕНИЕ 1 СООБЩЕНИЯ 2 СООБЩЕНИЯ 3

на выходе, я вижу (иногда, раз в несколько тысяч сообщений)

СООБЩЕНИЕ 1 MESSMESSAGE3

ответ

1

Всегда можно было бы реализовать то, что я думаю как «небоскреб бедняка»: создать устройство char, а затем создать пользовательский ioctl с любой семантикой, которую вы хотите.

В этом случае я предполагаю, что у вас будет ioctl, который проходит в буфере пользовательского пространства, и возвращает кусок данных из циклического буфера, который вы держите в ядре.

С осторожным использованием атомных переменных и шпиндельных замков вы должны быть в состоянии гарантировать быстрый и безопасный доступ к данным даже в случае нескольких потоков.

3

Возможно, вы захотите использовать интерфейс реле, ранее известный как relayfs.

См. Documentation/filesystems/relay.txt.

Оттуда:

Реле интерфейса обеспечивает средство для приложений ядра эффективно журнала и передавать большие объемы данных из ядра в пользовательское пространство с помощью определяемых пользователем 'каналов реле.

0

Многие методы могут быть использованы. Однако Netlink не является одним из них, поскольку он не является надежным транспортом (например, UDP). Символьное устройство выглядит по порядку, хотя вы также можете использовать сокет TCP (см. Nfsd).

Смежные вопросы