ARMv4以上版本的CPU任何时刻必定处于如下7种执行模式之一:
(1) User Mode:用户模式。操作系统的Task一般以这种模式执行。User Mode是ARM唯一的非特权模式,这表示如果CPU处于这种模式下,很多指令将不能够执行,因此操作系统的资源得以保护。
(2) System Mode:这是V4及其以上版本所引入的特权模式。、
(3) IRQ Mode:中断模式。中断(不包括软中断)处理函数在这种模式下执行。
(4) FIQ Mode:快速中断模式。除了多了几个寄存器外,其他同IRQ一样。
(5) Supervisor Mode:监视模式。软中断(SWI)处理函数在这种模式下执行。
(6) Abort Mode:所有同内存保护相关的异常均在这种模式下执行。
(7) Undefined Mode:处理无效指令的异常处理函数在这种模式下执行。
程序可以通过读取CPSR的MODE域来判断CPU当前的执行模式。
如何看待ARM的各种模式?要回答这个问题,我们要看不同模式下,有哪些东西不同。归纳来说,有如下两个方面的不同:
(1) 物理寄存器不同
(2) 权限不同
如果将User Mode作为参考模式,那么:
(1) System Mode:寄存器一样,仅仅是权限不同
(2) 其他Exception Mode:寄存器不一样,权限也不一样
从权限的角度看,System Mode和其他Exception Mode(FIQ,IRQ,Supervisor,Abort,Undefined)是一样的,他们之间的区别仅仅是寄存器方面有一些差别。
从寄存器角度看,我们可以将CPSR中的MODE域看作一个类似于片选的东西,当其值不一样,所选中的寄存器也不一样。虽然指令中的寄存器是一样的,但是经过MODE域的片选后,实际就指向不同的物理寄存器了。
必须要特别注意,SYSTEM模式和USER模式除了权限不一样外,其他都一样,这样可以让操作系统自由访问16个寄存器(包括状态寄存器)。
那么,模式切换是如何进行的呢?
(1) 执行SWI或Reset指令。如果在User模式下执行SWI指令,CPU就进入Supervisor模式。当然,在其它模式下执行SWI指令,也会进入Supervisor模式,补过一般操作系统不会这么做。因为除了User模式是非特权模式下,其他模式都属于特权模式(这说明ARM只有两种执行态,不想Dummy的X86,定义了4种执行态)。执行SWI一般是为了访问系统资源,在特权模式下可以访问所有的系统资源。SWI指令一般用来用来为操作系统提供API接口。
(2) 有外部中断发生。如果发生了外部中断,CPU就会进入IRQ或FIQ模式,具体是哪种模式,得看外部的中断源是接到CPU的那个Pin。
(3) CPU执行过程中产生异常。最典型的异常是由于MMU保护所引起的内存访问异常,此时CPU会切换到Abort模式。如果是无效指令,则会进入Undefined模式。
从上面我们发现,有一种模式是CPU无法自动进入的,这种模式就是System模式。要进入System模式必须由程序员自己编写指令来实现。其实很简单,在任何特权模式下改变CPSR的MODE域为System模式所对应得数字即可。进入System模式一般是为了利用“System 模式”和“User 模式”下的寄存器是一样的。因此一般操作系统在通过SWI进入Supervisor模式后,做一些简单处理后,就进入System模式。
另外,在任何特权模式下,都可以通过修改CPSR的MODE域而进入其他模式。不过需要注意的是,由于修改的CPSR是该模式下的影子CPSR,因此并不是实际的CPSR,所以一般的做法是修改影子CPSR,然后执行一个MOVS指令来恢复执行到某个断点并切换到新模式。
我们还可以将执行模式按照如下类型划分:
(1) 用户模式:User Mode
(2) 系统模式:System Mode
(3) 异常模式:所有其它5种模式
为什么这样划分呢?这是由于异常模式同用户模式和系统模式有一个不一样的地方,那就是,当CPU产生中断或异常而自动切换到相应异常模式后,CPU会根据产生中断或异常的原因执行相应得中断或异常向量。这些向量的位置是CPU事先定义好的,目前有两种选择:
(1) 处于内存低地址0x00000000~0x0000001c,这种情况被称之为Low vector
(2) 处于内存高低之0Xffff0000~0xffff001c,这种情况被称之为High vector。
一般的操作系统会在这些异常向量地址处放置一条跳转指令。至于到底是使用Low vector,还是使用High vector,由CPU自己决定,ARM规范不做任何限制。
分享到:
相关推荐
ARM的七种执行模式解析
ARM处理器有多种运行模式,每种运行模式有不同的堆栈, 这使得在ARM处理器上实现任务切换有其特殊性,本文利用ARM处理器在任务切换时堆栈的变化特点,优化设计堆栈操作方式和运行模式转化方式, 以减小任务切换时间...
arm中文资料,ARM指令集(中文),对arm寄存器和处理器模式进行了说明,程序状态寄存器,寄存器装载和存储指令,算数和逻辑指令,移位操作,乘法指令,比较指令,分支指令,条件执行,软件终端指令,
本文主要跟大家来详细的介绍ARM处理器的两种工作状态和七种工作模式,奉上ARM处理器37个寄存器的详细介绍。 ARM处理器的两种工作状态 1、ARM状态:32位,ARM状态执行字对齐的32位ARM指令。 2、Thumb状态,16位,...
目前,ARM系列的通用32位RISC微处理器有ARM7、ARM9、ARM9E、ARM10等多个产品,这些处理器可以工作于7种模式下。除User模式以外的其它模式都叫做特权模式,除User和System以外的其它 5 种模式叫做异常模式。大...
在v4T架构的基础上,A RM又推出了 T humb指令集架构(I S A),这是一个16 位的I S A,可以改进代码密度(一般约为 ...便可始终以一种模式(Thumb-2)执行, 而不像ARM7那样需要在ARM/Thumb这 两种模式下切换。
ARM指令集详解 ARM 指令集 寄存器和处理器模式(26-bit 体系) ...条件执行 软件中断指令 APCS (ARM 过程调用标准) 编写安全的 32-bit 代码的基本规则 IEEE 浮点指令 汇编器伪指令 指令快速查找 ARM 指令格式
ARM 指令集 寄存器和处理器模式(26-bit 体系) ...条件执行 软件中断指令 APCS (ARM 过程调用标准) 编写安全的 32-bit 代码的基本规则 IEEE 浮点指令 汇编器伪指令 指令快速查找 ARM 指令格式
ARM 的指令集 ARM 指令集 寄存器和处理器模式(26-bit 体系) ...条件执行 软件中断指令 APCS (ARM 过程调用标准) 编写安全的 32-bit 代码的基本规则 IEEE 浮点指令 汇编器伪指令 指令快速查找 ARM 指令格式
ARM 指令集 (chm格式查找比较方便,这个版本是网上常见的那个中文版本) <br>目录 寄存器和处理器模式(26-bit 体系) 寄存器和处理器模式(32-bit 体系) 程序状态寄存器和操纵它的指令 寄存器...
文档介绍了前言,1 烧写原理及过程,2 监控程序的设计,2.1 启动代码设计,arm处理器的7种运行模式,2.2 烧写主程序设计,2.3 编译与执行,结语
ARM微处理器的工作状态一般有两种,并可在两种状态之间切换: 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令; 第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。
决定处理器如何工作的模式和状态,包括当前的执行权限和安全性。除了模型。ARMv7-R体系结构概要文件定义了一个受保护的内存系统体系结构(PMSA)。程序员模型,并使用协处理器接口来访问控制大多数处理器和内存系统...
ARM汇编指令中文离线文档 目录: ARM 指令集 ...条件执行 软件中断指令 APCS (ARM 过程调用标准) 编写安全的 32-bit 代码的基本规则 IEEE 浮点指令 汇编器伪指令 指令快速查找 ARM 指令格式
目前,ARM系列的通用32位RISC微处理器有ARM7、ARM9、ARM9E、ARM10等多个产品,这些处理器可以工作于7种模式下。除User模式以外的其它模式都叫做特权模式,除User和System以外的其它5种模式叫做异常模式。大部分...
AMaCC实现两种执行模式: 用于ARM后端的即时编译器(JITC) 生成具有可执行和可链接格式(ELF)的有效GNU / Linux可执行文件 值得一提的是,AMaCC旨在通过上述执行模式编译自托管所需的C的最小子集。 例如,存在...
ARM 指令集 -------------------------- 寄存器和处理器模式(26...条件执行 软件中断指令 APCS (ARM 过程调用标准) 编写安全的 32-bit 代码的基本规则 IEEE 浮点指令 汇编器伪指令 指令快速查找 ARM 指令格式
omapl138 arm处理机执行中断的流程: 1.首先就是知道ARM状态下的通用寄存器和程序计数器,绿颜色的就是相应模式下的私有寄存器。就是说程序一般运行在系统和用户模式下,使用的是系统和用户模式下的通用寄存器,当...
这是一本关于ARM 汇编语言程序设计 ARM 指令集 ...条件执行 软件中断指令 APCS (ARM 过程调用标准) 编写安全的 32-bit 代码的基本规则 IEEE 浮点指令 汇编器伪指令 指令快速查找 ARM 指令格式
这些例子曾经用Borland C/C++ 编译器(V3.1)编译过,用...用户只需要简单地编译、链接和执行。其次,使用Borland C/C++产生的80186的目标代码(实模式,在大模式下编译)与所有Intel、AMD、Cyrix公司的80x86 CPU兼容。