ARM体系结构

目录

1 ARM体可编程器件的编程原理系结构

2 指令集对CPU的意义

3 RISC和CISC的区别

4 统一编址&独立编址&哈佛结构&冯诺依曼结构

5 软件编程控制硬件的关键——寄存器

6 ARM体系结构要点总结

7 ​​​​​​​ARM的编程模式和7种模式

​​​​​​​8 ARM的37个寄存器详解 

​​​​​​​9 ARM的异常处理方式



1 ARM体可编程器件的编程原理系结构

1.1 可编程器件的特点

  • CPU在固定频率的时钟控制下节奏运行。
  • CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行。
  • 这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者(ARM公司)定义的,本质上是一串由1和0组成的数字。这就是CPU的汇编指令集。

1.2 整个编程及运行过程

  • 程序员用汇编指令编程 --经汇编器汇编成二进制可执行程序文件-->二进制文件被CPU读取进去-->CPU内部电路对二进制文件解码-->解码通过则CPU执行指令、完成指令动作。
  • 如果程序员用C语言等高级语言编程,则编译器先将C语言程序编译为汇编程序,再进行上面的后续部分。

    ARM体系结构_第1张图片

 

2 指令集对CPU的意义

2.1 汇编语言与C等高级语言的差异

  • 汇编难写,C好写
  • 汇编无可移植性,C语言有一定可移植性,Java等更高级语言移植性更强。
  • 汇编语言效率最高,C语言次之,Java等更高级语言效率更低。
  • 汇编不适合完成大型复杂的项目,更高级语言更适合完成更大、更复杂的项目

2.2 汇编语言的本质

  • 汇编的实质是机器指令(机器码)的助记符,是一种低级符号语言。
  • 机器指令集是一款CPU的编程特征,是这款CPU的设计者制定的。CPU的内部电路设计就是为了实现这些指令集的功能。机器指令集就好象CPU的API接口一样。

2.3 编程语言的发展过程

  • 纯机器码编程
  • 汇编语言编程
  • C语言编程
  • C++语言编程
  • Java C#等语言编程
  • 脚本语言编程

2.4 总结

  • 编语言就是CPU的机器指令集的助记符,是一款CPU的本质特征。
  • 不同CPU的机器指令集设计不同,因此汇编程序不能在不同CPU间互相移植。
  • 使用汇编编程可以充分发挥CPU的设计特点,所以汇编编程效率最高,因此在操作系统内核中效率极其重要处都需要用汇编处理。

3 RISC和CISC的区别

3.1 CISC

  • complex instruction set computer复杂指令集CPU
  • CISC体系的设计理念是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂、工艺复杂,但好处是编译器好设计。CISC出现较早,至今Intel还一直采用CISC设计

3.2 RISC

  • Reduced Instruction-Set Computer精简指令集CPU
  • RISC的设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集。因此RISC CPU的指令集中只有很少的指令,这种设计相对于CISC,CPU的设计和工艺简单了,但是编译器的设计变难了。

3.3 CPU设计方式发展

  • 早期简单CPU,指令和功能都很有限
  • CISC年代 —— CPU功能扩展依赖于指令集的扩展,实质是CPU内部组合逻辑电路的扩展。
  • RISC年代 —— CPU仅提供基础功能指令(譬如内存与寄存器通信指令,基本运算与判断指令等),功能扩展由使用CPU的人利用基础架构来灵活实现。

3.4 RISC与CISC指令数对比

  • 一般典型CISC CPU指令在300条左右
  • ARM CPU常用指令30条左右

3.5 发展趋势

  • 没有纯粹的RISC或CISC,发展方向是RISC与CISC结合,形成一种介于2者之间的CPU类型。

4 统一编址&独立编址&哈佛结构&冯诺依曼结构

4.1 什么是IO?什么是内存?

  • 内存是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元。
  • IO(input and output)是输入输出接口,是CPU和其他外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路。一般的,IO就是指CPU的各种内部或外部外设。

4.2 内存的访问方式

  • 内存通过CPU的地址总线来寻址定位,然后通过CPU数据总线来读写。
  • CPU的地址总线的位数是CPU设计时确定的,因此一款CPU所能寻址的范围是一定的,而内存是需要占用CPU的寻址空间的。
  • 内存与CPU的这种总线式连接方式是一种直接连接,优点是效率高访问快,缺点是资源有限,扩展性差

4.3 IO的访问方式

  • IO指的是与CPU连接的各种外设
  • CPU访问各种外设有2种方式:一种是类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设,叫IO与内存统一编址方式;另一种是使用专用的CPU指令来访问某种特定外设,叫IO与内存独立编址。

4.4 内存与IO访问的对比

  • 由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高。
  • IO与内存统一编址方式,优势是IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源。
  • IO与内存独立编织方式,优势是 不占用CPU地址空间,缺点是CPU设计变复杂了。

4.5 程序和数据

  • 程序运行时两大核心元素:程序 + 数据
  • 程序是我们写好的源代码经过编译、汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行,CPU不会也不应该去修改程序,所以程序是只读的。
  • 数据是程序运行过程中定义和产生的变量的值,是可以读写的,程序运行实际就是为了改变数据的值。

4.6 冯诺依曼结构与哈佛结构

  • 程序和数据都放在内存中,且不彼此分离的结构称为冯诺依曼结构。譬如Intel的CPU均采用冯诺依曼结构。
  • 程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构。譬如大部分的单片机(MCS51、ARM9等)均采用哈佛结构。

​​​​​​​4.7 优劣对比

  • 冯诺依曼结构中程序和数据不区分的放在一起,因此安全和稳定性是个问题,好处是处理起来简单。
  • 哈佛结构中程序(一般放在ROM、flash中)和数据(一般放在RAM中)独立分开存放,因此好处是安全和稳定性高,缺点是软件处理复杂一些(需要统一规划链接地址等)​​​​​​​

5 软件编程控制硬件的关键——寄存器

5.1 什么是寄存器

  • 寄存器属于CPU外设的硬件组成部分
  • CPU可以像访问内存一样访问寄存器
  • 寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的活动开关
  • 正如汇编指令集是CPU的编程接口API一样,寄存器是外设硬件的软件编程接口API。使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器。​​​​​​​
  • 编程操作寄存器类似于访问内存
  • 寄存器中每个bit位都有特定含义,因此编程操作时需要位操作。
  • 单个寄存器的位宽一般和CPU的位宽一样,以实现最佳访问效率

5.2 两类寄存器

  • SoC中有2类寄存器:通用寄存器和SFR
  • 通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与。
  • SFR(special function register,特殊功能寄存器)不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法。

​​​​​​​5.3 编程访问寄存器的方法

汇编:

  • ldr r1, =0xE0200280
  • str r0, [r1]
  • mov r0, #0

​​​​​​​c语言:

  • int *p = (int *)0x30008000;
  • *p = 16;

6 ARM体系结构要点总结

6.1 ARM是RISC架构

  • 常用ARM汇编指令只有二三十条
  • ARM是低功耗CPU
  • ARM的架构非常适合单片机、嵌入式,尤其是物联网领域;而服务器等高性能领域目前主导还是Intel

6.2 ARM是统一编址的

  • 大部分ARM(M3 M4 M7 M0 ARM9 ARM11 A8 A9等)都是32位架构。
  • 32位ARM CPU支持的内存少于4G,通过CPU地址总线来访问。
  • SoC中的各种内部外设通过各自的SFR编程访问,这些SFR的访问方式类似于访问普通内存,这叫IO与内存统一编址。

​​​​​​​6.3 ARM是哈佛结构的

  • 常见ARM(除ARM7外)都是哈佛结构的
  • 哈佛结构保证了ARM CPU运行的稳定性和安全性,因此ARM适用于嵌入式领域
  • 哈佛结构也决定了ARM裸机程序(使用实地址即物理地址)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序;对于OS之上的应用(工作在虚拟地址之中)则不需考虑这么多

7 ​​​​​​​ARM的编程模式和7种模式

7.1 ARM的基本设定

  • ARM 采用的是32位架构.
  • ARM 约定:

        –Byte :  8 bits
        –Halfword 16 bits (2 byte)
        –Word :  32 bits (4 byte)

  • 大部分ARM core 提供:

        –ARM 指令集(32-bit
        –Thumb 指令集(16-bit
        –Thumb2指令集(16 & 32bit)

  • Jazelle cores 支持 Java bytecode

​​​​​​​7.2 ARM处理器工作模式

 ARM 有7个基本工作模式:

  • User : 非特权模式,大部分任务执行在这种模式
  • FIQ :   当一个高优先级(fast) 中断产生时将会进入这种模式
  • IRQ :   当一个低优先级(normal) 中断产生时将会进入这种模式
  • Supervisor :当复位或软中断指令执行时将会进入这种模式
  • Abort : 当存取异常时将会进入这种模式
  • Undef : 当执行未定义指令时会进入这种模式
  • System : 使用和User模式相同寄存器集的特权模式

​​​​​​​注意:

  • 除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)。
  • Privilege中除Sys模式外,其余5种为异常模式。
  • 各种模式的切换,可以是程序员通过代码主动切换(通过写CPSR寄存器);也可以是CPU在某些情况下自动切换。
  • 各种模式下权限和可以访问的寄存器不同。

​​​​​​​7.3 CPU为什么设计这些模式?

  • CPU是硬件,OS是软件,软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性。
  • 操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要。

​​​​​​​8 ARM的37个寄存器详解 

8.1 37 个寄存器结构

ARM体系结构_第2张图片

注意:

  • 黑色表示共用寄存器
  • System模式使用user模式寄存器集
  • ARM共有37个寄存器,都是32位长度
  • 37个寄存器中30个为通用型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。

8.2 ​​​​​​​CPSR程序状态寄存器

​​​​​​​

条件位:

  • N = Negative result from ALU
  • Z = Zero result from ALU
  • C = ALU operation Carried out
  • V = ALU operation oVerflowed

Q 位:

  • ARM 5TE/J架构支持
  • 指示饱和状态

J 位

  • ARM 5TE/J架构支持

中断禁止位:

  • I  = 1: 禁止  IRQ.
  • F = 1: 禁止  FIQ.

T Bit

  • ARM  xT架构支持
  • T = 0: 处理器处于 ARM 状态
  • T = 1: 处理器处于 Thumb 状态

Mode位:

  • 处理器模式位

​​​​​​​注意:

  • CPSR中各个bit位表明了CPU的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和CPSR中的Z标志位有关)
  • CPSR中的I、F位和开中断、关中断有关
  • CPSR中的mode位(bit4~bit0共5位)决定了CPU的工作模式,在uboot代码中会使用汇编进行设置。

8.3 PC(r15)程序控制寄存器​​​​​​​

  • PC(Program control register)为程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中)
  • 整个CPU中只有一个PC(CPSR也只有一个,但SPSR有5个)。

​​​​​​​8.4 SPSR:程序状态保存寄存器

SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。

SPSR用来进行异常处理,有以下功能:

  • 保存ALU中的当前操作信息。
  • 控制允许和禁止中断。
  • 设置处理器的运行模式。

​​​​​​​9 ARM的异常处理方式

9.1 什么是异常

  • 正常工作之外的流程都叫异常
  • 异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作
  • 中断是异常的一种

9.2 异常向量表

ARM体系结构_第3张图片

  • 所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。
  • 当异常发生时,CPU会自动动作(PC跳转到异常向量处处理异常,有时伴有一些辅助动作)
  • 异常向量表是硬件向软件提供的处理异常的支持

​​​​​​​9.3 ARM的异常处理机制

  • 当异常产生时, ARM core:

             –拷贝 CPSR SPSR_
             –设置适当的 CPSR 位:
                     
 改变处理器状态进入 ARM 态
                       改变处理器模式进入相应的异常模式
                       设置中断禁止位禁止相应中断 (如果需要)

             –保存返回地址到 LR_
             –设置 PC 为相应的异常向量

  • 返回时, 异常处理需要:

             –SPSR_恢复CPSR
             –LR_恢复PC
             
Note:这些操作只能在 ARM 态执行.

你可能感兴趣的:(Linux基础)