Некоторый вопрос об объекте ядра

Я пишу объект ядра (файл .ko, который обычно является драйвером устройства) Linux.
Мне нужно использовать какой-то механизм для защиты критической секции в этом проекте, но я совсем запутался в объекте ядра.

После использования insmod для вставки моего модуля в ядро ​​я не могу найти процесс модуля с помощью команды ps -A.
Означает ли это, что IRQ вызовет процессы модуля, так что мне придется использовать мьютекс для их синхронизации?

Кроме того
Немного непонятно, поэтому хотелось бы уточнить вопрос. Этот объект ядра предназначен для фильтрации пакетов, он основан на сетевом фильтре.
Меня смущает следующее: будет ли каждый пакет запускать процесс моего модуля, чтобы мне приходилось использовать мьютекс для их синхронизации, или что-то еще произойдет, когда пакеты прибудут мой местный сетевой адаптер?


person Fan Wu    schedule 15.09.2011    source источник


Ответы (1)


Насколько я знаю, если вы не запустите kthread в своем модуле, в ps -A ничего не будет указано. Объекты ядра не будут запускать какие-либо процессы, фактически функции, которые вставляют и удаляют модули, запускаются в контексте прерывания (если я не ошибаюсь).

В любом случае, я предполагаю, что вы запрограммировали кучу обратных вызовов, зарегистрировали их в Netfilters, и каждый раз, когда ядро ​​обрабатывает пакет, эти обратные вызовы будут вызываться. И это то, что вы подразумеваете под «пакетом, запускающим процесс». Ну, нет, потому что зарегистрированные обратные вызовы netfilter также запускаются из контекста прерывания, поэтому здесь нет понятия процесса. Это означает, что в зависимости от того, в какой точке подключения (локальный вход, локальный выход, переадресация...) вы зарегистрировали обратный вызов, каждый пакет может вызвать прерывание. Вот почему, по моему личному мнению, вы должны стараться, чтобы ваш код делал как можно меньше действий в хуке netfilter.

Наконец, вы не можете использовать мьютексы или семафоры в контексте прерывания, потому что это заблокирует все ядро. Если вам действительно нужно что-то синхронизировать в контексте прерывания, вы должны посмотреть на что-то, называемое спин-блокировками http://www.mjmwired.net/kernel/Documentation/spinlocks.txt .

Надеюсь это поможет.

person Fred    schedule 06.11.2011