20.
Q: CP0是干嘛的?
A: CP0是协处理器0,Co-Processor 0的缩写,MIPS最多可以支持4个协处理器,其中CP0是强制要求实现的,用于处理器的状态控制等。它包括MMU、异常控制、Cache控制等功能。
21.
Q: MIPS的其他协处理器都有什么呢?
A: 这个和具体厂商的实现有关系了。CP1是浮点协处理器,是可选的,CP2和CP3是厂家自定义的。
22.
Q: CP0里面都有哪些寄存器?一般用在什么场合?
A: CP0有32个寄存器,一般操作系统的内核才会接触到它们。主要有MMU类、异常控制类、断点控制类等。
23.
Q: 这几类寄存器各有哪些呢?
A: MMU相关的,有Index,Random, EntryLo0, EntryLo1, Context, EntryHi, MageMask和Wirds几个。具体用途介绍MMU的时候会提到。
异常控制相关的有Status, Cause, EPC, BadVaddr等。
断点控制的有Count, Compare, WatchLo, WatchHi等。
此外,还有PRId,用于确定CPU的类型;
LLAddr, 用于原子锁指令;
Config, 用于配置处理器。
24.
Q: 对CP0寄存器如何访问呢?
A: 有专门的指令访问。32bit读:
mfc0 rs, /*Move from co-processor 0*/
64bit读:
dmfc0 rs, /*Double move from co-processor 0*/
32bit写:
mtc0 rs, /*Move to co-processor 0*/
64bit写:
dmtc0 rs, /*Double move to co-processor 0*/
25.
Q: 对于CP0寄存器,如果只想修改其中的几个bit,该怎样做?
A: 只能先读取到GPR中,修改后写回。
如:
mfc0 t0, SR
nop
and t0, BIT_MASK_ALPHA
or t0, BIT_MASK_BETA
mtc0 t0, SR
nop
26.
Q: 为什么要在mfc和mtc后面插入一个nop指令?
A: 这是为了避免CP0 hazard,简单地说就是执行完mfc或mtc指令之后,有可能要等待一条指令的时间,数据才真正读取或写入到寄存器之中,在这个过程中如果修改相应寄存器会导致错误的结果。
27.
Q: 为什么会有hazard现象?
A: 这是由MIPS高度流水的执行部件决定的。访问CP0所用的时间比较长,所以执行阶段尚未完毕,下一条指令就会走到read阶段,导致出问题。
28.
Q: CP0的Watchlo和WatchHi寄存器是做什么的呢?
A: 这两个寄存器可以监控一块地址。WatchLo是低32bit,而WatchHi决定了监控地址的长度和监控类型。当满足条件访问到这块地址时会引发一个异常。对于内存写坏这样的问题,用这种手段监测非常有用。具体可以看MIPS32 Architecture For Programmers, Vol III的第8.32和8.33章节。
29.
Q: Counter和Compare是干嘛的?
A: 它们是一对冤家,Counter以CPU主频的一半速度自加,当它和Compare相等时就会触发硬件中断5。它们联合使用,可以实现操作系统的时间中断。
30.
Q: 那么,硬件中断是什么呢?
A: 下次就要讲到中断和异常了,别心急啊~