2

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

4

1 回答 1

0

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

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

于 2016-05-25T04:04:30.553 回答