linux内核之块设备驱动图解
块设备驱动程序的分层结构 块设备驱动: 在Linux中,驱动对块设备的输入或输出(I/O)操作,都会向块设备发出一个请求,在驱动中用 request结构体 描述。但对于一些磁盘设备而言请求的速度很慢,这时候内核就提供一种队列的机制把这些 I/O请求 添加到队列中(即:请求队列),在驱动中用 request_queue结构体 描述。在向块设备提交这些请求前内核会先执行请求的合并和排序预操作,以提高访问的效率,然后再由内核中的 I/O调度程序子系统 来负责提交 I/O 请求,调度程序将磁盘资源分配给系统中所有挂起的块 I/O 请求,其工作是管理块设备的请求队列, 决定队列中的请求的排列顺序以及什么时候派发请求到设备 。 通用块层(Generic Block Layer): 负责维持一个I/O请求在上层文件系统与底层物理磁盘之间的关系。在通用块层中, 通常用一个bio结构体来对应一个I/O请求 。 Linux提供了一个 gendisk数据结构体 ,用来表示一个独立的磁盘设备或分区,用于对底层物理磁盘进行访问。在gendisk中有一个类似字符设备中file_operations的硬件操作结构指针,是 block_device_operations结构体 。 IO调度层: 当多个请求提交给块设备时,执行效率依赖于请求的顺序。如果所有的请求是同一个方向(如:写数据),执行效率是最大的