基本名词解释
- A类指令集(Application profile)
- 支持MMU虚拟内存
- 支持ARM和Thumb指令集
- R类指令集(Real-Time profile)
- 面向实时操作系统
- 不支持虚拟内存系统,支持MMU内存保护
- M类指令集(Microcontroller profile)
- 仅支持Thumb变体指令集,针对低成本嵌入式环境优化,功耗低代码密度高。
- 嵌入式系统
- 用于运行特定任务的计算机系统
ARM现状既树莓派4B现阶段情况
ARM公司不制造芯片,开发微处理器设计并授权给其他公司,集成到芯片上。通过定义体系结构规范实现兼容性。
树莓派4B的IP核心是Cortex-A72,兼容ARMv7-A规范,故应主要参考相关参考文档。尽管ARMV8有一些改变,但是比赛要求的的指令集指定armv7,故主要参考Cortex-A(armV7)编程手册。
寄存器概况
16个32位通用寄存器(R0-R15),4GB虚拟地址空间。
按照约定,其中0-12是通用目的寄存器,R13是SP,R14是LR(Link register),R15是Counter。
另外有CPSR寄存器和SPSR(Saved Program Status Register)两个寄存器。
Banking技术
根据当前所处的模式,寄存器的值可能处于不同物理位置。也就是说,对于某些模式,不会共用User模式下的寄存器。以下描述中“共用”表示与User模式是否共用,不共用则表示该模式下该寄存器有独属的值。
举例来讲,FIQ下访问SP寄存器,访问到的不是User模式下的值,而是FIQ自己的值。对应地,User下访问SP寄存器访问到的是User模式下的值。相当于北航OS课设中切换上下文的硬件实现。
- R0-R7、R15在所有模式下都共用。
- SYS和User共用所有通用寄存器。
- R13(SP),R14(LR)除Sys外不共用。
R13总是代表OS的栈指针。
R14表示返回地址(RA)。进入异常状态时,R14保存了发生异常时的R15。
R15类似北航CO课设的NPC,ARM模式下比当前指令提前8字节,Thumb模式下提前4字节。
PSR(Program Status Register)
CPSR存储当前状态,APSR时用户模式下的CPSR视图。
CPSR存储:
- APSR标记
- 当前处理器模式
- 屏蔽中断标记
- 当前处理器模式(ARM/Thumb/…)
- 大小端
- IT块执行的标记位
进入异常时,CPSR自动拷贝到对应异常模式的SPSR中。
APSR只能访问NZCVQ和GE比特。通常这些比特被分支语句用来保存结果。
CPSRbit视图:
- 31-27:
- N:ALU结果取反
- Z:ALU零结果
- C:ALU操作进位
- V:ALU操作溢出
- Q:累积状态
- 26-25:
- IT:空
- 24:
- J:核心是否处于Jazelle状态
- 23-20:保留
- 19-16:
- GE:被SIMD指令使用
- 15-10:
- IT[7:2]:Thumb2指令集中If-Then条件处理使用
- 9-5:
- E:控制load-store字节序
- A:屏蔽异步中断
- I:屏蔽IRQ
- F:屏蔽FIQ中断
- T:表示核心是否处于Thumb状态
- 4-0:
- M:表示处理器模式
用户模式下不能操作M位和AIF位,特权下可以操作M以进入对应状态,通常状态转换随异常事件自动完成。
CP15协处理器
协处理器中有c0-c15十六个主寄存器,用来控制核心的特性。
运行模式
不考虑扩展,有六个特权模式和一个用户模式
- User 非特权,正常运行
- FIQ中断
- IRQ中断
- Supervisor
- Abort 内存访问异常
- Undef 未定义指令异常
- System 操作系统级别,共享用户寄存器
扩展
安全扩展
TrustZone 安全扩展在原有的特权级别之外定义了安全世界和非安全世界,增加了监视模式(Monitor mode),MON中的软件控制两个世界的切换,非安全世界无法访问安全世界中申请的内存。
虚拟化扩展
虚拟机监视器模式(Hyp)在ARMv7中添加,独立于现有的六个特权模式之外。
如果虚拟化拓展被实现,非安全状态时特权级别与之前不同,分为PL0,PL1,PL2三个级别。
- PL0表示应用程序级别,在User mode中执行。
- PL1表示所有User mode、Hyp mode之外的的模式中运行,操作系统通常在此处运行。
- PL2表示Hyp mode,虚拟机监视器运行在此处。虚拟机监视器可以切换运行在PL1的Guest系统,并可以实现多系统共用处理器。
特权级别表示了当前状态下访问资源的能力。
安全扩展和虚拟化扩展共存
Hyp模式运行在非安全模式下、MON运行在安全模式下,仅有Hyp运行在PL2、UserMode运行在PL0,其余所有模式均运行于PL1(无论是否在安全模式下)
识别当前模式
当前模式和执行状态保存在Current Program Status Register(CPSR)中。