ubuntu下的driver编译环境构建以及第一个字符驱动:helloworld
ubuntu下是可以进行一些驱动开发和调试的,编译driver所依赖的kernel header其实Ubuntu也是有提供的。
一、安装kernel header:
1.1获取Ubuntu的内核版本号:
uname -r
我这里的运行结果:
5.4.0-42-generic
1.2 安装
那么,直接安装对应的kernel header就可以执行如下命令:
sudo apt install linux-headers-`uname -r`
安装成功后,可以分别在/usr/src和/lib/modules/下找到对应内核版本号的目录:
如我这里就是:
/lib/modules/5.4.0-42-generic
/usr/src/5.4.0-42-generic
二、makefile
makefile是很重要的一个环节,配置如下:
obj-m += char_hello.o CURRENT_PATH:=$(shell pwd) LINUX_KERNEL_PATH:=/lib/modules/$(shell uname -r)/build all: $(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules clean: $(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
三、字符驱动:hello world
#include <linux/init.h> #include <linux/module.h> int hello_init(void) { printk("Hello, world\n"); return 0; } void hello_exit(void) { printk("Goodbye, Hello world\n"); } module_init(hello_init); module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("bigcatio");
MODULE_DESCRIPTION("A good start");
MODULE_VERSION("0.0.1");
执行make命令后,即可在目录下产生char_hello.ko,再执行sudo insmod char_hello.ko即可加载好第一个字符驱动。
sudo insmod char_hello.ko
此时,在终端里并不会看到hello world的信息。需要再执行如下命令:
sudo dmesg -c
结果如下:
[ 1326.583627] Hello, world [ 1326.583673] Hello, world
此外还可以执行命令modinfo char_hello.ko来查看ko中的相关信息。
modinfo char_hello.ko
结果如下:
filename: /home/bcc/coding_bigcatio/driver_build_under_ubuntu/./char_hello.ko version: 0.0.1 description: A good start author: bigcatio license: GPL srcversion: 8636B623A76BDC7801FFE25 depends: retpoline: Y name: char_hello vermagic: 5.4.0-53-generic SMP mod_unload