第二章 ARM微处理器概述与编程模型
ARM体系结构及其发展历史
处理器的体系结构
- 处理器微架构 Microarchitecture
- 指令集体系结构 Architecture
几种常见的指令集
- X86 Inter AMD
- ARM
- MIPS
- POWER
- C6000
ARM处理器
特点:
- ARM指令都是32位定长的
- 37个寄存器
- 支持普通的Load/Stor指令
- 支持多寄存器的Load/Stor指令
- 支持指令的条件执行
- 在单时钟周期执行的单条指令中完成数据移位操作和ALU操作
- 通过变种和协议处理器来扩展ARM处理器的功能
- 扩展了16位的Thumb指令来提高代码密度
ARM处理器命名规则:
例如:
ARM7TDMI:
T:支持Thumb机构扩展,提供两个独立的指令集:
- ARM指令:32位
- Thumb指令:16位
- 两种运行状态,用来选择哪个指令集被执行
D:内核具有Debug扩展结构
M:内嵌硬件乘法器
I:支持ICE逻辑
ARM处理器分类:
-
按指令集体系版本分类
- ARM v4T
- ARM v5TE
- ARM v6
- ARM Cortex(v7)
-
按应用特征分类
分类 特征 应用处理器 Application Processor MMU、Cache,最快频率、最高性能、合理功耗 实时控制处理器 Real-time Controller MPU、Cache,实时响应、合理性能、较低功耗 微控制器 Micro-Controller no sub-memory system,一般性能,最低成本,极低功耗
ARM微处理器的数据类型
数据类型
- 字节型数据(Byte):数据宽度为8bits
- 半字数据类型(HalfWord):数据宽度为16bits,存取必须以2字节对齐的方式
- 字数据类型(Word):数据宽度为32bits,存取必须以4字节的对齐方式
存储格式
- ARM的寻址空间是线性的地址空间,为4G(2^32)
- ARM支持大端和小端的内存数据方式,可以通过硬件的方式设置(不支持软件的方式)端模式
大端数据存放格式:最高有效字节位于最低地址
小端数据存放格式:最低有效字节位于最低地址
ARM微处理器的工作模式
ARM处理器7种工作模式
-
用户模式(User):用户模式是用户程序的工作模式,它运行在操作系统的用户态,它没有权限去操作其它硬件资源,只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常。
-
系统模式(sys):系统模式是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。
说明:用户模式与系统模式两者使用相同的寄存器,都没有SPSR(Saved Program Statement Register,已保存程序状态寄存器),但系统模式比用户模式有更高的权限,可以访问所有系统资源。
-
快速中断模式(FIQ):快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中。
-
一般中断模式(IRQ):一般中断模式也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。
-
管理模式(SVC):管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。
-
中止模式(ABT):中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式,linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。
-
未定义模式(UND):未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。
-
ARM处理器工作模式:
处理器工作模式 | 特权模式(该组模式下可以任意访问系统资源) | 异常模式(通常由系统异常状态切换进该组模式) | 说明 |
---|---|---|---|
用户(user)模式 | × | ❌ | 用户程序运行模式 |
系统(system)模式 | √ | ❌ | 运行特权级的操作系统任务 |
一般中断(IRQ)模式 | √ | √ | 普通中断模式 |
快速中断(FIQ)模式 | √ | √ | 快速中断模式 |
管理(supervisor)模式 | √ | √ | 提供操作系统使用的一种保护模式,swi命令状态 |
中止(abort)模式 | √ | √ | 虚拟内存管理和内存数据访问保护 |
未定义指令终止(undefined)模式 | √ | √ | 支持通过软件仿真硬件的协处理 |
特权模式
除用户模式外,其它模式均为特权模式(Privileged Modes)。ARM 内部寄存器和一些片内外设备在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。
异常模式
特权模式中除系统(system)模式之外的其他5种模式又统称为异常模式。它们除了可以通过在特权下的程序切换进入外,也可以由特定的异常进入。比如硬件产生中断信号进入中断异常模式,读取没有权限数据进入中止异常模式,执行未定义指令时进入未定义指令中止异常模式。其中管理模式也称为超级用户模式,是为操作系统提供软中断的特有模式,正是由于有了软中断,用户程序才可以通过系统调用切换到管理模式。
说明:
1、除用户模式外,其它6种模式称为特权模式。所谓特权模式,即具有如下权利:
a.MRS(把状态寄存器的内容放到通用寄存器);
b.MSR(把通用寄存器的内容放到状态寄存器中)。
由于状态寄存器中的内容不能够改变,因此要先把内容复制到通用寄存器中,然后修改通用寄存器中的内容,再把通用寄存器中的内容复制给状态寄存器中,即可完成**“修改状态寄存器”的任务。**
2、剩下的六种模式中除去系统模式外,统称为异常模式。
3、进入特权模式是为了处理中断、异常、或者访问被保护的系统资源
4、硬件权限级别:系统模式 > 异常模式 > 用户模式
5、快中断与慢中断区别:快中断处理时禁止中断
ARM微处理器的工作状态
-
1、ARM状态:32位,ARM状态执行字对齐的32位ARM指令。
-
2、Thumb状态,16位,执行半字对齐的16位指令。
-
3、用Bx Rn指令来进行两种状态的切换:
其中Bx是跳转指令,而Rn是寄存器(1个字,32位),如果Rn的位0为1,则进入Thumb状态;如果Rn的位0为0,则进入ARM状态。
ARM体系结构的寄存器组织
ARM处理器寄存器分类和区别
- 31个通用寄存器:是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与。
- 6个SFR(special function register,特殊功能寄存器)属于外设硬件的组成部分,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法。
- 区别:
- 这些寄存器不能同时看到
- 不同的处理器状态和工作模式确定哪些寄 存器是对编程者是可见的
- 通用寄存器没有地址,通过寄存器名字来访问;而特殊功能寄存器有地址
- 寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器。
37个通用寄存器
注意:System模式使用User模式寄存器。当ARM从用户模式(User)切换到快速中断模式(FIQ),寄存器r0r7,r15是不变的,FIQ的寄存器r8r14切换User模式下的同名寄存器。其它几种模式之间切换同理。
说明:
- ARM总共有37个寄存器,但是每种模式下最多只能看到18个寄存器,其他寄存器虽然名字相同但是在当前模式不可见。
- 对r13这个名字来说,在ARM中共有6个名叫r13(又叫sp,栈指针)的寄存器,但是在每种特定处理器模式下,只有一个r13是当前可见的,其他的r13必须切换到他的对应模式下才能看到。这种设计叫影子寄存器(banked register)。
- ARM共有37个寄存器,都是32位长度。
- 37个寄存器中30个为“通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。
寄存器的作用
- r13(sp)是堆栈(程序工作现场)指针,如果7种模式都是采用同一个堆栈指针的话,在某一个模式中,堆栈出现了问题,则会导致7种模式都奔溃,故7种模式的栈都是不同的。
- r14(lr)是存储返回地址的。在用户模式跳到中断模式,然后再调回用户模式,就可以用该返回地址。中断模式下的函数调用也可以用到该返回地址。
- r15(pc)是程序控制计数器,记录当前程序处理到哪里。所以CPU只有一个程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)
- cpsr是程序状态寄存器,用来记录CPU运行状态,每个CPU都有一个
- spsr是用来保存cpsr的
CPSR状态寄存器
(1)CPSR中各个bit位表明了CPU的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关;
(2)CPSR中的I、F位和开中断、关中断有关;
(3)CPSR中的mode位(bit4~bit0共5位)决定了CPU的工作模式,在uboot代码中会使用汇编进行设置。
模式控制位:
通用寄存器
通用寄存器是R0-R15的寄存器,分为3类:
- 0-7:没有对应的影子寄存器
- 所有模式下,R0-R7所对应的物理寄存器都是相同的
- 这八个寄存器是真正意义上的通用寄存器, ARM体系结构中对它们没有作任何特殊的假设,它们的功能都是等同的。
- 在中断或者异常处理程序中一般都需要对这几个寄存器进行保存
- 8-14:有对应的影子寄存器
- 访问的物理寄存器取决于当前的处理器模式,若要访问特定的物理寄存器而不依赖当前的处理器模式,则 要使用规定的名字。
- R15:程序计数器(PC)
ARM微处理器的异常状态
异常的定义
异常是由内部或者外部原因引起的,当异常发生时CPU将暂停执行当前指令自动到 指定的向量地址读取指令并且执行。
- 在X86上,当有异常发生时,CPU是到指定的向量地址读取要执行的程序的地址
- 而ARM是到向量地址的地方读取指令,也就是 ARM的向量地址处存放的是一条指令(一般是 一条跳转指令)
异常类型
ARM CPU将引起异常的类型分为7种
异常优先级:
对异常的响应
当出现异常后,ARM处理器会执行以下操作
- 1 将CPSR复制到响应的SPSR中
- 2 对CPSR进行设置
- 根据异常类型,强制设置CPSR的工作模式位
- 设置中断禁止位,以禁止中断发生
- 如果处理器处于Thumb状态,则切换到ARM状态
- 3 将下一条指令的地址存入相应链接寄存器LR
- LR中保存的是下一条指令的地址(当前执行指令地址+4或+8,与异常类型有关)
- 4 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处
异常返回
异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:
-
将SPSR复制回CPSR中
-
将链接寄存器LR的值减去响应的偏移量(常亮定义如下)后送到PC中
- 注意:复位(Reset)异常不需要返回
各类异常的具体描述
复位异常
- SPSR_svc = CPSR(不可预知)
- CPSR[4:0] = 0B10011
- CPSR[5] = 0 ;切换到ARM工作状态
- CPSR[6] = 1 ;禁止新的FIQ中断
- CPSR[7] = 1 ;禁止新的IRQ中断
- R14_svc = return link(不可预知)
- pc = 0x00000000
未定义异常响应
- spsr_und = cpsr
- cpsr[4:0] = 0b11011
- cpsr[5] = 0 ;切换到ARM工作状态
- // cpsr[6] 不变
- cpsr[7] = 1 ;禁止新的IRQ异常
- r14_und = return link
- pc = 0x00000004
SWI异常
- spsr_swi = cpsr
- cpsr[4:0] = 0b10011
- cpsr[5] = 0 ;切换到ARM工作状态
- // cpsr[6] 不变
- cpsr[7] = 1 ;禁止新的IRQ异常
- r14_swi = return link
- pc = 0x00000008
ABORT异常
- spsr_abt = cpsr
- cpsr[4:0] = 0b10111
- cpsr[5] = 0 ;切换到ARM工作状态
- // cpsr[6] 不变
- cpsr[7] = 1 ;禁止新的IRQ中断
- r14_abt = return link
- pc = 0x0000000c/0x00000010
IRQ异常
- spsr_irq = cpsr
- cpsr[4:0] = 0b10010
- cpsr[5] = 0
- // cpsr[6] 不变
- cpsr[7] = 1 ;禁止新的IRQ中断
- r14_irq = return link
- pc = 0x00000018
FIQ中断
- spsr_fiq = cpsr
- cpsr[4:0] = 0b10001
- cpsr[5] = 0
- cpsr[6] = 1
- cpsr[7] = 1
- r14_fiq = return link
- pc = 0x0000001c