联系方式

咨询热线:400-998-6158

点击此处免费预约试听课程»

常见问题
学习资讯
师资介绍
学习资讯

从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

相关课程