
MIPS寄存器别名记忆:
;REGISTER NAME USAGE
$0 $zero 常量0(constant value 0)
$2-$3 $v0-$v1 函数调用返回值(values for results and expression evaluation)
$4-$7 $a0-$a3 函数调用参数(arguments)
$8-$15 $t0-$t7 暂时的(或随便用的)
$16-$23 $s0-$s7 保存的(或如果用,需要SAVE/RESTORE的)(saved)
$24-$25 $t8-$t9 暂时的(或随便用的)
$28 $gp 全局指针(Global Pointer)
$29 $sp 堆栈指针(Stack Pointer)
$30 $fp 帧指针(Frame Pointer)
$31 $ra 返回地址(return address)
2,MIPS 存储空间分配
MIPS将存储空间分为4块分别是:
kuseg, kseg0,kseg1 and kseg2
1. 0xFFFF FFFF mapped kseg2
2. 0xC000 0000 unmapped uncached kseg1
3. 0xA000 0000 unmapped cached kseg0
4. 0x8000 0000 2G kuseg
呵呵可以直观的看到只有kseg1是不需要映射(物理虚拟转换),没有被缓存的,也就是说只有kseg1的内存区域可以做引导的存储区(在这里放置引导用
flash 存储器).被cached区域必须等到MMU 的TLB被初始化后才可以使用的。

1. User Mode.
2. Supervisor Mode.
3. and Kernel Mode.
For simplicity, let's just talk about User Mode and Kernel Mode.
Please always keep this in mind:
CPU can ONLY access kuseg memory area when running in User Mode
CPU MUST be in kernel mode or supervisor mode when visiting kseg0, kseg1
and kseg2 memory area。
呵呵,可以看出MIPS的CPU运行态和x86尤其是ARM基本都是一样的。就是用户层对物理空间地址的访问是也是受限制的(现代操作系统的先进之处 吗),必须通过使用驱动方式把操作代码运行在核心态。
4,MMU
TLB
MIPS CPU通过TLB来translates all virtual addresses generated by the CPU.下面谈谈ASID(Address Space Identifier). Basically, ASID, plus the VA(Virtual Address) are composed of the primary
key of an TLB entry. 换句话说,虚拟 地址本身是不能唯一确定一个TLB entry的。一般而言,ASID的值就是相应的process ID. Note that ASID can minimized TLB re-loads, since several TLBentries can have the same virtual page number, but different ASID's. 对于一个多任务操 作系统来讲,每个任务都有 自己的4G虚拟空间
5,
MMU 控制寄存器
对于一个Kernel Engineer来说,对MMU的处理主要是通过MMU的一些控制寄存器来完成的。MIPS体系结构中集成了一个叫做System Control Coprocessor (CP0)的部件。CP0就是我们常说的MMU控制器。在CP0中,除了TLB entry(例如,对RM5200,有48pair,96个TLB entry),一些控制寄存器提供给OS KERNEL来控制MMU的行为。 每个CP0控制寄存器都对应一个唯一的寄存器号。MIPS提供特殊的指令来对CP0进行操作。
mfc0 reg. CP0_REG
mtc0 reg. CP0_REG
我们通过上述的两条指令来把一个GPR寄存器的值assign给一个CP0寄存器,从而达到控制MMU的目的。
面简单介绍几个与TLB相关的CP0控制寄存器。
Index Register
这个寄存器是用来指定TLB entry的,当你进行TLB读写的时候。我们已经知道,例如,MIPS R5提供48个TLB pair,所以index寄存器的值是从0到47。换句话说,每次TLB写的行为是对一个pair发生的。这一点是与其他的CPU MMU TLB 读写不同的。 EntryLo0, EntryLo1 这两个寄存器是用来specify 一个TLB pair的偶(even)和奇(odd)物理(Physical)页面
地址。
一定要注意的是:
EntryLo0 is used for even pages; EntryLo1 is used for odd pages.
Otherwise, the MMU will get exception fault.
Entry Hi
Entry Hi寄存器存放VPN2,或一个TLB的虚拟地址部分。注意的是:ASID value也是在这里被体现。
Page Mask
MIPS TLB提供可变大小的TLB地址映射。一个PAGE可以是4K,16K,64K,256K,1M,4M或16M。这种可变PAGE SIZE提供了很好的灵活性,特别是对Embedded System Software. 对于Embedded System Softare,一个很大的区别就是:不允许大量的Page Fault. 这一点是传统OS或General OS在Embedded OS上的致命缺陷。也是为什么POSIX 1。B的目的所在。传统OS存储管理的一个原则就是:Page On Demand.这对大多Embedded
System是不允许的。 For embedded system,往往是需要在系统初始化的时刻就对所有的 存储进行configuration, 以确保在系统运行时不会有Page Fault.
上述几个寄存器除了MAP一个虚拟页面之外,还包括设置一个页面的属性。其中包括:
writable or not; invalide or not; cache write back or write through
6,对于mips而言,int就是一个32位的整数
7,空间映射关系总结:
kuseg 0x0000 0000 - 0x7fff ffff(低端2G):用户态可用地址,被mmu转换才能用
kseg0 0x8000 0000 - 0x9fff ffff(512M):把最高位清零即为物理地址,为主要存储区,如一般的内存区域就挂在这一块;即其物理地址为0x0 - 0x1fff ffff;该区域的地址几乎总是通过高速缓存来存取。
kseg1 0xa000 0000 - 0xbfff ffff(512M):把最高三位清零即为物理地址,该区域是唯一在系统重启时能正常工作的地址空间,难怪复位时入口点为0xbfc0 0000,其实实际地址是0x1fc0 0000,此处是mips内部sram区起始地址,长度为512B,类似于s3c2440的steppingstone区。
kseg2 0xc000 0000 - 0xffff ffff(1G):该区域只能在核心态下使用并且要经过MMU转换,
8,mips指令:
srl shift-right-logical逻辑右移,高位补0;
move 你懂的,
li 加载立即数到寄存器
bne 你懂的,不相等跳转
and and d,s,td = s & t
b
nop
mfc0 协处理器传送指令
lui 把立即数加载到寄存器高位
ori 或操作, ori d,s,j d = s | (unsigned) j
mtc0 mtc0 t,cd 从通用寄存器t传送到协处理器寄存器cd
sw 存储一个字, sw t,addr *((int *) addr) = t
lw 加载字(32bit)
lw t,addr t = *((int *) addr)
la 加载地址
addu addu d,s,t d = s + t