Подтвердить что ты не робот

Вызывать функцию модуля ядра из программы на пользовательском пространстве

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

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

4b9b3361

Ответ 1

Существует полный обзор взаимодействия модуля linux-kernel и программы пользовательского пространства http://wiki.tldp.org/kernel_user_space_howto "Ядро пространства, пользовательские пространственные интерфейсы" от Ariane Келлер (это с 2008-09-28 года, но около 2,6 ядра, только основной новый способ - relayfs)

В списке отсутствует обычный вызов функции из пространства пользователя в пространство ядра, только syscall (добавление нового syscall нелегко) и upcall (вызов в обратном направлении).

Один из самых простых интерфейсов - ioctl; но вы не можете начать использовать ioctl перед созданием procfs, sysfs или аналогичного файла.

Другое - sysctl; но sysctl более подходит для чтения/записи глобальной переменной. (С помощью sysctl-интерфейса трудно передать несколько параметров).

Ответ 2

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

Существует только один обычный способ для пользовательской программы явно запрашивать службы из ядра - make a system call.

Существуют также ловушки и некоторые механизмы связи с ядром пользователя с ядром Linux, но здесь они не актуальны.

Ответ 3

Как отмечали другие плакаты, существует четкое различие между ядром и пользовательским пространством. Таким образом, вы не можете вызвать функцию ядра непосредственно из пользовательского пространства. Я думаю, что самый простой способ отправить сообщения между пользовательским пространством и пространством ядра - через сокеты netlink. Сетевой сокет позволяет легко передавать произвольные структуры данных между уровнем пользователя и уровнем ядра.

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

Пример кода здесь: http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html