ARM是知识产权(IP)供应商,不制造芯片,也不出售芯片,而是转让设计方案。ARM架构是ARM公司第一款低成本RISC微处理器。
RISC结构特性
ARM内核采用精简指令集计算机体系结构(RISC),其指令集和相关的译码机制比复杂指令集计算机(CISC)要简单。
其目标是,设计出一套能在高时钟频率下,单周期执行,简单而有效的指令集。
其设计的重点,在于降低处理器中指令执行部件的硬件复杂度,这是因为软件比硬件更容易提供更大的灵活性和更高的智能化,因此ARM具备了非常典型的RISC结构特性:
大量通用的寄存器;
通过装载/保存(load-store)结构,使用独立的load和store指令完成数据在寄存器与外部存储器之间的传送,处理器只处理寄存器中的数据,从而避免多次访问存储器;
寻址方式简单,所有装载/保存的地址都只由寄存器内容和指令域决定;
使用统一和固定长度的指令格式;
ARM体系存储系统
ARM处理器采用冯.诺依曼结构,因此指令和数据共用一条32位总线,因此只有装载、存储和交换指令可以对存储器中的数据进行访问。
ARM规范仅仅定义了其处理器内核与存储器系统之间的信号,以及局部总线,而实际的芯片(CPU芯片,而不是指内核)一般在外部总线与处理器核的局部总线之间有一个存储器管理部件:
负责将局部总线的信号和时序转换为现实的外部总线信号和时序。
因此,外部总线的信号和时序与具体的芯片相关,而不是ARM规范定义的标准。具体的某个芯片的外部存储系统的设计,需要参考其芯片的使用手册。
对ARM来说,它将存储器看成是一个从0开始的线性递增的字节集合:
字节0-3保存第1个存储的字;
字节4-7保存第2个存储的字;
字节8-11保存第3个存储的字;
……
ARM处理器可以将存储器中的字以两种格式存储: 大端格式和小端格式。前者高位数据存取低地址,低位数据存入高地址。后者反之。
地址空间
ARM结构使用2的32次方个8位字节的地址空间,字节地址从:0到2∧32-1。
地址空间同样也可以看作是2∧30个32位字,地址则以字为单位进行分配。就是将字节地址除以4,如此,地址为A的字包含4个字节,其地址分别为A、A+1、A+2、A+3。
地址空间还可以看做包含2∧31个16位半字,地址是按照半字分配。地址为A的半字,包含两个字节: A和A+1。
地址的计算通常通过普通的 整数指令 实现。这意味着,若地址向上或向下溢出地址空间通常会发生反转,也就是说计算的结果以2∧32为模。如果地址的计算没有发生翻转,那么结果仍然位于0-2∧32-1范围内。
大多数指令都是通过指令所指定的偏移量与PC值相加并将结果写入PC来计算目标地址。若用公式
PC+偏移值=[(当前程序执行位置)+8]+偏移量
来确定溢出地址空间,那么该指令依赖于地址的翻转。由此可见,在技术上是不可预测的,因此程序应该保证穿过地址0xFFFF FFFF的向前转移和穿过地址0x0000 0000的向后转移的情况都不发生。
此外正常连续执行的指令,实际上是通过“当前程序执行位置+4”来确定下一条将要执行的指令。
存储器的字与半字
ARM处理器直接支持8位字节,16位半字或32位字的数据类型。其中,以能被4整除的地址开始连续的4个字节构成1个字,字的数据类型为4个连续的字节。从偶数地址开始连续的两个字节构成一个半字,半字的数据类型为2个连续的字节。ARM的指令的长度刚好是一个字,而Thumb指令的长度刚好为一个半字。
字对齐与非字对齐
如果数据以字的方式存储,那么它就是字对齐。否则就是非字对齐。如果一个数据是以半字方式存储的,那么它就是半字对齐,否则就是非半字对齐。
表半字与字对齐
ARM处理器是直接支持 对齐存放的半字或字数据的存取,就是说可用一条相应的指令来实现对应操作:
。
程序执行效率
如果访问非对齐的半字或字数据,将需要多条指令组合 才能实现对应的操作,这个弊端就很明显了,这会大大地影响程序的执行效率,因此,在C语言编程中,定义的多字节变量或结构体,最好使其为对齐存放。对齐存放的目的就是为提高代码的执行效率,而减少执行指令数。
存储器格式
地址空间要求洗地址A的规则:
位于地址A的字所包含的字节位于A、A+1、A+2、A+3。
上面并不能完全定义字、半字和字节之间的映射,存储系统使用以下两种映射机制的其中一种:小端存储器系统
大端存储器系统