之前实在看不懂Wiki上的入门讲解,现在跟着轩哥博客试着入门kernel

正向开发

hello world 开始

这里编译生成module.ko时会遇到一个报错

image-20210909185354811

这是因为函数原型和调用这个函数时产生了冲突,如参数类型不一样等

所以加上参数类型void就可以了

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

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_INFO "Hello, world!\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_INFO "Hello, exit!\n");
}

module_init(hello_init);
module_exit(hello_exit);

之后, 将module.ko加入内核模块,注意生成的模块名字不能以module命名,否则就会出现如下报错

image-20210909190445406

module改成helloworld就好了

1
2
3
4
5
6
KERNEL_DIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
helloworld-objs := hello.o
obj-m := helloworld.o
default:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules
1
2
3
4
5
6
7
8
9
10
11
12
dmesg | tail -n 1
[49780.637874] Hello, world!

$dmesg | tail -n 2
[49622.167231] module: module is already loaded
[49780.637874] Hello, world!

$sudo rmmod helloworld

$dmesg | tail -n 2
[49780.637874] Hello, world!
[50164.206571] Hello, exit!