之前实在看不懂Wiki上的入门讲解,现在跟着轩哥博客试着入门kernel
正向开发
从hello world 开始
这里编译生成module.ko时会遇到一个报错
这是因为函数原型和调用这个函数时产生了冲突,如参数类型不一样等
所以加上参数类型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命名,否则就会出现如下报错
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!
|