0

当我使用 将文件映射到内存时mmap(),它不会直接完全加载到内存中(缓存缓冲区 RAM),而只是加载访问特定映射内存区域时需要的部分。

系统如何通过memory-mapped-file 的 memoryC: *ptr = val;asm: MOVto/from 捕获这种访问并从/向文件生成加载数据,使用什么机制(IRQ 或类似 pageable-memory),以及它是如何调用的?

  • x86_64
  • 操作系统:Linux、Windows
4

1 回答 1

1

简短的回答是分页。

内核跟踪每个进程的不同虚拟内存区域(也称为映射)。有文件支持和匿名(交换支持)映射。在 Linux 上,您可以使用cat /proc/<pid>/maps.

按需分页页面生命周期中不同阶段的简要概述:

  • 访问的内存页面存在并具有正确的权限→访问正常进行。
  • 访问的内存页面不存在或没有适当的权限→CPU产生页面错误,内核查看错误地址并做出决定。在一些决定之后,错误指令被重试:

    • 它对应于一个不存在的文件支持映射:从磁盘加载它。
    • 它对应于不存在的非文件支持(匿名)映射:将其交换。
    • 这是对不可写页面的写入,并且对应于可写映射:这是一个 COW(写时复制)错误,复制(取消共享)页面,将页表/TLB 中的页面标记为可写。
  • 内核决定将页面写回磁盘:这可能是由于内存压力msync(),或者只是定期执行。

于 2013-11-09T15:54:33.127 回答