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

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

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

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

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

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

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

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

我们已经知道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文件:

用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可以看到如下信息:

二、结语

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐