Как найти сегмент кода драйвера 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 предоставит информацию. В любом случае, я не знаю, как получить адрес динамически в коде.

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