Linux内核模块编程
编程环境
Ubuntu 16.04 LTS
什么是模块
内核模块的全称是动态可加载内核模块(Loadable Kernel Modul,KLM),可以动态载入内核,让它成为内核代码的一部分。
一个模块一般由一组函数和数据结构组成。
如何编写最简单的Hello World模块
- 首先要创建一个工作目录,取名叫hello,在命令行输入如下命令
mkdir hello
cd hello
- hello.c代码如下:
#include<linux/module.h> //每个模块都要包括的头文件
#include<linux/kernel.h> //用到了printk()函数
#include<linux/init.h>
MODULE_LICENSE("GPL"); //没有指定license会出现error
static int hello_init(void) //static使得该文件以外无法访问
{
printk(KERN_ALERT "Hello World\n"); //只能使用内核里定义好的C函数,printk会根据日志级别将指定信息输出到控制台或日志文件中,KERN_ALERT会输出到控制台
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye World\n");
}
module_init(hello_init);
module_exit(hello_exit);
- Makefile代码如下:
obj-m := hello.o
KERNEL_DIR := /lib/modules/$(shell uname -r)/build #指定内核源码
PWD := $(shell pwd) #指向当前目录
all:
make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
make -C $(KERNEL_DIR) M=$(PWD) clean
检验模块工作情况
在命令行输入:
modinfo hello.ko #modinfo用来查看模块信息
insmod hello.ko #加载模块
lsmod #查看已经载入的模块,看看有没有hello!
dmesg #如果成功应该可以看到最后一行输出了hello world
rmmod hello #卸载模块