联系方式
学习资讯
从0开始学Linux驱动开发
Linux下的驱动是使用C语言进行开发的,但是和我们平常写的C语言也有不同,因为我们平常写的C语言使用的是Libc库,但是驱动是跑在内核中的程序,内核中却不存在libc库,所以要使用内核中的库函数。
比如printk可以类比为libc中的printf,这是在内核中定义的一个输出函数,但是我觉得更像Python里面logger函数,因为printk的输出结果是打印在内核的日志中,可以使用dmesg命令进行查看
linux驱动培训靠谱吗,驱动代码只有一个入口点和一个出口点,把驱动加载到内核中,会执行module_init函数定义的函数,在上面代码中就是hello_init函数。当驱动从内核被卸载时,会调用module_exit函数定义的函数,在上面代码中就是hello_exit函数。
上面的代码就很清晰了,当加载驱动时,输出Hello World,当卸载驱动时,输出Goodbye World
PS:MODULE_LICENSE和MODULE_AUTHOR这两个不是很重要,我又不是专业开发驱动的,所以不用关注这两个
PSS: printk输出的结果要加一个换行,要不然不会刷新缓冲区
编译驱动
驱动需要通过make命令进行编译,Makefile如下所示:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KERN_DIR ?= /usr/src/linux-headers-$(shell uname -r)/
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERN_DIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
一般情况下,内核的源码都存在与/usr/src/linux-headers-$(shell uname -r)/目录下
比如:
$ uname -r
4.4.0-135-generic
/usr/src/linux-headers-4.4.0-135/ --> 该内核源码目录
/usr/src/linux-headers-4.4.0-135-generic/ --> 该内核编译好的源码目录
而我们需要的是编译好后的源码的目录,也就是/usr/src/linux-headers-4.4.0-135-generic/
驱动代码的头文件都需要从该目录下进行搜索
M=$(PWD)该参数表示,驱动编译的结果输出在当前目录下
较后通过命令obj-m := hello.o,表示把hello.o编译出hello.ko, 这个ko文件就是内核模块文件
加载驱动到内核
需要使用到的一些系统命令:
lsmod: 查看当前已经被加载的内核模块
insmod: 加载内核模块,需要root权限
rmmod: 移除模块
更多培训课程,学习资讯,课程优惠等学校信息,请进入 南宁信盈达嵌入式培训学院 网站详细了解,免费咨询电话:400-998-6158