前言
环境:openeluer
内核:5.10.0+
代码参考:
通过网盘分享的文件: 链接: https://pan.baidu.com/s/14-4XSjm-wvpqxdWcGoXXvw?pwd=9gj7 提取码: 9gj7 复制这段内容后打开百度网盘手机App,操作更方便哦
内核模块相关的基本工具与信息
- lsmod:查看内核模块
- insmod:加载内核模块
- rmmod:卸载内核模块
一、hello驱动
在linux中,驱动本身不加载进内核的话就只是个模块,模块加载进内核后,才能被内核调用,所以,我们先编写一个最简单的hello驱动来验证一下
1 | // hello.c |
其中,
module_init()
和module_exit()
是内核模块的初始化和卸载函数__init
和__exit
是内核模块的初始化和卸载函数的宏定义MODULE_AUTHOR()
是模块作者的宏定义,MODULE_LICENSE()
是模块许可证的宏定义,MODULE_DESCRIPTION()
是模块描述的宏定义
1 | # Makefile |
运行make
生成模块文件hello.ko
运行insmod hello.ko
加载模块
接着lsmod | grep hello
查看模块是否加载成功
用dmesg
能看到末尾有输出了我刚刚在hello_init()
中打印的Hello world! I am Akira
信息,模块加载成功
最后用rmmod hello
卸载模块,重新运行dmesg
,就能看到hello_exit()
中输出Hello world! Akira exit
恭喜你,完成了第一个驱动的编写与加载!