x86在设置页面脏位时有多大提示?

x86在设置页面脏位时有多大提示?,x86,paging,X86,Paging,从软件的角度来看,弄脏内存页的指令与内核在页表条目(PTE)中实际标记页面弄脏之间的延迟是多少 换句话说,如果一条指令弄脏了一页,那么下一条指令能否读取PTE并查看脏位集 我不关心实际经过的周期,只有在软件可见窗口中未设置脏位的情况下。我似乎在参考手册中找不到任何保证。来自AMD手册(大约2005年),第2卷:系统编程: 5.4页面翻译表输入字段。。。脏(D)位。第6位。此位仅存在于页面翻译层次结构的最低级别。它指示页面是否进行了翻译 已写入此入口点的表或物理页。 第一次写入时,处理器将D位设置

从软件的角度来看,弄脏内存页的指令与内核在页表条目(PTE)中实际标记页面弄脏之间的延迟是多少

换句话说,如果一条指令弄脏了一页,那么下一条指令能否读取PTE并查看脏位集

我不关心实际经过的周期,只有在软件可见窗口中未设置脏位的情况下。我似乎在参考手册中找不到任何保证。

来自AMD手册(大约2005年),第2卷:系统编程:

5.4页面翻译表输入字段。。。脏(D)位。第6位。此位仅存在于页面翻译层次结构的最低级别。它指示页面是否进行了翻译 已写入此入口点的表或物理页。 第一次写入时,处理器将D位设置为1 转到物理页

英特尔同上(约2006年),第3-A卷:系统编程指南,第1部分:

3.7.6页面目录和页面表条目。。。脏(D)标志,第6位表示设置时是否已写入页面。 (此标志不用于指向页面的页面目录条目。) 内存管理软件通常在 页面最初加载到物理内存中。然后处理器设置 第一次访问页进行写操作时,此标志

更新

来自最新的英特尔手册(第3A卷,系统编程指南):

8.1.2.1自动锁定处理器自动遵循锁定语义的操作如下:。。。什么时候 更新页面目录和页面表条目-更新时 页目录和页表条目,处理器使用锁定 循环设置页面目录中的已访问和脏标志,并 页面表条目

从第8.1节和第8.2节中的其余文本可以看出,一旦CPU使用锁定操作设置脏位,其他CPU应该开始看到更新的值

当然,您可能有一个争用条件,即您首先在一个CPU(或其一个线程)上将脏位读取为0,然后另一个CPU(或同一CPU上的另一个线程)将该位设置为1,但这并不奇怪。

通常,脏位更新是针对其他加载进行排序的 和存储,但不一定与访问WC有关 记忆;特别是,它们可能不会导致刷新WC缓冲区。 然而,为了确保与未来处理器的兼容性,一个序列化 读取D位之前应插入操作。

(我的重点。)

根据的第2033页,Intel x86缓存有关页表的信息。该文本指出,如果脏位被软件清除,CPU仍可能认为它等于1

现在,对于这个问题:如果CPU缓存脏位,则有可能不会立即更新PTE(页表条目)。它可能会被缓存写回策略延迟


同一文档的第1651页描述了刷新内部缓存的WBINVD指令。它并没有说这包括CPU缓存的所有数据。

我也阅读了文档。这并不是说导致内核设置脏位的指令是否正在序列化或限制其后面的指令。通常,如果没有数据危险,读取可以传递写入,但这是一个非常棘手的情况,危险位于与写入本身地址不同的地址(PTE)。我想知道管道是否正在检查这个案例。@srking:内核总是按照程序顺序观察自己的行为。OoO exec始终保持这种错觉。我认为这句话意味着存储到页面+从PTE加载到这个核心将观察到变化。如果页表更新发生在实际数据之前或之后,则从另一个核心IDK;如果是之前,那么如果您看到数据存储中的值,您肯定会看到另一个内核中的脏位。(因为它们至少都是发布强度,而且页面表更新实际上是seq cst,比如
锁定或