一、什么是模块
1、定义
可加载内核模块Loadable Kernel Module,LKM
2、为什么需要模块
LINUX内核是单内核,即内核模块是内核的一部分,和内核其他代码是一个程序。那么问题就来了:PC这样的通用平台会遇到什么问题?
3、模块融入内核的时机
A、静态编译进内核
内核模块代码跟内核其他代码一起编译。
B、运行时动态加载
内核先编译,然后再单独编译内核模块,内核模块运行时融入到内核。
二、内核模块
A、编译器完成
通过gcc扩展属性,告诉gcc链接的时候,把代码放到特定的区域去
B、编写代码完成
自己设计一个函数指针数组,编写代码,完成函数首地址存放
三、编译模块
linux内核是单内核,即内核一个程序,内核模块是这个特殊程序中的一部分
1、问题引入——进程空间
2、问题引入——共享库函数调用
3、内核模块使用内核函数
4、结论
编译一个内核模块,必须使用编译出模块要融入的内核的内核源码。
A、编译系统
编译器不一致,可能会造成代码运行问题
B、头文件声明
编译器帮助做语法检查
C、符号表
链接使用的内核函数,如果模块要导出函数或变量,知道在符号表合理的位置区域分配
四、加载内核模块