从软件角度看,当一条指令使内存页变脏时,核心实际上标记该页为脏状态的延迟是多少?
换句话说,如果一条指令使页面变脏,下一条指令能否读取PTE并查看设置的脏位?
我不关心实际经过的周期时间,只关心是否存在软件可见窗口,在此窗口中脏位尚未设置。 我似乎找不到参考手册中的任何保证。
从软件角度看,当一条指令使内存页变脏时,核心实际上标记该页为脏状态的延迟是多少?
换句话说,如果一条指令使页面变脏,下一条指令能否读取PTE并查看设置的脏位?
我不关心实际经过的周期时间,只关心是否存在软件可见窗口,在此窗口中脏位尚未设置。 我似乎找不到参考手册中的任何保证。
来自 AMD 手册(大约为2005年),卷2:系统编程:
5.4 页面翻译表条目字段 ... 脏(Dirty)比特位6。此位仅存在于页面转换层次结构的最低级别中。它指示该条目所指向的页面翻译表或物理页面是否已被写入。处理器在第一次写入物理页面时将D位设置为1。
Intel 的文档(大约为2006年),卷3-A:系统编程指南,第1部分也有类似内容:
3.7.6 页面目录和页面表条目 ... 脏(Dirty)标志位6 表示是否已写入页面。(此标志未用于指向页面表的页面目录项。)内存管理软件通常在将页面最初加载到物理内存中时清除此标志。然后当页面首次访问进行写操作时,处理器将设置此标志。
更新:
来自最新的 Intel 手册 (卷3A, 系统编程指南):
8.1.2.1 自动锁定 当处理器自动遵循 LOCK 语义的操作如下: ... 更新页面目录项和页面表项时 - 处理器使用锁定周期在页面目录项和页面表项中设置访问和脏标志。
从第8.1和8.2节的其余文本可以看出,一旦CPU使用锁定操作设置了脏位,其他CPU应该开始看到更新后的值。
当然,您可能会遇到竞态条件,即首先在一个CPU(或其中一个线程)上将脏位读取为0,稍后另一个CPU(或同一CPU上的另一个线程)导致此位被设置为1,但这并不是什么不寻常的情况。
通常情况下,脏位更新会按照其他加载和存储的顺序排序,但不一定与WC内存的访问相关;特别地,它们可能不会导致WC缓冲区被清除。然而,为了确保与未来处理器的兼容性,在读取D位之前应插入一次序列化操作。
(以上为重点内容。)
lock or
的seq-cst) - Peter Cordes