最近看了篇编写Linux驱动的文章,觉得不错,于是自己动手试了试,这里记录一下以便以后查阅
1 | ./+o+- root@linux |
编写hello world模块代码
在内核源码driver目录创一个hello_driver
的目录,并分别创建hello_kernel.c、Kconfig、Makefile三个文件
hello_kernel.c代码如下:
1 | #include<linux/kernel.h> |
这里使用内核根目录下的Makefile进行编译,所以这个例程的Makefile非常简单。
Makefile代码如下:
1 | obj-$(CONFIG_HELLO_KERNEL) += hello_kernel.o |
Kconfig代码如下:
1 | menu "hello_driver" |
menu:配置选项的菜单
config:要配置的参数
tristate:表示有三种状态可配置,M以模块编译,×编译成.o
default:默认配置,有y,n,还可以写模块(y if xxmod)
help:提示信息,可以自由添加
Kconfig配置有很多,可以copy其他配置多尝试,然后make menuconfig看效果
修改内核配置文件
- 打开内核源码drivers目录的Kconfig,在endmenu上面添加
source "drivers/hello_driver/Kconfig"
在内核源码根目录执行make menuconfig
进入Device Drivers,移动到最下面可以看到添加的选项
按回车进入,空格键进行配置
编译前还需要修改内核驱动目录Makefile文件
因为是使用内核源码进行编译,所以需要将新增的
hello_driver
目录添加到内核源码drivers的Makefile里编译内核代码
内核跟目录下执行make -j4,生成驱动模块
1 | root@linux:/zdisk/linux-5.0.6/drivers/hello_driver# ls |
验证结果
为了方便,这里手动加载/卸载驱动文件,insmod hello_kernel.ko/rmmod hello_kernel.ko
输入dmesg,查看日志,有打印hello_driver.c中的字符串。