当进程通过系统调用(如 read )请求读取文件,操作系统会分配文件描述符,作为后续文件操作标识。进程 task_struct 中的 mm_struct 负责管理虚拟地址空间,在读取文件时,它协调虚拟地址空间分配,为文件内容预留区域,维护空间布局与状态。
针对每个文件,内核创建一个或多个 vm_area_struct ,描述文件在进程虚拟地址空间的映射区域,包含起始与结束地址、访问权限及指向文件 inode 的指针。内核会尝试合并相邻且属性相同的 vm_area_struct(如相同权限、同一文件映射),以减少内存碎片。反之,若某区域的权限变更(如 mprotect),可能触发分割。若文件较大,可能映射到多个不连续区间,每个区间对应一个 vm_area_struct ,方便进程定位和访问文件内容。 每个文件关联一个 address_space 结构体,它管理文件在内存中的数据缓存。文件数据以页为单位读入内存页高速缓存( page_cache ), address_space 跟踪页面状态,如脏页标记,以便后续数据回写磁盘。其 radix tree root 的 page tree 与 page_cache 关联,可访问具体页面物理地址。address_space 的 a_ops->writepage 定义脏页回写策略,由后台线程(如 pdflush)定期触发或通过 fsync 强制同步。
操作系统通过 inode 获取文件磁盘位置,利用块设备驱动程序向磁盘发读取请求,磁盘控制器将数据读入内部缓冲区,再通过直接内存访问(DMA)技术传输到内核空间缓冲区(大文件常用 DMA,文件过小时开启 DMA 消耗大于 CPU 处理,一般不使用。用户一般无法控制 DMA 开启,但可修改 /sys 文件系统中设备相关参数调整 DMA 缓冲区大小等,操作不当可能影响系统稳定性)。内核将数据存入页高速缓存, address_space 记录页面位置并建立与文件磁盘位置的映射, vm_area_struct 也更新信息,确保进程通过虚拟地址访问缓存文件页面。若进程请求数据在页高速缓存,内核直接将数据从内核空间拷贝到用户空间缓冲区;若不在,则重复从磁盘读取步骤。
文件被进程打开时,起初不在内存,通过 I/O 操作读入。 page_cache 以页为单位管理, address space 管理缓存信息。 address_space 中的 i_mmap 字段以红黑树管理文件与进程虚拟地址空间的映射关系。无论进程通过 read 等常规调用还是 mmap 等内存映射方式访问文件, i_mmap 都记录文件各部分在进程虚拟地址空间的起始、结束地址及映射属性。msync 系统调用允许进程显式同步内存映射的修改到文件,确保数据持久化。当多个进程映射同一文件时,共享映射的修改通过页缓存的写回机制对其他进程可见,私有映射则通过写时复制隔离修改。进程访问文件内容时,内核依据 i_mmap 映射信息定位内存对应部分,即便文件以多页面存储, i_mmap 也能高效管理映射,助力进程访问。在内存回收和文件写回磁盘时, i_mmap 记录的信息协助内核判断内存区域所属及使用进程,保障内存管理和文件操作正确高效。
一、核心组件关系
进程管理
task_struct
:包含mm_struct
管理虚拟地址空间。mm_struct
:协调虚拟地址分配,维护空间布局与状态。虚拟内存映射
vm_area_struct
:描述文件在进程虚拟地址空间的映射区域,包含起始 / 结束地址、权限、vm_file
指针(指向文件inode
)。- 合并与分割:相邻且属性相同的
vm_area_struct
会被合并以减少碎片;权限变更(如mprotect
)可能触发分割。文件缓存管理
address_space
:管理文件页缓存,通过基数树page_tree
索引物理页,维护脏页标记、回写策略(a_ops->writepage
)。i_mmap
红黑树:记录所有映射该文件的vm_area_struct
,支持快速查找与同步。二、文件读取流程
系统调用与描述符分配
- 用户调用
read
触发系统调用,内核分配文件描述符,通过task_struct->files
管理。虚拟地址空间准备
mm_struct
为文件内容预留区域,创建或复用vm_area_struct
映射文件。页缓存查找与填充
- 缓存命中:直接从
address_space.page_tree
获取页数据,拷贝到用户缓冲区。- 缓存未命中:
- 通过
inode
块指针定位磁盘块,触发磁盘读取。- 数据通过 DMA 传输到内核缓冲区(大文件常用,小文件可能跳过 DMA)。
- 填充页缓存,更新
address_space
状态(如脏页标记)。三、内存映射机制
共享与私有映射
- 共享映射:多个进程共享同一文件映射,修改通过页缓存回写可见。
- 私有映射:写时复制(COW)隔离修改,不影响其他进程。
同步控制
msync
:显式同步内存映射修改到文件。- 后台线程(如
pdflush
)定期回写脏页,或通过fsync
强制同步。四、数据交互与回收
用户空间与内核空间
- 缓存命中时直接拷贝数据;未命中时通过 DMA 读取磁盘数据并填充缓存。
内存回收
- LRU 策略淘汰不常用页,优先保留
dentry/inode
缓存。i_mmap
协助判断映射区域所属进程,确保回收正确性。五、关键技术点
技术 作用 DMA 传输 大文件高效传输数据,减少 CPU 参与(小文件可能因开销大而禁用)。 红黑树索引 i_mmap
快速查找文件映射的vm_area_struct
,支持多进程并发访问。页缓存写回 通过 address_space.a_ops->writepage
定义策略,确保数据持久化。写时复制(COW) 私有映射修改时仅复制页面,避免不必要的磁盘写入。