形式陈述
文件映射为虚拟区域理路页表地址转换与访问权限Page table address translation · VPN PFN offset · 虚实地址转换由虚页号、页内偏移与PTE计算物理地址,分别检查驻留、访问类型和用户权限,并建立可检查的隔离不变量。指定文件backing。映射记录为(base,length,file,offset,protection,mode);对区域内虚地址v,其对应文件字节偏移为
这里file是已解析的文件对象理路文件对象、目录与路径名Inode directory and pathname · Hard link and symbolic link · 硬链接与符号链接把名称到文件对象的映射与对象本身分开,执行逐分量路径解析、硬链接计数、符号链接与删除后的存活。,不是每次访问都重新查找的路径字符串。OS-16把base、offset按256B页对齐,长度为正;映射建立先记录区域,实际页可在第一次访问时取得。
shared表示对映射的写修改文件的内存缓存副本,并可被映射同一文件区域的其他参与者观察;写回和持久化仍是后续协议。private表示本映射的写不改底层文件,也不发布给其他私有映射;实现可用COW在首次写时分离页。两种模式都还受读写权限约束。
OS-16为教学轨迹额外假定文件大小和外部内容在私有映射建立后不变。真实Linux mmap的MAP_PRIVATE并不承诺冻结快照:映射之后外部对文件的修改是否出现在私有映射中未指定。欲获得稳定快照,必须另有文件版本或同步协议。
直觉
普通read把字节复制到用户缓冲后由程序访问缓冲,mmap把“这个虚地址应该对应哪个文件字节”记录给内核,随后load/store也能触发文件页取得。接口看似没有read调用,不表示没有缺页、磁盘读取或错误。
一个私有映射像在必要时为自己留下修改稿;共享映射则修改共同的内存工作副本。两者都不是“CPU存储指令一完成,磁盘即已保存”。
例子与边界
地址、文件偏移与实际副本
文件I从偏移0开始为abcdefgh,其余至255字节为零。P把文件页映到base=0x2000、offset=0,Q映到0x3000,均shared。P读0x2002对应q=2,返回c;P写0x2002为X后,Q读0x3002得到X,内存文件页为abXdefgh。稳定设备上的文件仍可为abcdefgh,所以共享观察不能充当掉电证据。
另开一次独立实验,先把文件及其内存缓存重置为abcdefgh,再建立两个private映射,并冻结外部文件修改。初始都可只读共享同一backing页。P写时复制该页,P见abXdefgh,Q仍见abcdefgh,底层文件仍未改变。此处分离条件来自私有文件映射,物理页复制与COW fork理路fork的写时复制与页生命周期Copy-on-write fork · COW fork · 写时复制进程创建在父子私有内存语义下追踪PTE降权、引用计数、写故障复制、独占快路和退出释放,并核验分配失败不破坏旧状态。同用写故障机制,但没有要求P、Q具有父子关系。
关闭描述符不是解除映射
Linux man-pages 6.19明确允许mmap成功后立即关闭原fd而映射继续有效。映射持有自己的文件关联;munmap才解除指定地址范围。此后对解除范围访问无效,即使原fd仍然开着也不会自动恢复映射。
文件被截短又是不同问题。Linux访问映射中超出文件结束的整页可触发SIGBUS,不能把原来的映射长度当成底层文件永久不变的承诺。最后一个不足整页的尾部、超文件末尾的修改如何处理也需遵守实际系统接口,本页练习使用完整一页以避开这些特殊字节。
推论与应用
映射取消需要删除或调整区域、撤销PTE、完成翻译失效,再释放页面及文件引用。若只删除区域元数据而TLB仍能访问旧页,已经释放的页框可能被旧虚地址继续改写;映射生命周期仍受内存隔离协议约束。
共享文件页通常通过页缓存理路页缓存、脏页与回写代际Page cache and writeback · Dirty page redirty · Buffered file I/O分离应用缓冲、内核页缓存和设备缓存,追踪同一页回写期间再次变脏,并解释write返回为何不足以证明持久化。合并普通文件I/O与映射访问。OS-16明确采用同一缓存对象;真实系统的具体一致性、直接I/O混用和跨机器文件系统行为,应另查其契约。
Linux的msync(MS_SYNC)用于等待指定映射范围的更新写回;文件和名称的恢复承诺还要结合文件/目录持久化理路文件同步与目录持久化fsync and directory durability · fdatasync · File persistence boundary为write、设备完成、fsync文件与fsync目录各写出准确承诺,区分内容保存、名称保存和多对象原子性。。映射private页不因msync变成“提交修改到文件”;若想把私有结果写回,应用必须选择明确的写入协议。
参考资料
- Linux man-pages 6.19,mmap(2)与msync(2),MAP_PRIVATE可见性、fd关闭、SIGBUS与同步范围,2026-10-08核查。
- Cox、Kaashoek、Morris,xv6教材 rev5,§5.5,memory-mapped files作为真实系统扩展。