一、ARM处理器简介及RISC特点
ARM处理器简介
ARM(Advanced RISC Machines)是一个32位RISC(精简指令集)处理器架构,ARM处理器则是ARM架构下的微处理器。ARM处理器广泛的使用在许多嵌入式系统。ARM处理器的特点有指令长度固定,执行效率高,低成本等。
RISC设计主要特点
1、指令集——RISC减少了指令集的种类,通常一个周期一条指令,采用固定长度的指令格式,编译器或程序员通过几条指令完成一个复杂的操作。而CISC指令集的指令长度通常不固定。
2、流水线——RISC采用单周期指令,且指令长度固定,便于流水线操作执行。
3、寄存器——RISC的处理器拥有更多的通用寄存器,寄存器操作较多。例如ARM处理器具有37个寄存器。
4、Load/Store结构——使用加载/存储指令批量从内存中读写数据,提高数据的传输效率。
5、寻址方式简化,指令长度固定,指令格式和寻址方式种类减少。
二、数据大小和指令集
用于ARM时:
半字(Halfword)表示16位(两个字节)
字(Word)表示32位(四个字节)
双字Doubleword表示64位(8字节)
大多数ARM实现两个指令集
32位ARM指令集
16位Thumb指令集
最新的ARM内核引入了新的指令集Thumb-2
提供32位和16位指令的混合
保持代码密度,增加灵活性
Jazelle-DBX内核也可以执行Java字节码
三、ARM处理器存储格式
32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB,空间划分如下;
用户空间(0—3G),这段空间映射到物理内存的高端内存
内核空间(3G—4G),这段空间映射到低端内存,这段空间又分为以下四部分,分别为
(a)直接映射区(0—896M):这段虚拟地址空间和低端内存地址存在线性的地址关系即虚拟地址3G+X=物理地址X
(b)动态映射区(896—1016M):这段 空间具体映射到物理内存的什么位置不确定,该区域的地址由内核中的vmalloc来实现 分配,其特点是虚拟地址空间连续,但是物理地址空间不一定连续。vmalloc函数返回的是虚拟地址,但是其映射的物理地址有可能在高端内存,也有可能在低端内存。
(c)永久内存映射区(pkmap1016—1020M):使用kmap函数将高端内存的地址映射到这部分区域,这样就可以通过这个 虚拟地址来访问高端内存的地址。通过这4M的窗口可以重复映射所有的高端内存。
(d)固定映射区:(1020—1024M):这4M的地址是有特定用途的固定地址,这4M的区域映射的物理内存作为ACPI电源管理等寄存器的地址。
ARM64架构处理器采用48位物理寻址,最大可以支持256T的地址空间,对于目前的应用来说已经足够了。但是虚拟地址依然采用64,虚拟地址远远大于物理地址。所以在处理器架构设计上,把虚拟地址空间划分为三部分,分别为用户空间,非规范区和内核空间,其中内核空间和用户空间每个部分最大支持256T的访问。
用户空间:(0x0000_0000_0000_0000——0x0000_FFFF_FFFF_FFFF)256T
内核空间:(0xFFFF_0000_0000_0000——0xFFFF_FFFF_FFFF_FFFF)256T
其余部分被称为非规范区域。
内核空间由做了详细的划分,分为以下部分:
(a)Vmalloc区域:0xFFFF_0000_0000_0000——0xFFFF_7BFF_BFFF_0000(126974G)
(b)Vmemmap区域:0xFFFF_7BFF_C000_0000——0xFFFF_7FFF_C000_0000(4096G)
(c)PCI I/O区域:0xFFFF_7FFF_AE00_0000——0xFFFF_7FFF_BE00_0000(16M)
(d)Moudules区域:0xFFFF_7FFF_C000_0000——0xFFFF_8000_0000_0000(64M)
(e)Normal memory线性映射区:0xFFFF_8000_0000_0000——0xFFFF_FFFF_FFFF_FFFF(128T)
ARM体系结构可以用两种方法存储字数据,分别为大端模式和小端模式。
大端模式(高地高低):字的高字节存储在低地址字节单元中,字的低字节存储在高地址字节单元中。
小端模式(高高低低):字的高字节存储在高地址字节单元中,字的低字节存储在低地址字节单元中。
四、内核的工作模式:
ARM有七种基本操作模式:
每种模式都可以访问自己的堆栈和不同的寄存器子集,某些操作只能在特权模式下执行
1、用户模式(user):ARM正常程序执行模式,大多数应用程序/操作系统的模式
2、快速中断模式(FIQ):高优先级的中断产生会进入该种模式,用于高速通道传输;
3、外部中断模式(IRQ):低优先级中断产生会进入该模式,用于普通的中断处理;
4、特权模式(SVC):CPU复位和软中断SWI指令会进入该模式;
5、数据访问中止模式(Abort):当内存访问冲突时会进入该模式;
6、系统模式(System): 用于运行特权级操作系统任务;
7、监控模式(Monitor):cortex-a8以上cpu特有的模式,主要用于安全方面;
8、未定义指令中止模式(Undefined):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
用户模式:
应用程序不能够访问受操作系统保护的系统资源。
应用程序不能进行处理器模式的切换。
系统模式
不属于异常模式,不是通过异常进入的。
系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行模式的切换。
主要供操作系统使用。
特权模式:
系统复位后进入管理模式,运行系统初始化程序,如中断允许/禁止,完成各模式的堆栈设置主时钟设置,SDRAM配置等。
当执行软件中断指令SWI时(比如开启一个新的进程),进入管理模式 。
异常模式:除用户模式和系统模式外的其他5种处理器模式
以各自的中断或异常方式进入,并且处理各自的中断或异常。
特权模式:除用户模式外的其他6种处理器模式
特权程序可以访问所有的系统资源,也可以任意的进行处理器模式的切换。
五、寄存器
(1)ARM Cortex-A8处理器有40个32位长的寄存器:
a、32个通用寄存器
b、7个状态寄存器:1个CPSR(当前程序状态寄存器)
6个SPSR(备份程序状态寄存器)
c、1个PC(程序计数器)
(2)通用寄存器包括R0-R15,可以分为3类:
A、未分组寄存器R0 – R7:
在所有运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途。因此在中断或异常
处理进行异常模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,所以可能造成寄存器中数据的破坏。
B、分组寄存器R8 – R14:
对于分组寄存器,他们每次所访问的物理寄存器都与当前的处理器运行模式相关。
R13常用作存放堆栈指针,用户也可以使用其他寄存器存放堆栈指针,称为SP;
R14称为链接寄存器(LR),当执行子程序时,R14可得到R15(PC)的备份,执行完子程序后,又将R14的值
复制回PC,即使用R14保存返回地址。
C、程序计数器PC(R15):
寄存器R15用作程序计数器(PC),在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状态下,位[0]为0,
位[31:1]用于保存PC。对于ARM指令集而言,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的
地址值加8个字节。
(4)程序状态寄存器:
CPSR(Current Program Status Register,当前程序状态寄存器),CPSR可在任何运行模式下被访问,它包括
条件标志位、中断禁止位、当前处理器模式标志位以及其他一些相关的控制和状态位。包含以下内容:
ALU状态标志的备份;
当前的处理模式
中断使能标志;
设置处理的状态;
每一种运行模式下都有一个专用的物理状态寄存器,称为SPSR(Saved Program Status Register,备份的程序
状态寄存器),当异常发生时,SPSR用于保存当前CPSR的值,从异常退出时则可由SPSR来恢复CPSR。
由于用户模式和系统模式不属于异常模式,这两种状态下没有SPSR,因此在这两种状态下访问SPSR,结果是未知的。
六、异常中断
1、硬件中断&软件中断:
硬件中断是随机的,不可预测的
软件中断是事先安排的(如workQueue、task)
2、ARM处理器有七种类型的异常::
(1)复位异常(Reset):处理器在工作时, 突然按下重启键, 就会触发该异常;
(2)数据异常(Data Abort):读取数据失败;
(3)快速中断异常(FIQ):快速中断要比普通中断响应速度要快一些;
(4)外部中断异常(IRQ):普通中断;
(5)预取异常(Prefetch Abort):预取指令失败, ARM 在执行指令的过程中, 要先去预取指令准备执行,
如果预取指令失败, 就会产生该异常;
(6)软中断异常(SWI):软件中需要去打断处理器工作, 可以使用软中断来执行 ;
(7)未定义指令异常(Undefined Instruction):处理器无法识别指令的异常, 处理器执行的指令是有规范的,
如果尝试执行不符合要求的指令, 就会进入到该异常指令对应的地址中;
当异常发生时,分组寄存器R14和SPSR用于保存处理器状态,
异常返回时,SPSR内容恢复到SPSR,链接寄存器R14的内容恢复到程序计数器PC。
下图中每种异常对应一种内核的工作模式,当然每种异常产生,内核都会进入特定的工作模式;
3、异常处理流程:
(1)中断响应所做的工作:
A、保存短点:保存下一将要执行的指令的地址,也就是把这个地址送入堆栈;
B、寻找中断入口:根据不同的中断源产生的中断,查找不同的入口地址;
C、执行中断处理程序;
D、中断返回:执行完中断指令后,就从中断返回到主程序继续执行;
(2)异常向量表
每一个异常发生时,总是从异常向量表开始跳转,所谓的异常向量表,是指由7个异常向量及其处理函数跳转
关系组成的表:
0x00000000: b reset
0x00000004: ldr pc, _undefined_instruction
0x00000008: ldr pc, _software_interrupt
0x00000008: ldr pc, _software_interrupt
0x0000000c: ldr pc, _prefetch_abort
0x00000010: ldr pc, _data_abort
0x00000014: ldr pc, _not_used //保留
0x00000018: ldr pc, _irq
0x0000001c: ldr pc, _fiq
(3)当一个ARM异常返回时,需要完成如下任务:
通用寄存器的恢复;
状态寄存器的恢复;
PC指针的恢复;
参考:https://blog.csdn.net/frank_zyp/article/details/84646051
https://blog.csdn.net/chengtong222/article/details/64440661