Выполнение функции пространства пользователя из пространства ядра - PullRequest
5 голосов
/ 09 марта 2011

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

Ответы [ 4 ]

7 голосов
/ 09 марта 2011

Вам не повезло с вызовом функций пользовательского пространства из ядра, поскольку ядро ​​не знает и не должно знать об отдельных функциях и логике приложения пользовательского пространства, не говоря уже о том, что каждое приложение пользовательского пространства имеетэто собственная структура памяти, так что ни одному другому процессу или ядру не разрешается вторгаться таким образом (общие объекты здесь исключение, но вы все равно не можете использовать это из пространства ядра).Что касается модели безопасности, вы не должны запускать код пользовательского пространства (который автоматически считается небезопасным кодом в контексте ядра) в первую очередь в контексте ядра, так как это нарушит модель безопасности ядра прямо вэто мгновениеТеперь, учитывая все вышеизложенное, а также многие другие мотивы, вы можете пересмотреть свой подход и сосредоточиться на ядре <-> Пространство пользователя IPC и интерфейсы , файловой системе или вспомогательном API пользовательского режимачитайте ниже).

Вы можете вызывать приложения из пространства пользователя из ядра, которые используют usermode-helper API .Следующая статья IBM DeveloperWorks поможет вам начать использовать API ядра Linux usermode-helper:

API ядра, часть 1: вызов приложений из пользовательского пространства из ядра

5 голосов
/ 10 марта 2011

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

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

Если вы просто хотите сообщить о готовности, читатель может просто прочитать один нулевой байт.

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

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

2 голосов
/ 09 марта 2011

Похоже, ваша линия прерываний уже доступна пользователям через gpiolib?(/sys/class/gpio/...)

Проверяли ли вы, достаточно ли для вас быстрого запуска gpio edge и poll ()?Таким образом, вам не нужно опрашивать статус из приложения пользовательского пространства, но запуск по фронту сообщит об этом через poll ().См. Documentation / gpio.txt в исходном коде ядра.

Если запуск по фронту через sysfs не достаточно хорош, то правильным способом является разработка драйвера ядра, который заботится о критической части времени и экспортирует результатыпространство пользователя через API (sysfs, узел устройства и т. д.).

0 голосов
/ 11 ноября 2012

Я также столкнулся с той же проблемой, я прочитал этот документ http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-6.html,, поэтому планирую использовать сигналы. В моем случае нет шансов потерять сигналы, потому что
1. система замкнутая, после выполнения сигналов другой сигнал получу только я.
2. И я использую сигналы реального времени POSIX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...