Открытие / запись в файл из обработчика Kprobe

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

Я могу открыть / написать хорошо с init() функция в модуле, но когда я пытаюсь сделать это из обработчика зонда, ядро ​​падает.

1 ответ

Из документации /kprobes.txt:

Обработчики проб выполняются с отключенным вытеснением. В зависимости от архитектуры и состояния оптимизации, обработчики также могут работать с отключенными прерываниями (например, обработчики kretprobe и оптимизированные обработчики kprobe работают без отключенных прерываний на x86/x86-64). В любом случае ваш обработчик не должен уступать ЦП (например, пытаясь получить семафор).

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

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

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

Другие вопросы по тегам