一、模块机制产生的原因
内核模块是
Linux
内核向外部提供的一个插口,其全称为动态可加载内核模块(
Loadable Kernel Module
,
LKM
),简称模块。
Linux
内核之所以提供模块机制,是因为它本身是一个单内核(
monolithic kernel
)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。
- 模块的全称是“动态可加载内核模块”(Loadable Kernel Module,LKM)
- 模块实际上是一种目标对象文件(.ko)
- 没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,从而可以动态扩充内核的功能
- 模块在内核空间运行
- 这种目标代码通常由一组函数和数据结构组成
- 优点
- 使得内核更加紧凑和灵活;
- 修改内核时,不必全部重新编译整个内核。系统如果需要使用新模块,只要编译相应的模块,然后使用insmod将模块装载即可;
- 模块的目标代码一旦被链接到内核,它的作用域和静态连接的内核目标代码完全等价;
- 缺点
- 由于内核所占用的内存是不会被换出的,所以链接进入内核的模块会给整个系统带来一定的性能和内存利用方面的损失;
- 装入内核的模块就成为内核的一部分,可以修改内核中的其他部分,因此,模块的使用不当会导致系统崩溃;
- 为了让内核模块能访问所有内核资源,内核必须维护符号表,并在装如何卸载模块式修改符号表;
- 模块会要求利用其它模块的功能,所以,内核要维护模块之间的依赖性。
应用程序 | 内核模块 | |
使用函数 | Libc库 | 内核函数 |
运行空间 | 用户空间 | 内核空间 |
运行权限 | 普通用户 | 超级用户 |
入口函数 | main() | module_init |
出口函数 | exit() | module_exit |
编译 | gcc | make |
链接 | gcc | insmod |
运行 | 直接运行 | insmod |
调试 | gdb | kdbug、kdb、kgdb |
五、模块相关命令
- insmod <module.ko> [module parameters] /*装载模块(install module),只有超级用户才能使用该命令*/
- rmmod <module.ko> /*卸载模块(remove module),只有超级用户才能使用该命令*/
- modinfo <module.ko> /*查看模块信息*/
- lsmod /*列表显示所有的内核模块(list module),等价于cat /pro/modules命令*/
- modprobe [-r] <module name> /*载入指定的个别模块,或是载入一组相依赖的模块*/
扩展阅读:
- 模块依赖
一个
模块A引用另一个模块B所导出的符号,我们说
模块B被A引用;
如果
要装载模块A,必须先要装在模块B。否则模块B所导出的那些符号的引用就不可能被链接到模块A中。这种模块之间的相互关系就叫做
模块依赖。
- insmod与modprobe区别