信盈达——您身边的嵌入式培训专家!

网校课堂 协同育人 学员论坛 加入收藏

从0开始学Linux驱动开发

时间:2019-10-09 17:53:58 来源:信盈达 作者:信盈达

Linux下的驱动是使用C语言进行开发的,但是和我们平常写的C语言也有不同,因为我们平常写的C语言使用的是Libc库,但是驱动是跑在内核中的程序,内核中却不存在libc库,所以要使用内核中的库函数。
linux驱动培训
比如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文件就是内核模块文件
学Linux驱动开发
加载驱动到内核

需要使用到的一些系统命令:

lsmod: 查看当前已经被加载的内核模块

insmod: 加载内核模块,需要root权限

rmmod: 移除模块

linux驱动培训靠谱吗,信盈达2008年在深圳特区南山高新科技园成立。自成立至今近十年来专注为企业和个人提供高端方案设计、高端嵌入式/物联网等服务。公司下设信盈达实训学院、信盈达研发中心、信盈达教学仪器三大业务板块。九年来公司坚持"技术领先、服务领先",以雄厚的实力和专业的品质成为国内唯一有实力从产品最底层研发到系统层开发的嵌入式实训、产品解决方案提供商。为中国IT行业提供最具价值的职业教育服务。专业培训嵌入式、物联网、人工智能、Java、单片机等课程,想了解更多信息点击立马咨询。
Copyright 2016-2020 信盈达 粤ICP备09072292