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