《深入LINUX内核架构》学习笔记 ——01
模块相关的知识
1. 模块相较于宏内核(微内核优点)
模块消除了宏内核的许多限制,包括:缺乏动态可拓展性、导致内核映像尺寸膨胀、测试新特性时必须重启系统等。
2. 静态链接、动态链接及模块依赖(TIPS)
《深入理解计算机系统》中有这样一段话:
共享库是一个目标模块,在运行或加载时,可以加载到任意的内存地址,并和一个在内存中的程序链接起来。这个过程叫做动态链接,是由一个叫做动态链接器
的程序来执行的。在Linux系统中通常用.so后缀来表示,在Windows系统中,用.dll后缀来表示,叫做动态链接库。
——把静态链接库编译到动态链接库中
完全没有问题,其实不管静态还是动态链接库都是一堆代码和数据(code and data)的集合体罢了。只不过两者的使用方式和情况有所不同。那么什么情况下需要把静态库编译到动态库中呢?
举个例子:假如你有一个库A中的一些图像处理代码是由2.x版本OpenCV实现的,而库B中的一些图像处理代码是由3.X版本的OpenCV实现的,然后你的可执行文件C同时需要调用库A和库B中的代码,放到一起可能会版本冲突,咋办?最简单的办法是,将不同版本的OpenCV静态库直接编译到库A和库B中,然后库A和库B编译成两个动态链接库供你的可执行文件C使用。
——模块的函数引用与指针
程序使用定义的外部库中的函数时,会在二进制代码中存储指向相关函数的指针,而不是函数自身的实现。当然,其他符号类型(如全局变量)是可以存储的,但函数不行。在程序链接(使用ld)时会解决对静态库的引用,而二进制文件的装载时(使用ld.so)会解决对动态库的引用。
nm工具可用于产生模块(或其他任意目标文件)中所有外部函数的列表。例如:nm romfs.ko 。
——modutils工具集合
【1】depmod
如果我们自己来找模块间的依赖关系,会变得非常复杂,因此需要一个可以自动分析模块依赖关系的工具depmod工具可以计算系统的各个模块之间的依赖关系。每次系统启动或新模块安装后,通常会运行该程序。找到的依赖关系会保存到一个列表中默认情况下存放在:/lib/modules/version/modules.dep 。
【2】modinfo
这些模块的二进制的文件中还存在很多其他信息,例如:电子邮件(报告错误)、驱动程序功能介绍、参数介绍、支持设备、许可证等。这些信息都不是必须或强制的,不过是良好的程序设计惯例。
【3】modprobe
驱动程序是可以以二进制的形式发布的,这涉及到GPL通行证一些法律方面不好解释的东西,这里暂且按住不表。modprobe会解析模块的许可证,并判定是否需要拒绝非法链接行为。
modprobe加载模块时会将模块的信息保存到内核的数据结构中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通