前言
Linux 系统为应用程序提供了功能强大且容易扩展的 API,但在某些情况下,这还远远不够。与硬件交互或进行需要访问系统中特权信息的操作时,就需要一个内核模块。下面从 Hello World 模块来说明模块的建立与运行。
环境搭建
开始编写Linux内核模块之前,我们首先要准备一些工具。最重要的是,你需要有一台Linux机器,尽管可以使用任何Linux发行版,但本文中,我使用的是Ubuntu 16.04 LTS,如果你使用的其他发行版,可能需要稍微调整安装命令。
建立
1、创建目录
mkdir -p ~/src/lkm_example
2、跳转到模块目录下
cd ~/src/lkm_example
3、创建模块文本
touch lkm_example.c
4、编写文本
vi lkm_example.c
5、文本内容
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
模块分析
hello_init():模块加载
hello_exit():模块卸载
module_init(hello_init): hello_init 函数为模块加载角色
module_init(hello_exit):hello_exit 函数为模块卸载角色
printk():与 printf() 相似
MODULE_LICENSE:Hello Would 模块带有自由的许可证
KERN_ALERT:消息的优先级
编译
1、在当前目录下创建 Makefile 文件
touch Makefile
2、编写 Makefile 文件
vim Makefile
3、Makefile 文件内容
obj-m += lkm_example.o
all:
make -C /lib/modules/
(
s
h
e
l
l
u
n
a
m
e
−
r
)
/
b
u
i
l
d
M
=
(shell uname -r)/build M=
(shelluname−r)/buildM=(PWD) modules
clean:
make -C /lib/modules/
(
s
h
e
l
l
u
n
a
m
e
−
r
)
/
b
u
i
l
d
M
=
(shell uname -r)/build M=
(shelluname−r)/buildM=(PWD) clean
运行
1、make 指令
make
2、将 Hello World 模块加载到内核
sudo insmod lkm_example.ko
3、查询内核日志输出 printk 结果
sudo dmsge
内核日志输出结果
4、将 Hello World 模块从内核卸载
sudo rmmod lkm_example
5、查询内核日志输出 printk 结果
sudo dmsge
内核日志输出结果