ARM芯片具有RISC体系的一般特点,如:
- 具有大量的寄存器.
- 绝大多数操作都在寄存器中进行,通过Load/Store的体系结构在内存和寄存器之间传递数据.
- 寻址方式简单
- 采用固定长度的指令格式.
除此之外, ARM体系采用了一些技术:
在同一条数据处理指令中包含算术逻辑处理单元处理和移位处理.
使用地址自动增加(减少)来优化程序中循环处理.
Load/Store指令可以批量传输数据,从而提高数据传输的效率.
所有指令都可以根据前面指令执行结果,决定是否执行,以提高指令执行的效率.
1.2 ARM体系结构的版本及命令方法
- ARM指令集: 分为6个版本
- Thumb指令集: 是将ARM指令集的一个子集重新编程而形成的一个指令集. ARM指令长度为32位, Thumb指令长度位为16位.
- M变种: 长乘法指令, 增加了两条用于进行长乘法操作的ARM指令
- E变种: 增强型DSP指令.
- T变种: Thumb指令集
- J变种: Java加速器 Jazelle
- SIMO变种: ARM媒体功能扩展
1.3 ARM处理器系列
- ARM7
- ARM9
- ARM9E
- ARM10E
- SecurCore
- Xscale
- StrongARM
1.4 ARM处理器模式
- 用户模式(User,usr) : 正常程序执行的模式
- 快速中断模式(FIQ,fiq) : 用于高速数据传输和通道处理
- 外部中断模式(IRQ,irq) : 用于通常的中断处理
- 特权模式(Supervisor, sve) : 供操作系统使用的一种保护模式
- 数据访问中止模式(Abort,abt) : 用于虚拟存储及存储保护
- 未定义指令中止模式(Undefined,und) : 用于支持通过软件方针硬件的协处理器
- 系统模式(System,sys) : 用于运行特权级的操作系统任务
处理器模式可以通过软件来切换,在ARM Linux操作系统中,只有运行在内核态的程序才有可能更改处理器模式,用户态的程序是不能访问受操作系统保护的系统资源的,更不能直接进行处理器模式的切换。当需要处理器模式切换的时候,用户态的程序可以中断,内核态的中断处理程序开始响应并做出处理。
以上7种模式对应了系统中的中断向量表,这在移植操作系统的时候很重要。系统中所有的调度都是围绕着中断向量表展开的,在不用操作系统的系统中也就是通常所谓的裸机系统程序中,对于中断向量表的处理也很关键。这个向量表一般加载在CPU复位执行的开始地址的一段空间。在ARM Linux操作系统中,Boot Loader程序的移植中需要考虑这些问题,而一旦Boot Loader移植成功,运行起来以后,开发人员就不需要再考虑这个问题了。
1.5 ARM寄存器介绍
ARM处理器共有37个寄存器 :
- 31个通用寄存器, 包括程序计数器(PC)在内. 这些寄存器都是32位寄存器.
- 6个状态寄存器, 这些寄存器都是32位寄存器, 但目前只使用了其中12位.
- 任意处理器模式下, 可见的寄存器包括15个通用寄存器(R0~R14), 一个或两个状态寄存器及程序计数器(PC).
各模式下寄存器表格:
1.5.1 通用寄存器
- 未备份寄存器(The unbanked registers) , R0~R7
当处理器模式切换时, 未备份寄存器指的是同一个物理寄存器, 所有可能造成寄存器中数据被破坏.
- 备份寄存器(The banked registers) , R8~R14
对于R8~R12, 每个寄存器对应2个不同的物理寄存器. 如: 快速模式下, R8对应R8_fiq; 用户模式下, R8对应R8_usr. 这两种情况下, 使用的是不同的物理寄存器.
对于R13,R14, 每个寄存器对应6个不同的物理寄存器. 其中用户模式和系统模式下是共用一个物理寄存器. 其它5种处理器模式分别使用: R13_<mode>, R14_<mode>来表式.
R13在ARM中常用作栈指针. 每一种异常模式拥有自己的物理R13. 应用程序去初始化该R13, 使其指向该异常模式专用的栈地址.
R14又称连接寄存器(Link Register, LR), 在ARM中有以下2个作用
1) 每种模式有自己的物理R14, 存放当前子程序的返回地址. 当通过BL或BLX指令调用子程序时, R14被设置成该子程序的返回地址. 子程序中, 当把R14的值复制到程序计数器PC中时, 子程序返回.例:
2) 异常中断发生时, 该异常模式特定的物理R14被设置成该异常模式将要返回的地址.
MOV PC , LR #把R14的值复制到程序计数器PC中
BX LR #
STMFD SP! , { <registers>,LR } #在子程序入口将PC保存到栈中
LDMFD SP!, { <registers>,PC } #子程序返回 - 程序计数器PC, R15
ARM采用流水线机制, 当正确读取了PC的值时, 该值为当前指令地址加8个字节(也就是当前指令的下两条指令的地址), 由于ARM指令是字对齐的, PC值的第0位和第1位总为0 .
当使用STR/STM保存R15时, 保存的可能是当前指令地址值加8字节, 也可能保存的是当前指令地址加12字节. 取决于芯片具体设计. 尽量避免使用STR/STM指令来保存R15的值.
to be continue.. P14