Открытие / запись в файл из обработчика Kprobe
Я пишу модуль ядра Linux, используя Kprobes
чтобы отслеживать конкретные системные вызовы, и мне нужно записать в файл изнутри KProbe
обработчик (в частности, Kretprobe
). Я знаю, что обычно это не рекомендуется, но мне нужно записать вывод в очень конкретное место, поэтому я не могу использовать какие-либо стандартные механизмы ведения журналов.
Я могу открыть / написать хорошо с init()
функция в модуле, но когда я пытаюсь сделать это из обработчика зонда, ядро падает.
1 ответ
Из документации /kprobes.txt:
Обработчики проб выполняются с отключенным вытеснением. В зависимости от архитектуры и состояния оптимизации, обработчики также могут работать с отключенными прерываниями (например, обработчики kretprobe и оптимизированные обработчики kprobe работают без отключенных прерываний на x86/x86-64). В любом случае ваш обработчик не должен уступать ЦП (например, пытаясь получить семафор).
Другими словами, вы не можете спать внутри обработчика зонда. Поскольку операции чтения / записи с файлом обычно используют дисковый ввод-вывод, вы не можете использовать эти операции внутри обработчика.
Мне нужно записать вывод в очень конкретное место, поэтому я не могу использовать какие-либо стандартные механизмы ведения журнала.
Вы можете вывести трассировку из обработчика проб, например, в специальный файл устройства, и запустить (параллельно) программу пользовательского пространства, которая просто читает этот файл и записывает в него в очень конкретном месте.