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

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

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

Более конкретно, это будет процесс:

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

Ответы [ 3 ]

8 голосов
/ 22 апреля 2010

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

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

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

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

Ksocket - модуль ядра linux 2.6 который предоставляет сокет в стиле BSD интерфейсы (а именно сокет, связывание, слушай, подключайся, принимай, ...) для разработчики ядра, чтобы облегчить их сетевое программирование в ядре Linux пространство. Представленные ksocket интерфейсы во многом совпадают с их аналогами в glibc, так что даже новые разработчики для пространство ядра не будет иметь никаких барьеров в разработка ядра, связанного с сетью *. ПРОГРАММЫ 1016 *

4 голосов
/ 24 апреля 2010

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

2 голосов
/ 05 мая 2010

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

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

...