4

以下 R4000 文档的第 81 页: http ://www.scribd.com/doc/53181649/70/EntryLo0-2-and-EntryLo1-3-Registers

在每个 TLB 条目中显示一个全局位(这是有道理的)。如果在 TLB 条目中设置了全局位,则在查找期间忽略 ASID。

但是,在下一页中,EntryHi 寄存器有一个保留 (0) 字段来代替 TLB 条目的全局位(如第 82 页的标题中所述)。取而代之的是两个全局位,一个位于每个 EntryLo{0,1} 寄存器中。

一些消息来源(包括“See MIPS Run”)表明,在使用 TLBW 指令写入 TLB 条目时,如果 EntryLo0 (G) 和 EntryLo1 (G) 位不相同,“将会发生坏事”。其他来源,例如 linux-mips.org 上的论坛帖子 (http://www.linux-mips.org/archives/linux-mips/2003-04/msg00226.html) 建议“换句话说,写在 EntryLo{0,1} 寄存器对集中只有一个 G 位的 TLB 条目将导致 G 位被清除的 TLB 条目。” (这本身并不清楚究竟会发生什么——“坏事”,或者 G 位清除的 TLB 条目)。

那么,两个全局位的原因是什么?它是否适合遗留支持,或者我错过了什么?

4

1 回答 1

3

答案可以在MIPS® 程序员架构第三卷:MIPS32® 和 microMIPS32™ 特权资源架构中找到,可从mips.com 获得(需要注册)。根据该文档中的表 9.5,G 位意味着:

全局位。在 TLB 写入时,EntryLo0 和 EntryLo1 的 G 位的逻辑与成为 TLB 条目中的 G 位。如果 TLB 条目 G 位为 1,则在 TLB 匹配期间忽略 ASID 比较。在从 TLB 条目读取时,EntryLo0 和 EntryLo1 的 G 位都反映了 TLB G 位的状态。

换句话说,如果要设置 G 位,则必须在 EntryHi 和 EntryLo 寄存器中都设置它。如果 EntryHi 和 EntryLo 不一致,则不会设置 G 位。

为什么这样做?它和其他方法一样好,而且它在系统程序员的内存上比其他方法更容易一些。

于 2012-09-13T20:54:59.613 回答