编写第一个Linux内核模块: Hello World

要想扩展Linux内核的功能,可通过如下两种方法:

  1. 直接修改Linux内核源码,然后自行编译Linux内核源码
  2. 编写Linux内核模块

内核模块的开发效率更高,而且可以在内核运行时动态加载。由于Linux内核模块是动态加载,所以它也叫可加载内核模块,洋文LKM(Loadable Kernel Module)。Linux内核镜像位于/boot目录下,启动时最先加载,LKM总是在内核启动之后加载。

LKM主要用于:设备驱动、文件系统驱动和系统调用。

为什么使用LKM?

  • 不用浪费时间频繁编译内核
  • 保持原始内核不变
  • 开发、调试更高效
  • 灵活,没用的模块一条命令即可卸载

注意:LKM是内核空间程序,不是用户空间程序,你可以把它看成是内核的一部分。也就是LKM没有任何保护,一不小心可能就会导致系统崩溃。

下面我来编写一个简单的内核模块,了解一下基本开发流程。

要想编译LKM,我们需要C编译器和Linux内核头文件:

Hello World内核模块代码(hello.c):

  • module_init定义了模块的入口函数,在模块加载insmoded时执行
  • module_exit定义了模块的退出函数,在模块卸载rmmoded时执行

创建用于编译内核模块的Makefile:

编译hello.c:

编写第一个Linux内核模块: Hello World

查看模块信息:

加载模块:

查看模块是否加载:

编写第一个Linux内核模块: Hello World

卸载模块:

查看printk输出的信息:

编写第一个Linux内核模块: Hello World

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注