第一个驱动程序
1、编写驱动程序
##############hello.c############
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_ALERT"Hello World!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT"Goodbye World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
2、编写Makefile
obj-m:=hello.o
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
$(shell uname -r)
来代替你的内核版本uname -r
查看内核版本- Makefile与上面的hello.c在同一文件夹,我给他们建了一个drvhello目录
M=$(PWD)
指定的是hello.c与Makefile所在的目录
3、在drvhello目录下 sudo make
make后生成一些文件,其中有我们非常想看到的模块目标文件hello.ko
过程:先进入Linux内核所在目录,并编译出hello.c文件,然后创建模块,运行MODPOST生成临时文件hello.mod.c文件,而后根据此文件编译出hello.mod.o,之后连接hello.o和hello.mod.o文件得到模块目标文件hello.ko,最后离开Linux内核所在的目录——某本书
4、sudo insmod hello.ko
情况一:成功
dmesg
查看结果,可以看到Hello World!的输出
情况二:失败
insmod: ERROR: could not insert module hello.ko:Operation not permitted
- 检查自己是否是在root超级用户下加载驱动模块
- 先dmesg -c 把显示开机信息清除掉,再insmod hello.c查看错误。
- 如果出现
Lockdown: insmod: unsigned module loading is restricted; see man kernel_lock7
的错误 - 可能是你的secure boot的问题。那么请把你的BIOS的secure boot关了谢谢 。
- 如果是
open file error
错误,检查自己所要打开的文件是否存在。
5、rmmod hello.ko
卸载模块: