目录
一、Linux哲学
二、如何把字符设备抽象成文件
三、硬件层原理
四、驱动层原理
五、文件系统原理
一、Linux哲学
一切皆文件
二、如何把字符设备抽象成文件
open函数,在文件系统中找到指定文件的操作接口,绑定到进程task_struct->file_struct->fd_array[]->file_operations
思路:
把底层寄存器配置操作放在文件操作接口里面,新建一个文件绑定该文件操作接口,应用程序通过操作指定文件来设置寄存器。
三、硬件层原理
基本接口实现
- 查原理图,数据手册,确定底层需要配置的寄存器
- 类似裸机开发
- 实现一个文件的底层操作接口,这是文件的基本特征
struct file_operations
/home/geralt/linux_driver/kernel/ebf_linux_kernel_6ull_depth1/include/linux/fs.h
四、驱动层原理
把file_operations文件操作接口注册到内核,内核通过主次设备号来登记记录它(这是因为文件操作接口是我们自己构建出来的,内核并不知道)
- 构造驱动基本对象,struct cdev,里面记录具体的file_operations
cdev_init()
- 两个hash表(避免不同的设备出现冲突)
chrdevs:登记设备号
_register_chrdev_region()
cdev map->probe:保存驱动基本对象struct cdev
cdev_add()
五、文件系统原理
mknod指令+主从设备号
- 构建一个新的设备文件(系统层完成)
- 通过主次设备号在cdev_map中找到cdev->file_operations
- 把cdev->file_operations绑定到新的设备文件中
到这里,应用程序就可以使用open()、write()、read()等函数来控制设备文件了。