1 在SYSTEM MODE里,能够访问一些系统资源,这些系统资源是什么?在异常模式里能访问这些资源么?
2 切换ARM和THUMB只能用BX或BLX来切换么?
3 在遇到异常的时候会自动跳到相应的模式去处理异常,但是在返回的时候怎么只有BL,SWI,UDEF这3个异常的LR不需要减去一个常数?MOV PC,LR, 而其他的几个异常都需要呢?
4 协处理器与ARM寄存器有什么关系?它们一般在哪个模块里面?主要有什么用处?(希望知道的能简单解释下,谢谢!)
1 比如说,可以写CPSR改变处理器的状态或模式,在异常模式也有同样特权。
2 更新CPSR的返回(MOVS PC, LR等)应也可以,不同版本的处理器可能不同的。
3 这是流水线的问题,PC是指向取指令的地址的,异常发生时,它可能没有被调整。
因为对异常的处理,可能要返回到不同的地址,于是就由软件来处理它的调整。
而BL,SWI总是返回确定的地址,处理器已经自动调整了指针。
至于UDEF,如果你消除了异常的产生原因,应当重新执行产生异常的指令,所以
也是确定的地址,处理器自动调整了指针。
4 举个例子,ARM的MMU是用协处理器实现的,有兴趣去看它的文档吧。
新同学弄清楚问题1和2就可以了,3记住就行,4可以先跳过。
对不起我前面对Udef的说明是错误的。
Udef, 一种情形是真的未定义指令,可能是干扰导致的程序迷失,或是错误的堆栈
操作,或不正确的函数指针改写,等等。这种情况发生时不应当恢复异常指令的执行,
它的处理根据应用该区别对待,简单方法中的一种是输出错误指示信号,
然后陷入死循环。
Udef的另一种情形是协处理器仿真。比如,ARM处理器可以实现一个VFP向量浮点
协处理器,也可以没有。需要浮点运算的应用,可以假定VFP总是实现了,生成的
代码用VFP来进行浮点运算。
在有VFP的处理上,这些指令被正确地执行,不产生异常。
在没有VFP的处理上,这些指令产生Udef异常,在它的Udef处理中检查是否为VFP操作,
如果是,则模仿它的行为。