一个宇宙通用的事实是:结构决定功能!
我们以典型的ARM嵌入式处理器内核的一般特征为例,,看看ARM设想的功能是如何被“构造”出来的。。。。
主要说两个内容:
• ARM处理器工作状态与工作模式 • ARM体系结构所支持的异常
基础概念
字(Word):在ARM体系结构中,字的长度为32位(在8位/16位处理器体系结构中,字的长度一般为16位)。
• 半字(Half-Word):在ARM体系结构中,半字的长度为16位,与8位/16位处理
器体系结构中字的长度一致。 • 字节(Byte):在ARM体系结构和8位/16位处理器体系结构中,字节的长度均为8
位。
问:计算机存储设备是按______ (A:字Word,B:半字Half-Word,C:字节Byte)编址的。
处理器工作状态
ARM状态:正在执行ARM指令的处理器的状态。 Thumb状态:正在执行Thumb指令的处理器的状态。
不同的状态下,代码密集度不同,, ARM状态按字(32位)存储代码, Thumb状态按半字(16位)存储代码,
这种特性有利于我们在必要的时候调整单位存储空间的代码容量,压缩代码占用空间。 这两个状态可以根据情况软件切换,,, 后面我们还会再次提到这个话题,,,
Note:对于ARM 32位处理器,两种状态下代码存储密集度不同,但在执行时仍是32位的! 这就是说,代码可以压缩,但执行效率并不会下降,CPU仍是按字执行的啊!
不过,Thumb状态下的指令的使用有某些限制,属于ARM状态下的指令的一个子集。。。
另外,调整代码密集度的优点在后来的ARM一些版本中可以自动切换,,,不需要程序员再过多费神,
这就是所谓Thumb2状态:一种混合型指令集,降低功耗 具有高代码压缩性
处理器工作模式
回顾,前面说过ARM内核采用了大量内部寄存器的特性,,以便有利于支持流水线技术,,, 那么这些“大量内部寄存器”如何运作?
工作模式本质上就是指内核中的这堆寄存器的功能分配和使用方法
ARM处理器内部寄存器
一起看,,这里一共有37个32位寄存器
• 其中,31个通用寄存器,包括程序寄存器(PC); • 6个状态寄存器:。。。 •
程序计数器R15
关于计数器R15,分析如下: 实际R15也就是个普通的寄存器
1) 只是把它约定为用来存放取指的地址,,,, 2) 由于处于指令流水线中,R15的取指地址与当前正在执行的指令有某种可以推算的关系,, 假定指令流水线为3级流水线(指令从取指到执行中间分3道工序同时进行:取指、译码、执行),
这时PC值(取指地址)与当前正在执行的那个指令的地址之间应是下图的关系
3)从指令地址特征来看,
因为ARM指令统一设计为占一个字长,,那么指令地址的末两位总是为0
问题, 为什么FIQ模式下相对来说可以加速处理速度?
注意,用户模式和系统模式公用R13和R14寄存器,,, 联想操作系统的用户态和内核态,,,这里就是为实现操作系统级别的管理提供硬件层面的支持的机制,,,
本质上R13、R14也是个通用寄存器,即一处能存放数据的空间,,只是处理器内核将R13一般用来作为堆栈指针,,将R14用作链接寄存器,,,
关于R14作为程序返回地址的作用的示意图
Note:
在程序发生跳转的同时,相应模式下的LR存储了发生跳转时的指令的下一条指令的地址,即程序返回地址。
当前程序状态寄存器CPSR和保存程序状态寄存器SPSR
程序状态寄存器CPSR的位功能
以上寄存器组从硬件层面支持的ARM典型的工作模式:
模式 用户(User) 快速中断(FIQ) 外部中断(IRQ) 管理(Supervisor) 数据访问中止(Abort) 系统(System) 未定义(Undifined)
模式描述 ARM处理器正常的程序执行状态 用于高速数据传输或通道处理 用于通用的中断处理 操作系统保护模式 实现虚拟存储器和存储器保护 运行特权操作系统任务 支持硬件协处理器的软件仿真
以上七种硬件支持的工作模式的改变 可能存在两种方式: 1)通过软件控制改变 2)外部中断或异常处理
问题:初始运行模式,和工作状态是什么?
怎样用软件控制改变工作模式,,在后面讲指令系统时还会提到。
异常种类与优先级
现在看导致模式转换的另一种可能:外部中断或异常处理
所谓异常 是由内部或外部资源产生引起的处理器处理的一个事件。。。。
其实,中断是属于异常的子集的,也就是说中断其实是异常其中的一种。
首先,看ARM支持的异常种类 ARM支持7中异常:
• 1. 复位
• 2. 数据中止 • 3. FIQ • 4. IRQ
• 5. 预取中止
• 6. 未定义指令,软件中断
异常发生时,处理器怎样处理? 每个异常都有固定的入口地址
即当异常事件发生时,处理器从一个固定的入口处执行指令
异常的响应
• A 数据入栈;将CPSR 拷贝到相应的SPSR; • B 根据异常情况设置CPSR 中模式位
• C 在合适的连接寄存器中保存下一条指令的地址 • D 根据异常向量设置PC,预取下一条指令
Note: 以上操作,并不是纯软件的顺序处理,而是硬件层面的支持,我们不去区分其实际上执行的先后,,而是在逻辑上认为 同时进行 相应的有
异常处理完成时
• A 恢复原来被保护的用户寄存器 • B 将SPSR 的值拷贝回CPSR
• C 将PC值恢复成相应异常下的断点地址,准备执行原来中断前的程序。 • D 如果在进入异常时设置了中断禁止位,离开时需要清除。
补充:
问:假设当有两种或多种异常同时发生,如何处理?
这引出异常优先级的问题:不同的中断处于不同的处理模式,具有不同的优先级 看下表:
一个特殊的异常处理过程:复位异常
当nRESET信号由低变为高电平时:
1 )强制CPSR中M[4:0]变为B10011(管理模式); 2) 置位CPSR中的I和F; 3) 清零CPSR中的T位;
4) 强制PC从地址0x00开始取指令; 5) 系统返回到ARM状态并恢复执行
最后,我们非标准地做如下总结,以助于理解,
我们可以发现arm的7种工作模式其实是和arm的异常向量表有着一定的对应关系的。 这就好像一个医务室,有普通门诊,有特殊处理间,, 一般情况下,普通门诊就可以应对(运行在用户模式下)
当发生特殊事件(外部事件引起中断)或内部运作中机制中产生的特殊情况(异常处理),需要进入相应的特殊处理间进行处理。。。 (每个特殊处理间的入口是固定的)
因篇幅问题不能全部显示,请点此查看更多更全内容