c++ 宏 win linux_第十一期-Linux内核模块依赖图绘制(1)

387a26ee24db15dcccd0bb0b365f365b.png

作者:罗宇哲,中国科学院软件研究所智能软件研究中心

在上一期中,我们以Linux网络模块中的CAKE系统为例,介绍了对Linux补丁源码的分析方法,这一期中我们将介绍如何查看Linux内核中各模块的依赖关系。

一、查看Linux内核模块依赖关系

Linux内核中各个模块之间有相互依赖的关系,表现为一个模块中的文件可以包含另一个模块中的头文件,从而实现对其它模块中定义的函数和变量的调用。

为了查看模块之间的依赖关系,我们可以使用lsmod命令,该命令展示了内核已装载模块的模块列表和各个模块所依赖的模块。如果读者已经按照“Linux内核编程环境”小节中所介绍的方法安装了Linux 4.19.94版的内核,那么使用lsmod命令会出现如下列表:

3563a3ba8e7d39145a576a0a3b18ee6c.png

25e4167cc6ffea40734ef2bf66d624fe.png

bf749586f39a26dd4682857a09a04463.png

在上图中,这个列表的第一列列出了模块的名字,第二列列出了模块的大小(以byte为单位),而第三列和第四列则列出了使用者的数量和名称,即使用该模块的模块的数量和名称,使用者依赖被使用者。

以Linux网络防火墙相关的ip_tables和x_tables模块为例,ip_tables使用了x_tables模块。我们使用modinfo命令可以进一步查看模块的详细信息,例如我们对ip_tables模块使用modinfo命令可以得到如下信息:

f89f4bb59837214aa5b7f8240b8cbe0c.png

从depends一项我们可以看到该模块依赖x_tables模块。为了理解这种依赖关系,我们首先要了解一下Linux模块的编译规则。打开/linux-4.19.94/net/ipv4/netfilter/下的Makefile文件,我们可以看到和ip_tables模块有关的编译选项:

048ba6f5cce8fa3b51b2f2fb6a3e19b4.png

其中$(CONFIG_IP_NF_IPTABLES)表示引用CONFIG_IP_NF_IPTABLES变量。在“Linux源码编程环境”小节中,我们提到make menuconfig会在源码顶层目录下生成.config文件。打开.config文件,搜索CONFIG_IP_NF_IPTABLES可以看到:

990733b7b80c90d785cfb91a6216db31.png

我们已经知道obj-m选项是将模块源码编译成.ko文件,即可以动态加载的模块。所以ip_tables.o文件将被编译为ip_tables.ko文件,而根据编译的隐含规则,ip_tables.o文件的源码应存放在ip_tables.c文件中。

我们打开ip_tables.c文件。在/linux-4.19.94/net/ipv4/netfilter/目录下我们可以找到ip_tables.c文件,打开该文件后,我们可以在文件开头的include列表中看到x_table.h文件:

92cd55d2ea65473f2051ddfb908fc0f5.png

用gf命令可以进入x_tables.h文件中,可以发现这个文件中定义了一些结构体,如xt_entry_match和xt_entry_target等, ip_table.c文件中使用了这些结构体。此外,ip_table.c文件也使用了x_tables.h中的一些宏定义,如xt_entry_foreach(pos, ehead, esize)宏等。

除了用lsmod命令可以看到模块之间的依赖关系外,查看modules.dep文件也可以看到,该文件的路径为/lib/modules/4.19.94/modules.dep,打开后搜索ip_tables可以看到如下信息:

72910a62bbdeba6d6c0d0bf7ec4237ed.png

二、结语

本期我们介绍了查看模块依赖关系的方法,在下一期中我们将使用这些依赖关系为Linux-4.19.94版内核绘制模块依赖关系图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值