1、什么是内核模块?
内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(
Loadable Kernel Module,LKM),简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对来说比较差,引入模块机制就是为了弥补这一缺陷。
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动或其他内核上层的功能。
总之模块是一个为内核或者其他内核模块提供使用功能的代码块。
2、编写第一个小模块实例
环境:VMware 版本:12.0.0
CentOS 7
1)进入虚拟机,打开Linux终端,获取root权限。
2)创建一个文件夹(mkdir命令创建一个名为hello的文件)
3)进入hello文件夹,并创建一个名为hello.c的文件,再编辑hello.c文件。(若没有这个文件时,vim命令会同时创建这个文件,并且进入vi编辑器对文件进行编辑)
(cd hello为进入hello文件夹)
输入如下内容:
编辑完成后,先按左上角Esc键,再同时按Shift+:两个键,最后输入小写的wq(功能是保存编辑并退出编辑)。
注:hello_init和hello_exit这两个我们定义的函数称为模块的插入与删除(目的是打印消息到内核缓冲区);__init与__exit是属性---联结到函数的数据元片(注意这两个属性钱的下划线是双下划线);GPL是一份GNU通用公共授权许可证;module_init()和 module_exit()是两个宏,将上面的两个函数设置为我们模块的生命周期回调函数;还有就是要注意书写格式,该大写的地方要大写,该tab的地方要tab,不然很容易在编译的时候报错。
4)编写Makefile文件(注意Makefile文件没有后缀,并且M要大写同样使用vim命令)。
编写Makefile文件:
结束编辑并保存(先Esc再Shift+:最后wq)。
注:在ifneq后面要有一个空格,写all和clean的内容时要有一个tab的空间。(在这里会有颜 {MOD}的提示)
5)执行make指令(直接make,后面不用加东西)
6)查看文件夹下的文件(使用ls命令)
除了hello.c文件和Makefile文件之外,其它全部为make后自动生成的文件(ls命令为查看当前文件夹下的内容目录)
7)加载模块进内核(使用insmod命令)
加载make生成的hello.ko文件进内核。(输入insmod hello.ko文件后直接回车)
8)查看加载进去的模块(使用lsmod命令)
(lsmod命令即为查看内核模块的命令)
执行命令后的结果:(可以看到第三行的hello模块,说明模块加载成功)
使用dmesg命令查看日志文件:(使用dmesg命令)
查看日志文件:(打印出Hello Linux!注:第一个Hello! Linux!和Byebye! Linux是我上次运行的结果)
9)卸载模块(使用rmmod命令)
查看日志文件:(打印出Byebye! Linux!)
(也可用lsmod查看是否卸载成功,看hello模块是否还在内核目录中)
好了,到这里,恭喜你已经实现了你的第一个内核模块的编写、加载以及卸载了!!