如何在 tmpfs 中找到 Linux 驱动程序的代码段? (实时)

How to find the code segment of a Linux driver in tmpfs? (in real-time)

我有一个名为 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的形式组织的?或者这是否意味着我错过了其他东西?

似乎对于构建为 LKM 的模块,内存是在 MODULES_VADDRMODULES_END 之间动态分配的(参见 arch/($YOUR_ARCH)/kernel/module.c 中的 module.c)。我可以使用 shell 命令 cat /proc/kallsyms 获取其函数地址的起始地址,但在我的代码中还没有好的方法。

至于内置到内核映像中的模块,System.map 文件将提供信息。无论哪种方式,我都不知道如何在代码中动态获取地址。