一、内核模块
内核模块是一个具有独立功能的程序。它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行。
二、编写Makefile来编译内核模块
obj-m += 源文件名.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
三、编写Makefile文件后,使用make进行编译,编译完就出现一个.ko的文件,这个就是内核模块,需要载入运行。
四、载入内核模块进行运行
载入内核模块的方法有很多,比如:modprobe 和 insmod(install module),前者会分析模块的依赖关系,并且会去指定路径查找内核模块载入,
而后者需要指定内核模块的绝对路径进行载入并且不解决模块的依赖关系。这里使用insmod来载入内核模块,使用rmmod(remove module)卸载内核模块。
[root@localhost kernel_module]# insmod hello.ko
使用dmes查看内核模块的速出Hello world
卸载内核模块
[root@localhost kernel_module]# rmmod hello
dmesg查看输出Goodbye world
五、内核模块和应用程序编程的异同点:
- 内核模块编程是不能使用标准库(比如malloc free等)和一些第三方的库
- 内核模块编程是没有内存保护的,如果内存访问错误,就会出现oops错误
- 内核模块编程是没有main函数的,只有一个初始化函数和一个退出函数
- 内核模块编程需要使用内核提供的头文件和API
- 内核模块编程的标准输出是输出到文件,而不是输出到屏幕
- 内核模块编程的debug是不能使用gdb来进行调试的