如何在 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_VADDR
和 MODULES_END
之间动态分配的(参见 arch/($YOUR_ARCH)/kernel/module.c
中的 module.c
)。我可以使用 shell 命令 cat /proc/kallsyms
获取其函数地址的起始地址,但在我的代码中还没有好的方法。
至于内置到内核映像中的模块,System.map 文件将提供信息。无论哪种方式,我都不知道如何在代码中动态获取地址。
我有一个名为 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_VADDR
和 MODULES_END
之间动态分配的(参见 arch/($YOUR_ARCH)/kernel/module.c
中的 module.c
)。我可以使用 shell 命令 cat /proc/kallsyms
获取其函数地址的起始地址,但在我的代码中还没有好的方法。
至于内置到内核映像中的模块,System.map 文件将提供信息。无论哪种方式,我都不知道如何在代码中动态获取地址。