织梦CMS - 轻松建站从此开始!

罗索

arm的7种执行模式

落鹤生 发布于 2012-12-04 09:12 点击:次 
ARMv4以上版本的CPU任何时刻必定处于如下7种执行模式之一
TAG:

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规范不做任何限制。

(kongweile)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201212/16408.html]
本文出处:iteye 作者:kongweile 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容