本文介绍最简单的Linux内核模块(Hello World!)的编译、装载和卸载的过程。


编写一个HelloWorld内核模块,并进行装载和卸载操作

Makefile文件

1
2
3
4
5
6
7
8
9
10
# Makefile 4.0
obj-m := my_module.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)

all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

my_module.c文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>

static int init lkp_init(void)
{
printk(KERN_INFO "Hello,kernel\n");
return 0;
}

static void
exit lkp_cleanup(void)
{
printk(KERN_INFO "Bye,kernel!\n");
}

module_init(lkp_init);// 注册模块
module_exit(lkp_cleanup);// 注销模块
MODULE_LICENSE("GPL"); //告诉内核该模块具有GNU公共许可证

编译、转载和卸载模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
hylee@ubuntu:~/Desktop/a$ ls
Makefile my_module.c
hylee@ubuntu:~/Desktop/a$ make
make -C /usr/src/linux-headers-5.3.0-42-generic M=/home/hylee/Desktop/a modules
make[1]: Entering directory '/usr/src/linux-headers-5.3.0-42-generic'
CC [M] /home/hylee/Desktop/a/my_module.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/hylee/Desktop/a/my_module.mod.o
LD [M] /home/hylee/Desktop/a/my_module.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.3.0-42-generic'
hylee@ubuntu:~/Desktop/a$ sudo insmod my_module.ko
hylee@ubuntu:~/Desktop/a$ lsmod | grep my_module
my_module 16384 0
hylee@ubuntu:~/Desktop/a$ sudo rmmod my_module
hylee@ubuntu:~/Desktop/a$ lsmod | grep my_module
hylee@ubuntu:~/Desktop/a$ dmesg

由于dmesg命令输出太多信息,所以就不贴出来了。printk函数打印的信息可以通过dmesg命令查看。

最后修改日期:2020年5月14日

留言

撰写回覆或留言