Linux---我的第一个内核模块之Hello World

2019-07-13 08:53发布

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模块是否还在内核目录中)

好了,到这里,恭喜你已经实现了你的第一个内核模块的编写、加载以及卸载了!!