目录
2、简述ARM9处理器有哪些寄存器?它们中哪个用作PC?哪个用作LR?
3、什么是异常?ARM9支持哪些异常?说明各异常的向量地址。
6、ARM9支持哪些工作模式?不同工作模式下的CPSR寄存器的模式位如何确定?
7、为什么说ARM9异常是快速中断?ARM9处理器主要从哪些方面确保FIQ异常响应的快速性?
一、知识点总结
(一)ARM7和ARM9采用的流水线
1、ARM7采用的3级流水线
(1)3级流水线:
(2)流水线的形式如下:
2、ARM9采用的5级流水线
(1)5级流水线
(2)5个阶段的任务解释:
取指:从存储器中取出指令,然后将其放入指令流水线
译码:对指令进行翻译
执行:执行运算ALU
访存(缓冲/数据):如果需要,则访问数据存储器;如果不需要,则等待一个时钟周期(缓冲)。
回写:将指令产生的结果回写到寄存器。这里应该可以理解为如果是访问了数据存储器,那么将获取的数据回写;如果没有访问,那么应该回写的就是执行这个阶段的结果。(个人理解,如有错误请指正)
无论是ARM7还是ARM9,PC指向的均为取值这个阶段;
计算公式为PC=当前执行指令地址+8
对于后面会提到的Thumb状态下:PC=当前执行指令地址+4
(二)ARM9的7种工作模式和2种工作状态
1、7种工作模式
分别为用户模式、快速中断模式、外部中断模式、管理模式、指令/数据访问终止模式、系统模式、未定义指令中止模式。
(1)用户模式(usr)
ARM处理器正常执行程序状态下的模式
(2)快速中断模式(fiq)
高速数据传输或通道处理
(3)外部中断模式(irq)
通用的中断处理
(4)管理模式(svc)
操作系统的保护模式,如系统上电复位或软件中断指令执行进入该模式
(5)指令/数据访问终止模式(abt)
当指令或数据预取终止的时候进入该模式,用于虚拟存储及存储保护
(6)系统模式(sys)
运行具有特权的操作系统任务时的模式
(7)未定义指令中止模式(und)
当未定义的指令执行的时候进入该模式,可用于支持硬件协处理器的软件仿真。
注意:除了用户模式,其余的模式均为特权模式。
除用户模式和系统模式以外,其余的5种又称异常模式。
2、2种工作状态
首先,需要清楚字对齐和半字对齐。
字对齐:存储的地址相邻且可以被4整除,即最后两位是00。
半字对齐:存储的地址相邻且可以被2整除,即最后一位是0。
(1)ARM状态
在该状态下,处理器核执行32位的、字对齐的ARM指令。
(2)Thumb状态
在该状态下,处理器核执行16位的、半字对齐的Thumb指令(T指令)。
注意:在程序执行的过程中,两种状态可以切换,但不影响工作模式和寄存器中的内容。
(三)大端和小端存储格式
ARM9采用的是32位长度地址,存储器的地址空间可以看作是从0地址开始的字节的线性组合,即一个地址对应一个存储字节。
关于一个字是多少个字节的说法:
在16位的系统中:1字 (word)= 2字节(byte)= 16(bit)
在32位的系统中: 1字(word)= 4字节(byte)=32(bit)
在64位的系统中:1字(word)= 8字节(byte)=64(bit)
上面的这些大概就说了,ARM9中一个字为32位,其余的我也不太能理解,这里我觉得能清楚大端和小端是怎么区分的就可。
简单的来说,可以用“大异小同”来记忆,我们平时说的都是大同小异,这里反过来就好了。那么是什么意思呢?
大异:就是说对于大端模式,遵循“高位低地址”的规律,即数据的最高字节存储在最低地址当中。
例如:数字0x1234,将每两位放入一个地址中,地址从0x30000000开始。
对于数据:从右至左位数增大(这里可以拿十进制数来理解,123,个位为3,十位为2,百位为1),所以这里的十六进制也同理。
那么这里的34为低位,12为高位;
对于地址来说是从0x30000000依次增大,所以就应该将12放在0x30000000地址中,将34放在下一个单元。
小同:就是在小端模式下,遵循“高位高地址”,即数据的最高字节存储在最高地址当中。对于上面的例子,存储结果如下:
(四)I/O端口的访问方式
1、存储映射方式
就是端口地址和存储器统一编址。这种方式的编址可以理解为教学楼中的教室和厕所的编号是统一的,例如A102是厕所,它隔壁的教室编号为A103,即它俩为统一的编号方式。
优点:因为是统一编址,所以对I/O端口设备可以进行像对存储器的一些操作,比如:访问就按照访问存储器的方式,实现输入/出操作,逻辑运算等;除此之外,还可以增大I/O端口编址空间。
缺点:存储器的容量减小。
2、I/O映射方式(独立编址)
I/O端口地址与存储器分开独立编址。比如说教工号和学生学号,就是分开编号的。
优点:对于I/O操作和存储器操作层次清晰,程序可读性强。
缺点:指令少,编程相对灵活性减少;硬件上需要 I/O 端口的译码芯片,增加了硬件开支
(五)ARM9的37个32位内部寄存器
内部寄存器可分为通用寄存器和状态寄存器。
通用寄存器可以用来存放数据或地址,有31个是通用寄存器;
状态寄存器标识或设置通用寄存器的工作模式或者工作状态等,有6个状态寄存器,每个寄存器用其中的12位。
下面对于内部寄存器进行说明,这里按照是否是异常模式分,用户模式和系统模式属于非异常模式,所以使用的是同一组寄存器(个人理解),其他的几种异常模式有各自的寄存器组,所以这里一共分为6组。
1、通用寄存器
对于R0~R7(未分组寄存器)和R15(PC),7种模式共用一套,所以有9个共用的寄存器;
对于R8~R12,快速中断模式有一套特有的,用来保证“快速”,而其他模式下共用一套,所以一共有10个寄存器;
对于R13(SP)和R14(LR),6组下均有各自的寄存器,所以一共有12个寄存器。
由上面的解释可得到,通用寄存器有9+10+12=31个。
其中:
R13用作堆栈指针,又称SP(实质上是存储器+先进后出(LIFO):R13是一个寄存器,但它的值通常指向内存中的堆栈区域。这种特定用途决定了它在实际应用中更多地与堆栈操作关联,而堆栈又是一种典型的LIFO结构,因此R13在实际运作中体现出“存储器+先进后出”的特性。个人理解);
R14用作子程序链接存储器,又称LR。有两种功能:一是保存子程序的返回地址,二是当异常发生时,该异常模式下的那个R14被设置成异常返回地址。
R15用于程序计数器(PC),用于控制程序中指令的执行顺序,总是指向下一条执行指令。
2、状态寄存器
可分为当前程序状态寄存器和备份程序状态寄存器。
当前程序状态寄存器只有1个,即为CPSR,各工作模式共用;
用户模式和系统模式下没有备份程序状态寄存器,其余的5个工作模式各有一个,所以有5个备份程序状态寄存器。
由上面的分析可得,状态寄存器有1+5=6个。
状态寄存器用于保存程序运行的当前状态,程序状态寄存器的0~7位为控制位;8~27为保留位;28~31为条件码标志。
(1)条件码标志
即为CPSR的高4位,分别为N、Z、C、V。
N:当用2个补码表示的带符号位进行运算时,N=1表示运算结果是负数,N=0则表示结果是正数或零。
Z:Z=1表示运算结果为零,Z=0则表示非零。
C:进位借位标志位。
对于加法运算(包括比较指令CMP),如果产生了进位(且均无符号溢出),C=1,否则C=0;
对于减法运算(包括比较指令CMP),产生借位(且均无符号溢出),C=0,否则C=1;
对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
对于其他的非加/减运算指令,C通常不变。
V:溢出标志位。
对于加/减运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V=1表示符号位溢出。
对于其他的非加/减运算指令,V的值通常不改变。
(2)控制位
即为CPSR的低8位,分别为I、F、T和M[4:0]。
中断禁止位:I和F,分别用来禁止和允许IRQ和FIQ两类中断。=1,表示禁止该中断;=0表示允许该中断。
T标志位:用来设置处理的工作状态。T=1表示Thumb状态;T=0表示 ARM状态。
工作模式位:M[4:0],即一共有5位,本来可以有32个数,但是一共有7个工作模式,所以在这32个书中选择了7个作为与7个模式对应的数(为方便记忆可以记为16~19,23,27,31),对应表格如下所示:
M[4:0] | 模式 |
---|---|
10000 | 用户模式(usr) |
10001 | 快速中断模式(FIQ) |
10010 | 外部中断模式(IRQ) |
10011 | 管理模式(SVC) |
10111 | 中止模式(abt),即指令/数据访问终止模式 |
11011 | 未定义模式(und) |
11111 | 系统模式(sys) |
(3)保留位
当改变(1)和(2)时,保留位不需要改变,主要用于ARM版本的扩展。
上面说明的是ARM9的内部寄存器,而Thumb的内部寄存器一共有27个,状态寄存器和ARM9的一样6个,R0~R7、PC共用,堆栈指针和链接寄存器(分别对应ARM状态的R13和R14)在6组下均有各自对应的寄存器。所以一共有6+8+1+2*6=27个。
(六)ARM9异常
1、异常和中断的区别
- **异常(Exception)**是由CPU内部在执行指令期间检测到的错误或特殊条件引发,主要用于处理程序运行中的问题,即异常由CPU本身原因引起。
- **中断(Interrupt)**是由外部设备或硬件引发,用于响应硬件请求,通常与I/O操作相关,即中断由外因引起。
还想更深入的了解,可以参考这篇文章(侵权联系删除):
2、异常的类型及向量地址
异常有7种异常。当异常发生之后,处理器的PC值被强制赋予该异常下的存储器地址,处理器便从该地址开始运行程序,这些存储器地址成为异常向量,简称向量。
异常名称 | 对应模式 | 正常向量 | 高地址向量 |
---|---|---|---|
复位 | 管理(SVC) | 0x00000000 | 0xFFFF0000 |
未定义指令 | 未定义(und) | 0x00000004 | 0xFFFF0004 |
软件中断(SWI) | 管理(SVC) | 0x00000008 | 0xFFFF0008 |
指令预取中止(取指令存储器中止) | 中止(abt) | 0x0000000C | 0xFFFF000C |
数据中止 | 中止(abt) | 0x00000010 | 0xFFFF0010 |
IRQ(中断) | IRQ | 0x00000018 | 0xFFFF0018 |
FIQ(快速中断) | FIQ | 0x0000001C | 0xFFFF001C |
高地址向量(高端向量,由Implementation Defined决定系统是否支持高端向量)
处理器在进入异常处理程序之前,会将断点处相应异常的PC和CPSR分别保存在R14和SPSR中,当结束异常处理返回之后,就重新赋值回去。
下面对于每一种异常简单解释一下:
(1)复位异常
在系统上电或按下复位键且处理器收到复位信号后,产生复位异常,中断执行当前指令,并在禁止中断的管理模式下,从地址0x00000000或0xFFFF0000开始执行。
(2)未定义指令异常
出现该异常,有两种情况:
一是协处理器没有响应;利用未定义的指令异常,可以在没有设计硬件协处理器的系统上,对协处理器的功能进行软件仿真。
二是试图执行未定义的指令。
(3)软件中断异常(SWI)
在执行软件中断指令(SWI)的时候可能出现的异常,可使用该异常机制实现系统功能调用。
(4)指令预取中止异常
在指令预取访问存储器失败时产生指令预取中止异常,此时,存储器系统发出存储器中止信号,相应取值激活的中止,预取的指令标为无效。
若处理器尝试处理无效的指令,则发生指令预取中止异常。
(5)数据中止异常
与指令预取中止异常的产生类似,只不过是访问数据存储器失败时产生,而标记无效的为数据。
(6)IRQ(中断请求)
是nIRQ引脚的外部中断信号引起的。当ARM9处理器的nIRQ引脚上施加一个有效信号(中断信号)时,会发生该异常。
CPSR的I位为1,禁止;0允许;
(7)FIQ(快速中断请求)
外部中断信号引起的。当外部部件在ARM9处理器的nFIQ引脚施加有效信号,将产生FIQ异常。
CPSR的F位为1禁止;0允许;
3、异常的优先级
优先级 | 异常 |
---|---|
1(最高) | 复位 |
2 | 数据中止 |
3 | 快速中断(FIQ) |
4 | 外部中断(IRQ) |
5 | 指令预取中止 |
6(最低) | 未定义指令、SWI |
二、课后习题
2、简述ARM9处理器有哪些寄存器?它们中哪个用作PC?哪个用作LR?
ARM9处理器有31个通用寄存器和6个状态寄存器。其中,用户模式和系统模式共用一套寄存器,所以一共分为6组寄存器。其中,通用寄存器中6组共用的有R0~R7,R15;快速中断模式特有一套R8~R12的寄存器,其他5组共用一套R8~R12的寄存器;对于R13和R14,6组均有自己的寄存器。对于状态寄存器,6组共用一个CPSR寄存器,用户模式与系统模式没有备用程序状态寄存器,其他的5组均有自己的备份寄存器。
用作PC的是R15,用作LR的是R14。
3、什么是异常?ARM9支持哪些异常?说明各异常的向量地址。
异常就是由于外部或内部的原因,暂时停止执行当前程序,转去处理特定的事件,处理完毕之后返回原来的程序继续执行。只要是正常的程序流程被暂停,则异常发生。
ARM9支持的异常有七种,如下表所示:
异常 | 正常向量 | 高地址向量 |
---|---|---|
复位 | 0x00000000 | 0xFFFF0000 |
未定义指令 | 0x00000004 | 0xFFFF0004 |
软件中断 | 0x00000008 | 0xFFFF0008 |
指令预取中止 | 0x0000000C | 0xFFFF000C |
数据中止 | 0x00000010 | 0xFFFF0010 |
IRQ | 0x00000018 | 0xFFFF0018 |
FIQ | 0x0000001C | 0xFFFF001C |
4、简述大端存储模式和小端存储模式的含义。
大端存储模式即为数据的高位存储在低地址当中,数据的低位存储在高地址中;
小端存储模式即为数据的高位存储在高地址当中,数据的低位存储在低地址中。
5、说明CPSR寄存器及其各位的作用。
CPSR由条件码标志、控制位和保留位构成。
条件码标志有N、Z、C、V。
N表示2个补码表示的带符号数的结果。N=1表示结果为负数,N=0表示结果为正数或零。
Z=1表示运算结果为零,Z=0表示运算结果为非零。
对于加法若产生进位则C=1,否则为0;对于减法,若产生借位C=0,否则为1;对于包含以移位的非加/减法,C为移出值的最后一位;对于其他的,C不变;
V为溢出标志位。对于加/减运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V=1表示符号位溢出。对于其他非加/减运算,V的值不变。
控制位是低8位。分别为I、F、T和M[4:0]
中断禁止位:I和F,分别表示IRQ和FIQ中断,为1表禁止该中断,为0表示允许。
T控制位是用来转换工作状态的,T=1为Thumb状态,T=0为ARM状态。
M[4:0]则表示工作模式的选择,根据7个不同的数值可以有相应的模式。
其余的为保留位,一般情况下不变。
6、ARM9支持哪些工作模式?不同工作模式下的CPSR寄存器的模式位如何确定?
ARM9支持7中工作模式,分别为用户模式、外部中断模式、快速中断模式、管理模式、指令/数据预取终止模式、系统模式、未定义模型。不同工作模式下的CPSR寄存器的模式位如下:
M[4:0] | 模式 |
---|---|
10000 | 用户模式 |
10001 | 快速中断模式 |
10010 | 外部中断模式 |
10011 | 管理模式 |
10111 | 中止模式 |
11011 | 未定义模式 |
11111 | 系统模式 |
7、为什么说ARM9异常是快速中断?ARM9处理器主要从哪些方面确保FIQ异常响应的快速性?
FIQ异常是快速中断,是因为ARM9处理器在处理FIQ异常时会抢占当前正在执行的指令,直接跳转到FIQ异常处理程序,从而能够快速响应该异常。
ARM9处理器主要从以下几个方面确保FIQ异常响应的快速性:
-
专用寄存器集: ARM9处理器提供了专门用于处理FIQ异常的寄存器集。这些寄存器在发生FIQ异常时可以立即被保存和加载,而无需干扰普通程序执行时使用的寄存器。
-
优先级别: FIQ异常具有比普通中断更高的优先级,因此在发生FIQ异常时,处理器会立即暂停正在执行的指令,转而执行FIQ异常处理程序。