Некоторые вопросы об объекте ядра - PullRequest
1 голос
/ 15 сентября 2011

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

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

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

1 Ответ

1 голос
/ 07 ноября 2011

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

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

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

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

...