使硬件工作的软件叫做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
字符设备注册分三个步骤:
(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) 查询调试
实验步骤:
将测试driver编译进内核,内核启动的过程中通过“mknod xxx c 2540”的方式创建设备文件,测试ok.
Study1圆满结束。