Связь между ядром Linux и программой пространства пользователя - PullRequest
3 голосов
/ 16 ноября 2011

В настоящее время я пишу модуль ядра Linux, и у меня возникают проблемы с реализацией его связи с программами пользовательского пространства.

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

Я думаю, что IPC пространства ядра пользователя или сокет Unix были бы хороши, но мне не повезло найти пример от Google.

В настоящее время мое уродливое решение - экспортировать chardev и позволить программе пользовательского пространства записывать запросы в файл устройства и считывать результаты из него. Но я могу выдать только один запрос на open() вызов, и это вызывает новые проблемы. Мне действительно нужен IPC или сокетоподобная вещь. Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 января 2012

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

3 голосов
/ 16 ноября 2011

Есть несколько способов реализовать это.

Самое простое - использовать интерфейс файлов proc для связи, особенно если размер сообщения и результата меньше одной страницы.

Общая последовательность будет выглядеть так:

  • Реализация proc_open (), proc_read () и proc_write (); proc_close ();
  • Открывать и закрывать можно реализовать блокировку, так что только один экземпляр пользовательской программы может фактически получить доступ к модулю запросов модуля.

  • запрос задачи отправляется посредством записи в файл proc,

  • Функция записи будет успешно возвращена, если модуль понимает команду, прежде чем программа вернет инициализацию обработки запроса, обработка может фактически выполняться, когда файл proc считывается, если он тривиален. Если обработка значительно усложняется, тогда я предлагаю вам прочитать нижние половины 1 (вы можете просто запустить рабочую очередь).

  • При чтении запускается «обработка, которую вы хотите, чтобы модуль выполнял». или ждет, пока ЧД завершит обработку, если вы сделаете это таким образом. Вы можете использовать спин-блокировку или мьютекс для управления потоком.

  • Обработка ядра возвращает результат после завершения.

...