Linux文件存储与访问机制解析
1. 页面缓存中的块存储
在Linux系统中,虚拟文件系统(VFS)、映射层和各种文件系统会将磁盘数据分组为逻辑单元,即“块”。在早期的Linux内核版本中,存在两种主要的磁盘缓存:页面缓存和缓冲区缓存。页面缓存用于存储磁盘文件内容访问产生的整个页面的磁盘数据,而缓冲区缓存则用于在内存中保存VFS访问以管理基于磁盘的文件系统的块内容。
从稳定版本2.4.10开始,缓冲区缓存实际上已不再存在。为了提高效率,块缓冲区不再单独分配,而是存储在称为“缓冲页”的专用页面中,这些缓冲页保存在页面缓存中。形式上,缓冲页是与称为“缓冲区头”的附加描述符相关联的数据页,其主要目的是快速定位页面中每个单独块的磁盘地址。因为存储在页面缓存中的页面的数据块在磁盘上不一定是相邻的。
1.1 块缓冲区和缓冲区头
每个块缓冲区都有一个类型为buffer_head的缓冲区头描述符。该描述符包含内核处理块所需的所有信息,因此在对每个块进行操作之前,内核会检查其缓冲区头。缓冲区头的字段如下表所示:
| 类型 | 字段 | 描述 |
| ---- | ---- | ---- |
| unsigned long | b_state | 缓冲区状态标志 |
| struct buffer_head * | b_this_page | 指向缓冲页列表中的下一个元素的指针 |
| struct page * | b_page | 指向包含此块的缓冲页描述符的指针 |
| atomic_t | b_count | 块使用计数器 |
| u32 | b_size | 块