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

时间:2016-04-20 12:57:56

标签: filesystems drivers inode 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 个答案:

答案 0 :(得分:0)

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

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