Linux2.6块设备驱动程序
一、块设备的操作的处理体系结构
1.VFS(虚拟文件系统)
VFS位于块设备的处理体系结构的上层,提供一个通用的文件模型。VFS和块设备的关系见Linux2.6设备管理
系统调用的服务例程调用一个合适的VFS函数,将文件描述符和文件内的偏移量传递给它。
2.磁盘高速缓存
VFS函数确定所请求的数据是否已经存在磁盘高速缓存中,若存在,就没有必须访问磁盘上的数据了。
3.映射层(块设备文件系统)
(1)把文件拆分成大小相同的块,每一个块都有一个逻辑号
(2)访问文件的磁盘节点,根据每一块的逻辑块号,确定这块数据的在磁盘上的位置
4.通用块层
(1)内核利用通用块层启动I/O操作来传送所请求的数据。
每个I/O操作只针对一组连续的块,由一个bio结构描述
由于所请求的数据不一定在相邻的块中,所以可能启动多次I/O操作
(2)gendisk是一个由通用块层处理的逻辑块设备。
通常一个gendisk对应一个硬件块设备,如硬盘、软盘、光盘。
gendisk也可以是一个虚拟设备,建立在几个磁盘分区之上
不管理gendisk是什么,借助于通用块层提供的服务,可以以同样的方式工作在所有的gendisk上。
(3)向通用块层提交一个I/O请求的通用操作
分配一个新的bio描述符,并初始化
获取与gendisk相关的块设备驱动程序的请求队列q
将bio插入q队列
5.I/O调度程序层
(1)当内核组件要读写一些磁盘数据时,创建一个块设备请求。请求中描述所请求的扇区和操作类型
(2)通过I/O调度策略(见(4)),把物理介质上相邻的数据请求聚在一起,减少不必须的寻道时间,提高效率
当请求传送一个新的数据块时,内核检查能否通过稍微扩展前一个处于等待状态的请求而满足要求
(3)每个块设备驱动程序都维持着自己的请求队列,对每个队列上单独执行I/O调度,可以提高磁盘的性能。
(4)I/O调度策略
预期算法:是最后期限算法的演变,最后期限算法中读的优先级较高,而预期算法写的优先级更高
最后期限算法:电梯策略可能会对某个请求忽略很长一段时间,最后期限算法保证这些请求得到满足
完全公平队列算法CFQ:确保在触发I/O请求的所有进程中公平分配磁盘的I/O带宽,通常把同一进程的请求放插入同一队列
Noop算法:没有排序队列,简单的FIFO后LIFO
电梯算法:优先处理与上一个所处理的请求最近的要求
6.块设备驱动程序
驱动程序向磁盘控制器发送适当的命令,进行实际的数据传输。
一个驱动程序可能处理几个块设备
每个块设备驱动程序都维持着自己的请求队列
7.硬件设备
二、数据管理的基本单位
1.扇区
扇区是硬件设备传送数据的基本单位。
扇区大小是512KB
2.块
块是VFS文件系统、映射层传送和存储数据的基本单位。文件和磁盘都被看作拆分成几个块。
块的大小必须是2的幂,不超过一个页框,是扇区大小的整数倍
块的大小不是唯一的,比如:512、1024、2048、4096
同一个磁盘上的几个分区可能使用不同大小的块
3.段
段是块设备驱动程序传输数据的单位
一个段是一个内存页或内存页的一部分,它包含磁盘上相邻的扇区
4.页
硬件高速缓存作用于磁盘数据上的页,每页正好装在一个页框中
5.扇区、块、段、页
扇区 | 512B | 硬件传送数据的基本单位 |
块 | 大小是2的幂 不超过一个页框 是扇区的整数倍 |
VFS、文件系统、映射层的传送和存储数据的基本单位 |
段 | 几个相邻的扇区 | 驱动程序处理数据的基本单位 |