Как найти сегмент кода драйвера Linux в tmpfs? (в настоящее время)
У меня есть драйвер персонажа под названием drv1, и пользовательское приложение использует ioctl
общаться с ним, который будет передавать параметр struct file *filp
, Теперь я хочу узнать адрес сегмента кода drv1, но я столкнулся с некоторыми проблемами.
Сначала, я думаю, struct file *filp
может быть полезным, поэтому я посмотрел на определение в исходном коде, и найти указатель struct inode *f_inode; /* cached value */
, Тогда я примерно искал определение struct inode
(Я не уверен, правильно ли это, так как я не знаком, когда tmpfs); мне нужен указатель с именем struct address_space *i_mapping. Но я не знаю, как копать глубже и застрять; Есть некоторые сложные структуры данных в struct address_space
, такие как:
struct radix_tree_root page_tree; /* radix tree of all pages */
а также
struct rb_root i_mmap; /* tree of private and shared mappings */
Означает ли это, что данные драйвера drv1 организованы в виде radix_tree_root
? Или это означает, что я что-то пропустил?
1 ответ
Кажется, что для модулей, которые построены как LKM, память динамически распределяется между MODULES_VADDR
а также MODULES_END
(увидеть module.c
в arch/($YOUR_ARCH)/kernel/module.c
). Я могу получить начальный адрес его функции адрес с помощью команды оболочки cat /proc/kallsyms
, но пока нет хорошего способа сделать это в моем коде.
Что касается модуля, встроенного в образ ядра, файл System.map предоставит информацию. В любом случае, я не знаю, как получить адрес динамически в коде.