如果我们执行匿名内存映射,那么该区域的所有虚拟地址都将指向零页,因为该地址到目前为止尚未初始化。当我们尝试读取该地址时,它只会返回零并且不会发生页面错误。当我们尝试写入该地址时,会导致页面错误,随后会发生 COW(写时复制)。
上面的概念对我来说很清楚(如果我的上述理解是错误的,请纠正我),但是在下面的场景中会发生什么。
如果我们执行文件支持的内存映射
- 该区域的所有虚拟地址会发生什么,它不应该指向零页,对吗?因为它不是未初始化的地址,因为文件具有内容。
- 将整个文件加载到内存中以便初始化虚拟地址的值。如果不是,第一次读取时会发生页面错误(哈哈,这是读取时复制(COR))吗?
答案1
默认情况下,当您读取与文件关联的地址时,它将出现页面错误,但您可以设置 MAP_POPULATE 标志来更改此行为。
内核还可能尝试检测您是否正在以顺序方式读取(如果确实如此)并引入它期望您需要的页面。
这答案值得一读。