块设备的特点在于可以被随机访问,即在访问设备时随意地从一个位置跳转到另一个位置。
块设备中最小的可寻址单元是扇区(sector),扇区的大小是设备的物理属性。扇区对于内核的重要性在于所有设备的I/O操作都必须基于扇区来进行。软件的最小逻辑可寻址单元---块,(比扇区高一层的抽象)。块是文件系统的一种抽象---只能基于块来访问文件系统。块不能比扇区还小,只能数倍于扇区大小。
每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示。用buffer_head结构体表示,被称为缓冲区头。它的目的在于描述磁盘块和物理内存缓冲区(在特定页面上的字节序列)之间的映射关系,只是扮演一个描述符的角色,说明从缓冲区到块的映射关系。
内核中块操作的基本容器由bio结构体表示,该结构体代表了正在现场的(活动的)以片段链表形似组织的块I/O操作,一个片段是一个小块连续的内存缓冲区。向量I/O就是所谓的聚散I/O.bio结构体代表的是I/O操作,它可以包括内存的一个或多个页,而buffer_head代表的是一个缓冲区,它描述的仅仅是磁盘的一个块,关联的是单独页中的单独磁盘块。bio很容易处理高端内存,它处理的是物理页而不是直接指针;也便于执行飞散-集中(向量化)块I/O操作,操作中的数据可取自多个物理页面。
块I/O请求保存在请求队列中,该队列由request_queue结构表示,只要它不为空,队列对应的块设备驱动程序就会从队列头获取请求,然后将其送入对应的块设备。队列中的每一项都是一个单独的请求(用request结构体表示)。一个请求可能要操作多个连续的磁盘块,所以每个请求可以有多个bio结构体组成。
在内核中负责提交I/O请求的子系统被称为I/O调度程序。虚拟块设备给多个磁盘请求,以便降低磁盘寻址地址,确保磁盘性能的最优化。