x86设置页面脏位的速度有多快?

21

从软件角度看,当一条指令使内存页变脏时,核心实际上标记该页为脏状态的延迟是多少?

换句话说,如果一条指令使页面变脏,下一条指令能否读取PTE并查看设置的脏位?

我不关心实际经过的周期时间,只关心是否存在软件可见窗口,在此窗口中脏位尚未设置。 我似乎找不到参考手册中的任何保证。

3个回答

11

来自 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,但这并不是什么不寻常的情况。


1
我也阅读了文档。但这些文档并没有说会导致核心设置脏位的指令是串行化还是会对其后面的指令进行栅栏操作。通常情况下,如果不存在数据危险,读取可以通过写入,但这是一种非常棘手的情况,因为危险发生在与写本身不同的地址(即PTE)。我想知道流水线是否正在检查此情况。 - srking
@srking:核心始终观察程序顺序中发生的“自己”的操作。OoO执行始终保留这种幻象。我认为措辞意味着对该核心上的页面存储+从PTE加载将观察到更改。从另一个核心,我不知道页面表更新是在实际数据之前还是之后发生;如果它在实际数据之前发生,那么您肯定会从另一个核心看到脏位,如果您看到数据存储的值。(因为它们都至少具有发布强度,并且页面表更新实际上类似于lock or的seq-cst) - Peter Cordes

8

3
根据该文档第2033页的内容,Intel x86缓存有关页面表的信息。该文本指出,如果软件清除脏位,则CPU仍可能将其视为等于1。
现在,问题来了:如果CPU缓存了脏位,则PTE(页面表条目)的更新可能不会立即发生。它可能会被缓存写回策略延迟。
同一文档的第1651页描述了WBINVD指令,该指令刷新内部缓存。它没有说这包括CPU缓存的所有数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接