Можно ли вызвать функцию обратного вызова пользовательского пространства из пространства ядра в Linux (ioctl)?

StackOverflow https://stackoverflow.com/questions/2689975

Вопрос

Можно ли расширить интерфейс ioctl в Linux, чтобы приложение пользовательского пространства могло отправлять указатель на функцию в драйвер пространства ядра?

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

Более конкретно, это был бы следующий процесс:

  1. Данные считываются драйвером в буфер.
  2. Обработка данных осуществляется с помощью этих пользовательских функций на месте.
  3. Выполняется еще некоторая обработка, возможно, с некоторыми блоками HW.
  4. Данные используются приложением в пользовательском пространстве.
Это было полезно?

Решение

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

Тогда вы могли бы использовать inotify (Журнал Linux) для ядра-> пользовательского пространства мероприятия связи. IOCTL или запись на устройство для пользовательского пространства-> Событие ядра. Обмен данными также может быть достигнут путем чтения / записи на один или несколько файлов устройств.

В качестве альтернативы вы можете предоставить / proc или / sys файловые системы или использовать netlink.

Вы также можете рассмотреть ksocket.:

Ksocket - это модуль ядра Linux 2.6, который обеспечивает интерфейсы сокетов в стиле BSD (а именно сокет, связывание, прослушивание, подключение, принять, ...) для разработчиков ядра для облегчения их сетевого прогарампинга в пространстве ядра Linux. Представления интерфейсов Ksocket находятся настолько же, что и их эквивалент в Glibc, поэтому даже новые разработчики для пространства ядра не будут иметь барьера в разработке программ, связанных с сетью ядра.

Другие советы

Я думаю, вы просите о квадратном круге:если бы ядро просто выполняло вашу функцию "userland" напрямую, это была бы не "userland", а скорее самодельная модульная система с возможностью загрузки.Я предполагаю, что то, что вы в самом деле want - это способ выяснить, что нужно сделать, чтобы все это работало без сбоев в работе вашего компьютера каждый раз, когда вы допускаете ошибку.Возможно, вы могли бы злоупотреблять обработчиками сигналов как средством "обратного вызова", но я слишком устал, чтобы указать, как вы могли бы получить Назад к ядру, как если бы возвращался вызов функции.Проблема здесь в том, что при любом переключении контекста userland-> kernel ядро запускается с новым стеком, поэтому обратного адреса давно нет.Как насчет того, чтобы объединить обработчик сигналов с mmap'ing /dev/mem и позволить вашему псевдоприводу пользовательского интерфейса напрямую подключаться к структурам данных драйвера режима ядра?Но затем вы возвращаетесь к перезагрузке, когда совершаете ошибку, если только не разберетесь, как использовать mmap Только структуры данных вашего драйвера?Другими переназначаемыми механизмами могут быть ПОТОКИ и линейные дисциплины TTY;Я думаю, они наделяют нас какой-то способностью к трансмогрификации.Конечно, все это не является хорошей идеей в качестве постоянного решения!

Ваше дело использование продолжает упоминать данные.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top