2014-01-07 2 views
3

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

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

Это типичная проблема производителя/потребителя. Производитель - это модуль ядра, а потребитель - программа пользовательского пространства.

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

+0

Как насчет размещения процесса в 'wait_queue' и пробуждения его из потока ядра, когда они готовы к работе? –

+0

Ну, это зависит, если ваш модуль драйвер ввода-вывода? –

+0

Вы можете получить некоторые подсказки здесь: http://www.nirendra.net/cms/communicate_kernel –

ответ

4

Прочитайте некоторые другие модули, которые делают то, что вы хотите.

Есть много вариантов для того, как сделать это в ядре Linux, в том числе:

  • виртуальных файловых систем, например/Proc,/SYS, configfs, relayfs (реально смотреть на relayfs)
  • Netlink
  • блокирующие системные вызовы
  • опрос()/Epoll() & связанные

/прок, вероятно, проще всего начать так как это было навсегда, и есть тонна документации о том, как ее использовать. Создайте виртуальный файл, который отобразится в вашем буфере, затем откройте приложение для вашего приложения в формате fd и используйте select. Простой и вездесущий. Есть более современные и «лучшие» способы - они неизбежно будут описаны в терминах/proc + select(), поэтому изучение этих первых научит вас чему-то полезному.

2

Для обмена информации о состоянии вашего модуля ядра, я предлагаю использовать любого из виртуальных файловых систем, доступных (например: /proc, /sys или если вы отладки debugfs).

Однако, если вы хотите передавать большие объемы данных и обратно в ядро, то вы можете посмотреть на использование NETLINK розетки или использовать mmap, который, вероятно, самый быстрый механизм передачи данных, хотя вы должны реализовать свой собственный механизм уведомления, чтобы информировать программу пользовательского пространства, когда данные готовы, и наоборот (для потребления).

См. Ссылку this для всех возможных вариантов, доступных в Linux.

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