Linux内核通用块设备层深度解析

需积分: 30 3 下载量 10 浏览量 更新于2024-07-18 收藏 804KB PDF 举报
"本文主要介绍了Linux内核中的通用块设备层(Kernel General Block Layer),讲解了块设备驱动的相关概念和工作流程,包括扇区、块、段等基本概念,以及缓冲区、bio结构体及其作用。同时,文章详细阐述了通用块设备层如何处理I/O请求,包括磁盘和磁盘分区的表示、读写类型、请求提交过程等关键步骤。" Linux通用块设备层是内核中的核心组件,负责抽象底层硬件设备,提供统一的接口供上层文件系统和其他系统组件使用。这一层的主要任务是管理I/O请求,优化数据传输,并协调与具体块设备驱动的交互。 1. **概述** 内核在处理块设备上的I/O请求时,通常经过VFS(虚拟文件系统层)、映射层到通用块设备层。当进程发起read()系统调用时,VFS检查数据是否在缓存中,若不在则由映射层确定数据在设备上的位置,然后通过通用块设备层进行实际的读取操作。 2. **块设备相关概念** - **扇区(Sectors)**: 扇区是磁盘上最小的可寻址单位,通常为512字节。 - **块(Blocks)**: 块是文件系统级别的逻辑单位,通常大于或等于扇区,以便更高效地管理存储空间。 - **段(Segments)**: 在某些上下文中,段可能是指I/O请求中连续的扇区集合。 3. **通用块设备层** - **缓冲区和缓冲区头**: 缓冲区用于存储磁盘上的数据,而缓冲区头则是管理这些缓冲区的数据结构,包含有关缓冲区状态和位置的信息。 - **bio结构体**: bio(Block I/O)结构体代表了一个或多个连续的扇区,用于组合成I/O请求。它包含了I/O操作的源或目标地址和大小等信息。 - **缓冲区头和bio结构体比较**: 两者都用于I/O操作,但缓冲区头更专注于单个缓冲区的管理,而bio结构体关注的是多个扇区的连续操作。 4. **通用块设备层对请求的处理** - **磁盘和磁盘分区的表示**: 系统通过设备文件来表示磁盘和分区,如/dev/sda1表示第一块IDE硬盘的第一个分区。 - **向通用块设备层发送请求** - **读写类型**: 包括读取和写入操作,通过特定的系统调用如read()和write()触发。 - **ll_rw_block()**: 这是启动读写操作的关键函数,它将请求添加到请求队列中。 - **submit_bh()**: 用于提交缓冲区头到I/O调度器,是I/O操作的起点。 - **generic_make_request()** 和 **__generic_make_request()**: 这两个函数处理请求的创建和提交,进一步将请求分解为适合硬件处理的格式。 整个流程中,通用块设备层扮演了中间人的角色,它接收来自VFS的请求,根据设备特性进行适当的转换,然后传递给具体的块设备驱动去执行实际的I/O操作。通过这种方式,内核实现了对不同硬件设备的统一管理和高效利用。