以下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}寄存器中有一个。
有几个来源(包括“参见MIPS运行”)表明,当使用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条目将导致TLB条目的G位清零。“ (其本身并不清楚究竟会发生什么 - “不好的事情”,或者其G位清晰的TLB条目)。
那么两个全局位的原因是什么?它是否适用于传统支持,或者我错过了什么?
答案 0 :(得分:3)
可以在MIPS®架构的程序员第三卷:MIPS32®和microMIPS32™特权资源架构中找到答案,可在mips.com处获得(需要注册)。根据该文件中的表9.5,G位表示:
全球位。在TLB写入时,来自两者的G位的逻辑AND EntryLo0和EntryLo1成为TLB条目中的G位。如果是TLB 条目G位是1,在TLB匹配期间忽略ASID比较。 在从TLB条目读取时,EntryLo0和EntryLo1的G位 反映TLB G位的状态。
换句话说,如果要设置G位,则必须在EntryHi和EntryLo寄存器中进行设置。如果EntryHi和EntryLo不一致,则不会设置G位。
为什么这样做?这是一种很好的方式,系统程序员的内存比替代方案更容易。