华为云技术分享Linux内核模块依赖图绘制

Posted 华为云官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为云技术分享Linux内核模块依赖图绘制相关的知识,希望对你有一定的参考价值。

在上一期中,我们以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版内核绘制模块依赖关系图。

以上是关于华为云技术分享Linux内核模块依赖图绘制的主要内容,如果未能解决你的问题,请参考以下文章

华为云技术分享Linux内核发展史

华为云技术分享Linux内核发展史

网易视频云技术分享:UML调试Linux内核

如何化解35岁危机?华为云数据库首席架构师20年技术经验分享

华为云技术分享昇腾AI处理器软件栈--总览

华为云技术分享Spring Boot 最流行的 16 条实践解读!