【MIPS CPU 体系结构概述1】连载4:

对于一个多任务操作系统来讲,每个任务都有 自己的4G虚拟空间,但是有自己的ASID。 通过ASID,CPU可以区分两个具有同样虚拟地址的TLB其实是分别属于不同的操作系统的 进程或任务。

对MMU的处理主要是通过MMU的一些控制寄存器来完成的。

MIPS体系结构中集成了一个叫做System Control Coprocessor (CP0)的部件。CP0就是我们常 说的MMU控制器。在CP0中,除了TLB条目(例如,对RM5200,有48对,96个TLB条目),还 提供一系列寄存器提供给操作系统来控制MMU的行为。

每个CP0控制寄存器都对应一个唯一的寄存器号。MIPS提供特殊的指令来对CP0进行操
作。

mfc0 reg. CP0_REG
mtc0 reg. CP0_REG

通过上述的两条指令来把一个GPR寄存器的值赋值给一个CP0寄存器,从而达到控 制MMU的目的。
下面简单介绍几个与TLB相关的CP0控制寄存器。 Index Register

这个寄存器是用来指定TLB条目的,当进行TLB读写的时候。例如,MIPS R5000提供
了48个TLB对,所以index寄存器的值是从0到47。换句话说,每次TLB写的行为是对一对 发生的。这一点是与其他的CPU MMU TLB 读写不同的。

EntryLo0, EntryLo1

这两个寄存器是用来指定 一个TLB 对的偶(even)和奇(odd)物理(Physical)页面地址。

一定要注意的是:EntryLo0是给偶数TLB页面, EntryLo1是给奇数TLB页面使用的。否 则MMU会报异常错误。通常是系统不能启动。

Entry Hi

Entry Hi寄存器存放VPN2,或一个TLB的虚拟地址部分。注意的是:ASID 的值也是在这里被填写。

Page Mask

MIPS TLB提供可变大小的TLB地址映射。一个页面可以是4K,16K,64K,256K,1M,4M或16M。这种可变页大小(PAGE SIZE)提供了很好的 灵活性,特别是对嵌入式系统软件。 对于嵌入式应用,一个很大的区别就是:不允许大 量的页面错处理。否则系统性能 将会非常的差。这一点是传统意义上的操作系统是不一 样的。也是为什么POSIX 1.b的目的所在。传统OS存储管理的一个原则就是:Page On
Demand。这对大多嵌入式系统是不允许的。 嵌入式系统往往是需要在系统初始化的时刻 就对所有的存储进行配置,以确保在系统运行时不会有页面错异常。
上述几个寄存器除了映射一个虚拟页面之外,还包括设置一个页面的属性。其中包括: 可写性,合法性,缓存属性等。

下面简单谈谈MIPS的JTLB。
在MIPS中,如R5000,JTLB的意思是Joint TLB. 什么意思呢?就是 TLB条目中TLB是指令 和数据TLB混合的。有的CPU的指令TLB和数TLB条目是分开的。

当然MIPS(R5000)确实还有两个小的,分开的指令TLB和数据TLB。但其大小很小。主要 是为了提高性能,而且是对系统软件透明的。

下面讨论MMU TLB和CPU 缓存(Cache)的关系。
读者知道,MIPS,或大多数CPU,的Level 1 Cache都是采用Virtually Indexed and Physically Tagged. 通过这个机制,OS不需要在每次进程切换的时候去清除缓存。为什么呢?

举一个例子:
进程A的一个虚拟地址Addr1,其对应的物理地址是addre1;
进程B的一个虚拟地址Addr1,其对应的物理地址是addre2;

在某个时刻,进程A在运行中,并且Addr1在Level 1 CACHE中。
这时候,OS进行一个上下文切换,运行进程B ,进程A进入睡眠状态。 现在,假设进程B的第一个指令是虚拟地址Addr1进行一个存取。
这时候CPU会错误的把进程A在缓存中的Addr1的addr1返回给CPU吗? 正确的答案是:不会的。

原因是:
当进程切换时,OS会将进程B的ASID或PID填入ASID寄存器中。请记住:对TLB的访 问,(ASID + VPN)才是唯一确定TLB条目的逻辑。
由于MIPS的缓存属性是Virtually Indexed, Physically tagged.所以,任何地址的访问,CPU都 会多MMU的TLB进行查询,试图找到相应的物理地址。这个物理地址要被用来对CPU缓 存的条目查找中。.

与此同时,CPU会把虚拟地址信号传给缓存控制器。然后,我们必须等待上述MMU传送
过来的物理地址信息。只有物理地址TAG也 匹配上了,我们才能说一个:Cache Hit(缓
存命中)

所以,不需要担心不同的进程有相同的虚拟地址的事情。

--电子创新网--
粤ICP备12070055号