1 总体设计思路
Linux内核是单体式结构,相对于微内核结构而言,其运行效率高,但是系统的可维护性和可扩展性较差。为此,Linux提供了内核模块(module)机制,它不仅可以弥补单体式内核相对于微内核的一些不足,而不影响系统性能。内核模块的全称是动态可加载内核模块(Loadabe Kernel Module,KLM),简称为模块。模块是一个目标文件,能完成某种独立的功能,但其自身不是一个独立的进程,不能单独运行,可以动态载入内核,使其成为内核代码的一部分,与其他内核代码的地位完全相同,当不需要某模块功能时,可以动态卸载。实际上,Linux中大多数设备驱动程序或文件系统都以模块方式实现,因为它们数目繁多,体积庞大,不适合直接编译在内核中,而是通过模块机制,需要时临时加载。使用模块机制的另一个好处是,修改模块代码后只需要重新编译和加载模块,不必重新编译整个内核和引导系统,减少了更新系统功能的复杂度。
一个模块通常有一组函数和数据结构组成,用来实现某种功能,如实现一种文件系统、一个驱动模块或其他内核上层的功能。模块自身不是一个独立的进程,当前集成运行过程中调用到模块代码时,可以认为该段代码就代表当前进程在核心态运行。
模块编程可以使用内核的一些全局变量和函数,内核符号表就是用来存放所有模块都可以访问的符号及相应地址的表,存放在/proc/kallsyms文件中,可以使用“cat /proc/kallsyms”命令查看当前环境下导出的内核符号。
通常情况下,一个模块只需实现自己的功能,而无需导出任何符号;但如果其他模块需要调用这个模块的函数或数据结构时,该模块也可以导出符号。这样,其他模块可以使用由该模块导出的符号,利用现成的代码实现更加复杂的功能,这种技术也被称为模块层叠技术,当前已经使用在很多主流的内核源代码中。
网友评论