深入Linux设备驱动程序内核机制
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 本章小结

本章详细讨论了作为设备驱动程序的重要存在形式——内核模块幕后的技术细节,内核模块可以在系统运行期间动态扩展系统的功能,这是其最大的优势。在用户空间中,加载和卸载模块使用的是一组称为mod utils的工具包,其中包括最基本的insmod和rmmod工具。

内核模块在文件格式上是一种可重定位的ELF文件,由Linux系统中的内核模块加载器负责加载和卸载。模块可以调用内核源码或者其他模块实现的函数,这需要模块的构造工具链和内核模块加载器共同协作才可以完成。为此,内核和内核模块通过EXPORT_SYMBOL宏向外导出符号,这些导出的符号可以被其他模块所使用,它们被放在一个特殊的section中,内核和内核模块拥有各自的section用来保存导出符号的信息。系统中所有成功加载的模块都以链表的形式存放在内核的一个全局变量modules中。

模块在编译时需要指定一个内核源码树,这种指定不是出于链接的需要,而是模块需要内核源码头文件中的一些定义,包括以头文件形式出现的内核配置信息。因此,一个.ko文件总是基于某一特定内核源码树所构成,如果要在一个运行不同内核版本的系统中加载该.ko文件,有可能会引起一些潜在问题。例如,随着内核版本的演进,老的.ko文件所调用的一些内核函数在新版本的内核中可能消失或者改变了。为了防止这一问题的发生,内核引入了版本控制机制。如果内核模块以开放源码的形式向外发布,则版本不一致并不会成为一个问题,用户可以在新版本的内核上重新编译构造新的.ko文件。