使硬件工作的软件叫做driver
分为三大类:字符设备驱动,块设备驱动,网络驱动
主设备号:用来标识与设备文件相连的驱动程序。用来反映设备类型。
次设备号:用来区分驱动程序操作的是哪个设备。用来区分同类型的设备。
可以通过静态申请,动态分配两种方式来获取设备号。
静态申请:找一个没用的设备号,用register_chrdev_region函数注册设备号,优点是比较简单,缺点是驱动多了之后,容易冲突。
动态分配:alloc_chrdev_region分配设备号,方便进行驱动推广,但是无法在安装驱动之前创建设备文件,安装驱动之后,从/proc/devices中查询设备号。
注意在不用的时候,将设备号注销,unregister_chrdev_region
创建设备文件:可以使用mknod命令手工创建,也可以自动创建。
Mknod filename type major minor
字符设备驱动程序三种重要的数据结构:
(1)struct file虚拟文件数据结构
(2)struct inode物理设备
(3)struct file_operations 包括一些重要的数据结构
file_operations就是把系统调用和驱动程序关联起来的关键数据结构。这个结构的每一个成员都对应着一个系统调用。读取file_operation中相应的函数指针,接着把控制权转交给函数,从而完成了Linux设备驱动程序的工作,更加详细的介绍可以点击下面的链接,已经阐述的很清楚了。
file_operations具体含义
字符设备注册分三个步骤:
(1)分配cdev cdev_alloc
(2)初始化cdev cdev_init
(3)添加cdev cdev_add
实现设备所支持的操作,完成file_operations相应的函数。
用户空间的指针在内核空间不能直接使用,内核提供了专门的函数用于访问用户空间的指针。Copy_from_user和copy_to_user两个api进行转换。
调试技术:
(1) 打印调试 printk
(2) 调试器调试 kgdb
(3) 查询调试
参考链接:https://blog.csdn.net/szfhy/article/details/49619643