块设备
块设备
在linux下,文件的缓存习惯性的称之为Page cache,而更低一个级的设备的缓存称之为Buffer cache。Page cache用于缓存文件的内容,和文件系统比较相关。文件的内容需要映射到实际的物理磁盘,这种映射关系由文件系统来完成;Buffer cache用于缓存存储设备块(比如磁盘扇区)的数据,而不关心是否有文件系统的存在(文件系统的元数据缓存在buffer cache中)
除了传统的Buffered IO可以比较自由的用偏移+长度的方式读写文件之外,mmap和Direct IO均有数据俺也对齐的要求,Direct IO还限制读写必须是底层存储设备块大小的整数倍

syscall read
下图为读磁盘文件read系统调用在内核的路径
重要数据结构
其中重要的数据结构包含struct request结构,该结构就是struct bio结构链表的封装
struct request_queue结构中包含了struct request链表的头,在request结构中包含了bio结构的头,bio结构中包含了bi_io_vec数组头,数组中每个元素描述了io操作中的一个段,bi_vcnt是段的总数。每个struct request代表一个请求,链表组成一个队列,存放到了struct request_queue中,最终传送的数据存放在bio_io_vec数组中的元素中,经过blk_rq_map_sg()函数将要传输的数据页映射成分散聚集struct scatterlist表 cbio和buffer指向第一个没有被传送的bio结构,每个bio都标识一个磁盘存储区标识符(存储区中的起始扇区号和扇区数)和一个或者多个描述与IO操作相关的内存区的段。即要读写设备的的磁盘扇区,与内存中数据的位置
1 | /** |
- 本文标题:块设备
- 本文作者:fanpengyusk
- 本文链接:https://fanpengyusk.github.io/posts/d671c50c/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!