Как отобразить файл внутри ядра 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()
Реализации фактически возвращают не отображенную память, которая предназначена для отображения при ошибке первой страницы.