【发布时间】:2011-10-28 00:41:34
【问题描述】:
从软件的角度来看,弄脏内存页面的指令与内核在页表条目 (PTE) 中实际将该页面标记为脏之间的延迟是多少?
换句话说,如果一条指令弄脏了一个页面,那么下一条指令是否可以读取 PTE 并查看设置的脏位?
我不关心实际经过的周期,只要有一个未设置脏位的软件可见窗口。我似乎在参考手册中找不到任何保证。
【问题讨论】:
从软件的角度来看,弄脏内存页面的指令与内核在页表条目 (PTE) 中实际将该页面标记为脏之间的延迟是多少?
换句话说,如果一条指令弄脏了一个页面,那么下一条指令是否可以读取 PTE 并查看设置的脏位?
我不关心实际经过的周期,只要有一个未设置脏位的软件可见窗口。我似乎在参考手册中找不到任何保证。
【问题讨论】:
来自 AMD 手册(大约 2005 年),第 2 卷:系统编程:
5.4 页面翻译表条目字段 ...脏 (D) 位。位 6。该位仅存在于页面翻译层次结构的最低级别。表示是否页面翻译 此入口指向的表或物理页已被写入。 处理器第一次写入时将 D 位设置为 1 到物理页面。
英特尔的同上(大约 2006 年),第 3-A 卷:系统编程指南,第 1 部分:
3.7.6 Page-Directory 和 Page-Table Entries ... 脏 (D) 标志,位 6 表示设置时是否已写入页面。 (此标志不在指向页面的页面目录条目中使用 表。)内存管理软件通常会清除此标志,当 页面最初加载到物理内存中。然后处理器设置 首次访问页面以进行写操作时此标志。
更新:
来自最新的英特尔手册(第 3A 卷,系统编程指南):
8.1.2.1 自动锁定 处理器自动遵循 LOCK 语义的操作如下: ... 当 更新页目录和页表条目 — 更新时 page-directory 和 page-table 条目,处理器使用锁定 循环设置页面目录中的访问和脏标志和 页表条目。
从 8.1 和 8.2 节的其余文本中可以看出,一旦 CPU 使用锁定操作设置脏位,其他 CPU 应该开始看到更新的值。
当然,您可能有一个竞争条件,您首先在一个 CPU(或其一个线程)上将脏位读取为 0,然后另一个 CPU(或同一 CPU 上的另一个线程)导致该位设置为 1,但这并不少见。
【讨论】:
lock or)
AMD64 Architecture Programmer’s Manual Volume 2: System Programming (revision 3.22, Sept. 2012)
一般来说,脏位更新是相对于其他负载进行排序的 和商店,尽管不一定与对 WC 的访问有关 记忆;特别是,它们可能不会导致 WC 缓冲区被刷新。 但是,为了确保与未来处理器的兼容性,序列化 操作应该在读取 D 位之前插入。
(强调我的。)
【讨论】:
根据this document 的第2033 页,Intel x86 缓存了有关页表的信息。文中指出,如果脏位被软件清除,CPU 仍有可能将其视为等于 1。
现在,问题是:如果 CPU 缓存了脏位,则可能不会立即更新 PTE(页表条目)。它可能会被缓存回写策略延迟。
同一文档的第 1651 页描述了 WBINVD 指令,该指令刷新内部缓存。并不是说这包括CPU缓存的所有数据。
【讨论】: