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

1、什么是内核模块?

内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对来说比较差,引入模块机制就是为了弥补这一缺陷。

模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动或其他内核上层的功能。

总之模块是一个为内核或者其他内核模块提供使用功能的代码块。


2、编写第一个小模块实例

环境:VMware  版本:12.0.0     

          CentOS 7


1)进入虚拟机,打开Linux终端,获取root权限。

Linux---我的第一个内核模块之Hello World_第1张图片

2)创建一个文件夹(mkdir命令创建一个名为hello的文件)

Linux---我的第一个内核模块之Hello World_第2张图片

3)进入hello文件夹,并创建一个名为hello.c的文件,再编辑hello.c文件。(若没有这个文件时,vim命令会同时创建这个文件,并且进入vi编辑器对文件进行编辑)

Linux---我的第一个内核模块之Hello World_第3张图片

cd hello为进入hello文件夹)

输入如下内容:

Linux---我的第一个内核模块之Hello World_第4张图片

编辑完成后,先按左上角Esc键,再同时按Shift+:两个键,最后输入小写的wq(功能是保存编辑并退出编辑)。

注:hello_init和hello_exit这两个我们定义的函数称为模块的插入与删除(目的是打印消息到内核缓冲区);__init与__exit是属性---联结到函数的数据元片(注意这两个属性钱的下划线是双下划线);GPL是一份GNU通用公共授权许可证;module_init()和 module_exit()是两个宏,将上面的两个函数设置为我们模块的生命周期回调函数;还有就是要注意书写格式,该大写的地方要大写,该tab的地方要tab,不然很容易在编译的时候报错。

4)编写Makefile文件(注意Makefile文件没有后缀,并且M要大写同样使用vim命令)。

编写Makefile文件:

Linux---我的第一个内核模块之Hello World_第5张图片

结束编辑并保存(先Esc再Shift+:最后wq)。

注:在ifneq后面要有一个空格,写all和clean的内容时要有一个tab的空间。(在这里会有颜色的提示)

5)执行make指令(直接make,后面不用加东西)

Linux---我的第一个内核模块之Hello World_第6张图片

6)查看文件夹下的文件(使用ls命令)

Linux---我的第一个内核模块之Hello World_第7张图片

除了hello.c文件和Makefile文件之外,其它全部为make后自动生成的文件(ls命令为查看当前文件夹下的内容目录)

7)加载模块进内核(使用insmod命令)

加载make生成的hello.ko文件进内核。(输入insmod hello.ko文件后直接回车)

8)查看加载进去的模块(使用lsmod命令)


lsmod命令即为查看内核模块的命令)

执行命令后的结果:(可以看到第三行的hello模块,说明模块加载成功)

Linux---我的第一个内核模块之Hello World_第8张图片

使用dmesg命令查看日志文件:(使用dmesg命令)

查看日志文件:(打印出Hello Linux!注:第一个Hello! Linux!和Byebye! Linux是我上次运行的结果)

Linux---我的第一个内核模块之Hello World_第9张图片

9)卸载模块(使用rmmod命令)

查看日志文件:(打印出Byebye! Linux!)

Linux---我的第一个内核模块之Hello World_第10张图片

也可用lsmod查看是否卸载成功,看hello模块是否还在内核目录中)



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

你可能感兴趣的:(Linux入门基础)