手把手教你Linux字符设备驱动实例
globalmem
看 linux 设备驱动开发详解时,字符设备驱动一章,写的测试代码和应用程序,加上自己的操作,对初学者我觉得非常有帮助。
写这篇文章的原因是因为我看了我之前发表的文章,还没有写过字符设备相关的,至于里面提到的结构体的作用,有很多详细的文章说明,我就不做更深的叙述。
代码在github上,点击下面阅读原文可以直达
https://github.com/weiqifa0/globalmem/blob/main/README.md
把这部分放在github上也有好处,后续可以增加删除一些东西,以后自己需要使用的时候也方便许多。
我们讨论字符设备驱动,就有必要知道他的结构体和头文件,像一些后来的封装什么的,大部分还是脱离不了操作这个结构体里面的东西。

加载内核模块insmod globalmem.ko 错误需要的修改。
insmod: can't insert 'globalmem.ko': Device or resource busy
出错的原因:
模块使用的是静态分配设备号的方式,而这个设备号已经被系统中的其他设备所占用。查看未被占用的设备号,需要到pro/devices下面去查看。
查看设备号的方法:
# cat /proc/devices
【文章福利】小编推荐自己的Linux内核技术交流群:【749907784】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)


编译内核版本
加载模块之后使用lsmod查看模块
创建设备文件节点
使用mknod创建设备节点的时候,后面跟上的参数需要跟我们在/proc/devices下面看到的对应,也就是我们在驱动里面申请的主设备号。
使用命令读写设备文件
Linux 下的 echo 和cat 命令是十分有用,这两个命令可以让在不写代码的情况下就可以完成调试读写设备。
通过代码来读写设备文件
代码在下面阅读原文的链接里面。
使用传入参数设置主设备号
内核模块参数我觉得是一个比较冷门的知识点,冷门的原因是因为我们在做项目的时候很少使用这个参数,但是实际上这个参数非常有用。
我们可以把内核模块当做main函数,main函数是可以接收传参的,内核模块也可以在加载的时候接收传入的参数。
如下是把主设备号传给内核模块,但是需要注意,这个主设备号不能被占用了。
增加自动创建设备节点的驱动文件
每次手动创建设备文件节点总是很麻烦,而且在实际编写设备驱动的时候,不会出现自己手动创建设备节点这种低端的操作。
当然了,聪明的内核提供了接口让我们在注册驱动的时候也把设备文件节点注册上去。
具体代码可以查看globalmem2.c里面的代码。
使用lseek操作文件位置
具体对应的文件是app-main2.c
原文作者:嵌入式Linux
