Linux设备驱动-块设备之块设备模型

块设备简介

块设备是i/o设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据,例如硬盘,U盘,SD卡等。块设备的主要特点是是,CPU和总线读写数据所花的时间与磁盘硬件的速度不匹配,块设备的平均访问时间很高,主要是因为磁盘控制器必须在磁盘表面将磁头移动到记录数据的确切位置。
Linux块设备处理程序的组织是相当复杂的,本章主要讲解Linux中块设备的模型,让读者对Linux中块设备的访问有一个总体的认识,后续会具体讲解其中的流程。

块设备结构

Linux中访问块设备在不同的阶段会涉及到不同的数据结构,例如虚拟文件系统是以块为单位大小访问文件的,而在通用块层又会将相邻的块合并为段,在块设备驱动中磁盘控制器又是以扇区为大小访问具体的块设备的。接下来着重讨论一下三种数据结构:

  • 扇区
    为了达到可接受的性能,硬盘和类似的设备每次都快速传输几个相邻字节的数据,我们称其为扇区。扇区是磁盘驱动器访问磁盘是的最小数据单元,如果一次访问的数据量小于一个扇区则补齐剩余空间,如果超过一个扇区大小,则需要将此次访问分割成多个扇区大小进行。因此扇区大小的选择也很重要,如果选择过小则会因为访问频繁而降低性能;扇区过大则会导致空间的浪费。Linux中默认扇区大小为512字节。因此,对于存放在磁盘上的数据是通过他们在磁盘上的位置来标识的,即数据所在的首个扇区标号和占用的扇区数目。

  • 扇区是硬件设备传输数据的基本单元,而块是虚拟文件系统传输数据的基本单元。块的大小必须是2的幂次,是扇区大小的倍数,且不能超过页的大小。块设备的大小不是唯一的,不同的磁盘文件系统拥有不同的块大小,用户访问磁盘数据时虚拟文件系统会根据具体的磁盘文件系统确定块大小,并调用磁盘文件系统相关函数进行数据的访问。

  • 段是块的整数倍且不超过页的大小。当用户空间提交多个磁盘数据访问请求时,如果访问的数据在磁盘上是相邻的,那么Linux内核会将这些块合并为段,这样就可以提高磁盘的IO性能。

扇区、块和段三者的关系如下图所示:

图1 扇区、块和段三者的关系

块设备模型

Linux中块设备模型如下图所示:

图2 Linux块设备IO模型
  1. 用户空间调用read系统调用
  2. read系统调用服务例程调用虚拟文件系统VFS函数,该函数确认数据是否在磁盘告诉缓存中(假设不在高速缓存中)
  3. 映射层根据VFS层传递的信息确定数据在磁盘上的位置信息,并提交给通用块层
  4. 通用块层检查能否合并相关块生成段,并创建bio结构,通过generic_make_request提交请求给IO调度层
  5. IO调度层根据一定的策略决定当前需要相应的request请求,并提交给块设备驱动
  6. 块设备驱动程序以扇区为大小从磁盘中读取数据

你可能感兴趣的:(linux驱动)