OS 如何知道映射内存中的页是脏的?

How the OS knows a page is dirty in mapped memory?

我的意思是直接在内存中更新数据,而不使用 write()。

在 linux 中,我认为在 msync 调用中指定的所有数据都已刷新。

但是在 Windows 中,FlushViewOfFile 的文档说 "writing of dirty pages",所以 OS 不知何故知道哪些页面已更新。

这是如何运作的?我们必须使用 WriteFile 来更新映射内存吗? 如果我们在 linux 中使用 write() 是否 msync 只同步脏页?

刷新页面(即清理页面)时,OS 会在内部删除 "writeable" 标志。之后,当程序试图写入此类页面中的内存位置时,将调用内核的页面错误处理程序。页面错误处理程序然后设置页面访问权限以允许实际写入并将页面标记为脏,然后 returns 控制程序以让它执行实际写入。

在大多数(也许是所有)现代计算机 运行 Linux 或 Windows 上,CPU 代表操作系统跟踪脏页。此信息存储在 page table.

(例如,参见 Intel® 64 和 IA-32 架构的第 4.8 节 软件开发人员手册,第 3A 卷AMD64 Architecture Programmer's Manual, Volume 2 中的第 5.4.2 节。)

如果该功能在特定 CPU 上不可用,操作系统可以改为使用页面错误来检测对页面的首次写入,如 datenwolf 的回答中所述。