我有一个名为 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
的形式?或者这是否意味着我错过了其他的东西?
答案 0 :(得分:0)
对于构建为LKM的模块,内存在MODULES_VADDR
和MODULES_END
之间动态分配(请参阅module.c
中的arch/($YOUR_ARCH)/kernel/module.c
)。我可以使用shell命令cat /proc/kallsyms
来获取其函数地址的起始地址,但在我的代码中没有好的方法。
对于内核映像中内置的模块,System.map文件将提供信息。无论哪种方式,我都不知道如何在代码中动态获取地址。