Как отобразить файл внутри ядра Linux?

Я перехватываю некоторые системные вызовы, используя kprobes внутри ядра Linux. Во время этого я хотел бы прочитать из файла, используя mmap,

Невозможно использовать системные вызовы внутри ядра, но часто есть другие способы обойти это. (например sys_open против vfs_read).

Это возможно и если да, то как?

1 ответ

Решение

Насколько я понимаю, функциональность mmap() не может быть использован из пространства ядра.

Хотя можно успешно позвонить do_mmap() или аналогично, функция возвращает адрес пространства пользователя, который ядро не может использовать напрямую. Единственный правильный способ доступа к памяти пользовательского пространства из ядра copy_to_user/copy_from_user, Но использование этих функций подразумевает копирование, поэтому преимущество mmap() (по сравнению с read()) потерян.


Для использования функциональности read() в ядре, set_fs(KERNEL_DS) Техника может быть использована для маскирования указателя на пространство ядра, переданного этой функции, в качестве указателя на пространство пользователя, поэтому copy_to_user работает правильно.

Но с mmap() у одного возникла обратная проблема: ему нужно работать с указателем на пространство пользователя, возвращаемым из функции, как с указателем на пространство ядра. И это нельзя сделать обычными средствами.

Попытка разыменовать указатель на область пользовательского пространства, которая еще не отображена, может привести к сбою ядра. И большинство mmap() Реализации фактически возвращают не отображенную память, которая предназначена для отображения при ошибке первой страницы.

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