块设备
- 设备文件通常分为两大类型:块设备和字符设备。块设备指的是可以随机访问固定大小数据片的硬件设备,例如硬盘,软盘,闪存等。字符设备指的是以字符流方式被访问的硬件设备,比如键盘,串口和网卡。
- 块设备的管理要比字符设备细致复杂得多,因为字符设备仅仅需要控制一个位置—当前位置,而块设备访问的位置可以在介质的不同区间前后移动。所以内核提供了一个专门的子系统来管理块设备,被称为块IO层。
- 块设备中最小的可寻址单元是扇区,扇区大小一般是2的整数倍,比如最常见的大小为512字节。扇区的大小是设备的物理属性,块设备无法对比扇区还小的单元进行寻址和操作。
- 块是文件系统的一种抽象,内核执行的所有磁盘操作都是按照块进行的。由于扇区是设备的最小可寻址单元,所以块不可能比扇区还小,同时内核要求块大小是2的整数倍,且不能超过一个页的长度。
缓冲区和缓冲区头
- 当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于磁盘块在内存中的表示。
- 每个缓冲区都有一个对应的描述符,存储缓冲区相关的控制信息和缓冲区到物理内存的映射关系,该描述符用buffer_head结构体表示,称作缓冲区头。
- b_state域表示缓冲区的状态,b_count域表示了缓冲区的引用计数,与该缓冲区对应的磁盘物理块由b_blocknr域索引,其值为b_bdev域指明的块设备中的逻辑块号。
- 与缓冲区对应的内存物理页为b_page域,b_data域直接指向对应的块,块的大小由b_size域表示。
bio结构体
- 内核为块IO操作引入了一种新型的,灵活的,轻量级容器,即bio结构体。该结构体表示了正在现场的(活动的)以片段(segment)链表形式组织的块io操作。
- 一个片段就是一小块连续的内存缓冲区,这样使得即使一个缓冲区的数据分散在多个离散的内存上,bio结构体也能对内核保证IO操作的执行。
- bio结构