Лучший способ передачи больших данных из ядра в пространство пользователя - PullRequest
1 голос
/ 07 декабря 2010

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

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

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

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

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

СООБЩЕНИЕ 1 MESSMESSAGE3

Ответы [ 4 ]

3 голосов
/ 08 декабря 2010

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

См. Documentation/filesystems/relay.txt.

Оттуда:

Интерфейс реле обеспечивает средство для приложений ядра, чтобы эффективно регистрировать и передавать большие количества данные из ядра в пространство пользователя через определяемые пользователем «релейные каналы».

1 голос
/ 08 декабря 2010

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

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

При осторожном использовании атомарных переменных и спин-блокировок вы должны быть в состоянии гарантировать быструю, безопасный доступ к данным, даже в нескольких потоках, если это необходимо.

1 голос
/ 08 декабря 2010

Я считаю, символьное устройство будет хорошим решением для вас.

0 голосов
/ 08 декабря 2010

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

...