|
MIPS体系结构 Q & A CP0篇
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, <nn> /*Move from co-processor 0*/ 64bit读: dmfc0 rs, <nn> /*Double move from co-processor 0*/ 32bit写: mtc0 rs, <nn> /*Move to co-processor 0*/ 64bit写: dmtc0 rs, <nn> /*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: 下次就要讲到中断和异常了,别心急啊~
|
|