当我使用 将文件映射到内存时mmap()
,它不会直接完全加载到内存中(缓存缓冲区 RAM),而只是加载访问特定映射内存区域时需要的部分。
系统如何通过memory-mapped-file 的 memoryC: *ptr = val;
或asm: MOV
to/from 捕获这种访问并从/向文件生成加载数据,使用什么机制(IRQ 或类似 pageable-memory),以及它是如何调用的?
- x86_64
- 操作系统:Linux、Windows
当我使用 将文件映射到内存时mmap()
,它不会直接完全加载到内存中(缓存缓冲区 RAM),而只是加载访问特定映射内存区域时需要的部分。
系统如何通过memory-mapped-file 的 memoryC: *ptr = val;
或asm: MOV
to/from 捕获这种访问并从/向文件生成加载数据,使用什么机制(IRQ 或类似 pageable-memory),以及它是如何调用的?
简短的回答是分页。
内核跟踪每个进程的不同虚拟内存区域(也称为映射)。有文件支持和匿名(交换支持)映射。在 Linux 上,您可以使用cat /proc/<pid>/maps
.
按需分页页面生命周期中不同阶段的简要概述:
访问的内存页面不存在或没有适当的权限→CPU产生页面错误,内核查看错误地址并做出决定。在一些决定之后,错误指令被重试:
内核决定将页面写回磁盘:这可能是由于内存压力msync()
,或者只是定期执行。