ARM体系结构(1)- 工作模式与工作状态

1. ARM的工作模式

用户模式(usr):属于正常的用户模式,ARM处理器正常的程序执行状态。
快速中断模式(fiq):用于处理快速中断,对高速数据传输或通道处理。
外部中断模式(irq):对一般情况下的中断进行处理。
管理模式(svc):属于操作系统使用的保护模式,处理软件中断swi reset。
数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于处理存储器故障、实现虚拟存储器和存储器保护。
系统模式(sys):运行具有特权的操作系统任务。
未定义指令中止模式(und):处理未定义的指令陷阱,当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。

       模式的改变可由软件控制,或者由外部中断或进入异常引起。大部分应用程序都将在用户模式执行。 被称为特权模式的非用户模式,都将进入到中断服务或异常中去,或者访问受保护的资源
用户模式和特权模式

       除了用户模式之外的其他6种处理器模式称为特权模式

       特权模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。

       特权模式中,除系统模式外,其他5种模式又称为异常模式。

       大多数的用户程序运行在用户模式下,此时,应用程序不能够访问一些受操作系统保护的系统资源,应用程序也不能直接进行处理器模式的切换。

        用户模式下,当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理中进行处理器模式的切换。

缺页异常、中断和系统调用同属arm异常处理

1.1 异常跳转过程

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

异常产生时

做好保护现场的工作:

(1)把cpsr保存到spsr中,设置适当的cpsr(改变处理器的ARM状态、改变处理器进入相应的异常模式、(视情况)改变中断禁止位禁止相应中断)

(2)保存返回地址到lr

(3)设置pc为相应的异常向量实现跳转。

异常返回时

做好恢复现场工作:

(1)从spsr恢复cpsr

(2)从lr恢复pc

注意:这些操作必须在ARM状态执行
因为:当处理器进行异常处理时,则从异常向量地址开始执行,将自动进入ARM状态。

TIPS:

(1)异常向量表中除了FIQ中断都是4个字节,所以只够存放一段异常处理程序的代码的首地址

(2)FIQ中断为快速中断,其中一个特殊的地方就体现在他的异常向量表(Vector Table)地址在最后一个,所以它可以存放不止4个字节,这样的话FIQ中断可以不用只存放地址,而是把整个异常处理程序放进去,这样就少跳转了一次,加快了中断相应速度。

ARM模式与thumb工作状态下各工作模式的寄存器访问地址
在这里插入图片描述

在这里插入图片描述

对应关系
在这里插入图片描述

1.2 为什么需要不同的工作模式

       不同的工作模式来响应不同的异常,起到管理异常的作用。同时配合操作系统,比如说linux内核可以在不同的模式下,而用户程序不可以,起到权限管理、保护的作用,能够保证系统的正确运行。

2. ARM的工作状态

       在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态。
       ARM状态和Thumb状态可以直接通过某些指令直接切换,都是在运行程序,只不过指令长度不一样而已

2.1 ARM状态

arm处理器工作于32位指令的状态,所有指令均为32位

2.2 thumb状态

arm执行16位指令的状态,即16位状态

2.3 thumb-2状态

这个状态是ARM7版本的ARM处理器所具有的新的状态,新的thumb-2内核技术兼有16位及32位指令,实现了更高的性能,更有效的功耗及更少地占用内存。总的来说,感觉这个状态除了兼有arm和thumb的优点外,还在这两种状态上有所提升,优化。

2.4 调试状态

处理器停机时进入调试状态,使用jtag调试的时候使用。

2.5 arm与thumb间的切换

1,由arm状态切换到thumb
  状态将寄存器的最低位设置为1

  BX指令:R0[0]=1,则执行BX
  R0指令将进入thumb状态

2,由thumb状态切换到ARM状态
寄存器最低位设置为0

BX指令:R0[0]=0,则执行BX
R0指令将进入arm状态

3,ARM处理器复位后开始执行代码时总是只处于ARM状态

       Cortex-M3只有Thumb-2状态和调试状态;
       由于Thumb-2具有16位/32位指令功能,因此有了thumb-2就无需Thumb了。
       另外,具有Thumb-2技术的ARM处理器也无需再ARM状态和Thumb-2状态间进行切换了,因为thumb-2具有32位指令功能。

2.6 为什么需要thumb状态

       与ARM指令集相比较,Thumb指令集中的数据处理指令的操作数仍然是32位,指令地址也为32位,但Thumb指令集为实现16位的指令长度,舍弃了ARM指令集的一些特性,如大多数的Thumb指令是无条件执行的,而几乎所有的ARM指令都是有条件执行的;大多数的Thumb数据处理指令的目的寄存器与其中一个源寄存器相同。

       由于Thumb指令的长度为16位,即只用ARM指令一半的位数来实现同样的功能,所以,要实现特定的程序功能,所需的Thumb指令的条数较ARM指令多。在一般的情况下,Thumb指令与ARM指令的时间效率和空间效率关系为:
— Thumb代码所需的存储空间约为ARM代码的60%~70%
— Thumb代码使用的指令数比ARM代码多约30%~40%
— 若使用32位的存储器,ARM代码比Thumb代码快约40%
— 若使用16位的存储器,Thumb代码比ARM代码快约40%~50%
— 与ARM代码相比较,使用Thumb代码,存储器的功耗会降低约30%

       显然,ARM指令集和Thumb指令集各有其优点,若对系统的性能有较高要求,应使用32位的存储系统和ARM指令集,若对系统的成本及功耗有较高要求,则应使用16位的存储系统和Thumb指令集。当然,若两者结合使用,充分发挥其各自的优点,会取得更好的效果。

猜你喜欢

转载自blog.csdn.net/weixin_43369409/article/details/87938408