【问题标题】:How does the system catches access through the `asm: MOV` to/from memory of memory-mapped-file?系统如何通过 `asm: MOV` 对内存映射文件的内存进行访问?
【发布时间】:2013-11-09 23:54:33
【问题描述】:

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

系统如何通过C: *ptr = val;asm: MOV 对memory-mapped-file 的内存进行访问,并从/向文件生成加载数据,使用什么机制(IRQ 或类似pageable-内存),怎么称呼?

  • x86_64
  • 操作系统:Linux、Windows

【问题讨论】:

  • 这些是按需分页的虚拟内存操作系统。任何有关操作系统设计的介绍性文字都会告诉您页面错误是如何工作的。

标签: c winapi memory-management posix memory-mapped-files


【解决方案1】:

简短的回答是分页。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-30
    • 1970-01-01
    • 2012-07-06
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多