Связь между kernelм Linux и программой пользовательского пространства

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

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

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

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

Существует несколько способов реализации этого.

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

Общая последовательность будет следующей:

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

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

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

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

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

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