中断和异常的区别: 中断时从外至内的, 异常时由内发出的
一、存储器格式(字对齐):
Arm体系结构将存储器看做是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存储的字数据,一次排列。作为32位的微处理器,arm体系结构所支持的最大寻址空间为4GB。
存储器格式
1、大端格式:高字节在低地址,低字节在高地址;
2、小端格式:高字节在高地址,低字节在低地址;
指令长度:
Arm微处理器的指令长度是32位的,也可以为16位(thumb状态下)。Arm微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,其中,字需要4字节对齐,半字需要2字节对齐。
注:所谓的指令长度是一条完整的指令的长度,而不是单纯的mov这3个字母长度
二、ARM体系的CPU有两种工作状态
1、ARM状态:处理器执行32位的字对齐的ARM指令;
2、Thumb状态:处理器执行16位的、半字对齐的Thumb指令;
在程序运行的过程中,可以在两种状态之间进行相应的转换。处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。
CPU上电处于ARM状态
三、ARM体系的CPU有以下7种工作模式:
1、用户模式(Usr):用于正常执行程序;
2、快速中断模式(FIQ):用于高速数据传输;
3、外部中断模式(IRQ):用于通常的中断处理;
4、管理模式(svc):操作系统使用的保护模式;
5、数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储以及存储保护;
6、系统模式(sys):运行具有特权的操作系统任务;
7、未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件;
ARM Context-A*架构的有8中模式
这里所指的片内寄存器是指CPU内部的寄存器, 而控制GPIO的寄存器属于外设。
参考: http://infocenter.arm.com/help/index.jsp arm官网对应系列文档
Arm的工作模式切换有两种方法:
被动切换:在arm运行的时候产生一些异常或者中断来自动进行模式切换
主动切换:通过软件改变,即软件设置寄存器来经行arm的模式切换,应为arm的工作模式都是可以通过相应寄存器的赋值来切换的。
Tips:当处理器运行在用户模式下,某些被保护的系统资源是不能被访问的。
除用户模式外,其余6种工作模式都属于特权模式;
特权模式中除了系统模式以外的其余5种模式称为异常模式;
大多数程序运行于用户模式;
进入特权模式是为了处理中断、异常、或者访问被保护的系统资源;
四、寄存器
ARM有31个通用的32位寄存器,6个程序状态寄存器,共分为7组,有些寄存器是所有工作模式共用的,还有一些寄存器专属于每一种工作模式;
R13——栈指针寄存器,用于保存堆栈指针;
R14——程序连接寄存器,当执行BL子程序调用指令时,R14中得到R15的备份,而当发生中断或异常时,R14保存R15的返回值;
R15——程序计数器;
快速中断模式有7个备份寄存器R8—R14,这使得进入快速中断模式执行很大部分程序时,甚至不需要保存任何寄存器;
其它特权模式都含有两个独立的寄存器副本R13、R14,这样可以令每个模式都拥有自己的堆栈指针和连接寄存器;
五、当前程序状态寄存器(CPSR)
CPSR中各位意义如下:
T位:1——CPU处于Thumb状态, 0——CPU处于ARM状态;
I、F(中断禁止位): 1——禁止中断, 0——中断使能;
工作模式位:可以改变这些位,进行模式切换;
六、程序状态保存寄存器(SPSR)
当切换进入某一个特权模式时,SPSR保存前一个工作模式的CPSR值,这样,当返回前一个工作模式时,可以将SPSR的值恢复到CPSR中;
七、模式切换
当异常发生,CPU进入相应的异常模式时,以下工作是由CPU自动完成的:
1、在异常模式的R14中保存前一工作模式的下一条即将执行的指令地址;
2、将CPSR的值复制到异常模式的SPSR中;
3、将CPSR的工作模式设为该异常模式对应的工作模式;
4、令PC值等于这个异常模式在异常向量表中的地址,即跳转去执行异常向量表中的相应指令;
从异常工作模式退回到之前的工作模式时,需要由软件来完成以下工作:
1、将异常模式的R14减去一个适当的值(4或8)后赋给PC寄存器;
2、将异常模式SPSR的值赋给CPSR;
ARM 有七种异常,当异常发生时,ARM core 会自动执行 Vector Table 中的指令。
ARM 的七种异常及在 Vector Table 种的偏移:
异常 | 模式 | 向量表偏移 |
复位(reset) | SVC | +0x00 |
未定义指令 | UND | +0x04 |
软件中断(SWI) | SVC | +0x08 |
预取指终止 | ABT | +0x0c |
数据终止 | ABT | +0x10 |
未分配 | -- | +0x14 |
IRQ | IRQ | +0x18 |
FIQ | FIQ | +0x1c |
ARM V4 以下版本 Vector Table 的地址为 0x00000000,V4 以上版本 Vector Table 地址可在 0x00000000 ,0xFFFF0000 间进行选择。
ARM 构架下,中断为异常的一种。以中断为例,当接收到中断后,ARM core 首先将当前模式下的 CPSR,PC 寄存器分别保存到异常模式下的 SPSR,LR 寄存器,然后将目标模式的 PC 寄存器值设为地址 0x00000018(或0xFFFF0018),最后切换到目标模式----即 IRQ 模式。切换到目标模式后执行的第一条指令便是地址 0x00000018(或0xFFFF0018)上的指令。此处一般为一个跳转指令,用于跳转执行中断处理函数。其它异常处理方式相似。
S3C6410 中有个 32KB IROM(internel ROM),里面固化了一段程序。其开头就是一个 Vector Table。以 IROM 模式启动时,IROM 被映射到 0x00000000 位置,所以执行的第一条指令便是 Vector Table 中的 Reset 异常跳转指令(ARM core 上电时在 0 地址取第一条指令)。我们可以利用此 IROM 的异常向量表实现 u-boot 下的中断处理。
刚上电,初始化中断,使S3C6410 能接收并处理中断。中断发生后,先执行 0x00000018 中的异常跳转,转去执行 IROM 中的中断处理函数。此处理函数很简单:将 0x0C001FF8 (落于 SRAM 地址范围)处的值赋给 PC。所以,我们可将我们自己的中断处理函数的入口地址存于 0x0C001FF8 处,当中断发生后,便会自动调用我们的中断处理函数。其它异常的实现方法类似,只是 0x0C001FF8 要改成别的值。具体为何值,需分析 IROM 中的代码。
S3C6410 IROM 的反汇编代码,可以在网上搜索到。或者也可以自己提取进行反汇编。