Linux 内核的整体结构非常庞大,其包含的组件也非常多。怎么样把需要的部分包含在内核中呢?
一种是将所需要的功能都编译到Linux 内核。但会导致两个问题,一是生成的内核会很大,二是如要在现有的内核中新增或删除功能,将不得不重新编译。因此Linux 提供了一种被成为模块(Module)的机制,可以实现以上效果。
模块具有以下特点:
- 模块本身不被编译入内核映像,从而控制了内核的大小。
- 模块一旦被加载,它就和内核的其他部分完全一样。
以下是最简单的内核模块“Hello World”
Step1.编写 Hello.c
Step2.编写Makefile 在Hello.c 在同一路径 ,并且M要大写 只需修改KENRNELDIR 之后的路径为自己kernel所在路径即 /home/summer/micro2440/kernel/linux-2.6.32.2
Step3.编译
使用命令:make 之后在hello.c所在路径就会生成hello.ko 目标文件
Step4.加载内核
使用insmod ./ hello.ko 加载
[root@FriendlyARM /root]# insmod ./hello.ko
Hello world!
*insmod 或者modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。
使用lsmod 命令可以获得系统中加载了的模块及模块间的依赖关系,如下
lsmod[root@FriendlyARM /root]# lsmod
hello 620 0 - Live 0xbf00c000
*lsmod 命令实际上读取并分析/proc/modules文件
卸载模块 rmmod hello
[root@FriendlyARM /root]# rmmod hello
Good Bye!
*rmmod卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能