字符设备驱动程序
结合scull实例穿插着来讲.
scull实例: Simple Utility for Loading Localities
scull: 一个操作内存区域的字符设备驱动程序. 这片内存区域就相当于一个设备. scull作为学习实例的优点: 它不和硬件相关,只是操作从内核中分配的一些内存. scull作为学习实例的缺点: scull做不了任何有用的事(除了展示内核和字符设备驱动程序之间的接口, 或让用户运行某些测试例程)
graph LR
device(设备)<-->deviceDriver(设备驱动程序)<-->userProgram(用户程序)
设备驱动程序:未用户程序提供了能力(机制) 设备: scull所使用的内存区域 设备驱动程序: 待实现
注: 一块内存区域, 是可以随机存取的, 也可进一步划分围殴多个区块. 注: 由于这里的设备是一块内存区域, 则它既可以看作顺序存取设备, 也可看做随机存取设备;既可看作一个设备, 也可看作多个(不多/相同类型的)设备.
scull源代码将用到的内存区域实现为多个(多种)设备, 每个模块实现的每种设备都是一种类型.
scull0~scull3设备: 4个全局且持久的设备/内存区域
全局: 设备被多次打开, 则通过打开的文件描述符, 可共享设备数据. 持久: 设备关闭后再开启, 则其中数据不会丢失.
scullpipe0~scullpipe3设备: 4个FIFO设备(先入先出设备) /管道类似 多进程同时读同一设备, 会发生数据竞争. 竞争解决: 实现阻塞式读写与非阻塞式读写(有别于终端处理方式)
而中断处理方式, 是使用硬件中断, 与设备同步的.
scullsingle设备: 全局且持久设备, 但一次只允许一个进程使用此设备. scullpriv设备: 全局且持久设备, 但对每个虚拟控制台(或者X终端会话)私有, 每个控制台/终端使用不同地址. sculluid设备: 全局且持久设备, 可多次打开, 但只能由一个用户打开. scullwuid设备: 全局且持久设备, 但是阻塞式打开,且只能由一个用户打开. 上面scullsingle,scullpriv,sculluid,scullwuid这四种设备都是对open方式有一些限制.
Linux设备文件,主次设备号与设备驱动程序
graph LR
deviceDriver(设备驱动程序)-->deviceNum(主次设备号)-->deviceFile(设备文件/设备)
设备文件通常在/dev
目录下.(Linux除少数特例外,一切皆文件). 命令ls -l /dev
结果有两列数字,标识了设备主次设备号. 主设备号标识了对应的驱动程序
发表回复