巴勒斯坦 不存在:ARM学习笔记(一)--处理器模式

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 21:46:30

ARM学习笔记(一)--处理器模式

标签:  ARM  笔记  处理器  模式  学习  2010-10-23 12:38

转自:http://blog.csdn.net/liufei_learning/archive/2010/08/21/5829102.aspx

作者:liufei_learning

 

处理器模式

 

CPSR寄存器

ARM V4的CPSR寄存器(和保存它的SPSR寄存器)中的位分配如下图所示。 

处理器模式

描 述

用户模式(User,usr)

正常程序执行的模式

快速中断模式(FIQ,fiq)

用于高速数据传输和通道处理

外部中断模式(IRQ,irq)

用户通常的中断使用

特权模式(Supervisor,sve)

供操作系统使用的一种保护模式

数据访问中止模式(Abort,abt)

用于虚拟存储及存储保护

未定义指令中止模式(Undefin- ed,und)

用于支持通过软件仿真硬件的协处理器

系统模式(System,sys)

用于运行特权级的操作系统任务

 

 

处理器模式

体系结构

模式编号

用户

全部

0b10000

FIQ - 快速中断请求

全部

0b10001

IRQ - 中断请求

全部

0b10010

超级用户

全部

0b10011

中止

全部

0b10111

未定义

全部

0b11011

系统

ARMv4 及更高版本

0b11111

监控

仅限安全扩展

0b10110

 

 

1.除了用户模式以外,其他6种处理器模式可以称为特权模式(前5种也称为异常处理模式,即除了系统模式)

2.特权模式允许对cpsr的完全读/写访问;与些相反,非特权模式只允许对cpsr的控制域进行读访问,但允许对条件标志的读/写访问。

3.通过修改cpsr可以进入异常

   MSR CPSR_c,#(NoInt | SVC32Mode)  //从系统模式切换到管理模式

也可以在内核对异常或者中断响应时由硬件切换到异常模式

 

用户模式和系统模式不能由异常进入,也就是说要想进入系统模式,必须通过修改CPSR才能实现

MSR CPSR_c,#(NoInt | SYS32Mode)  //从管理模式切换到系统模式

 

4.当一个异常发生时处理器总是切换到ARM状态而黑Thumb状态

5.每一种异常与处理器的一种模式相对应,应用程序发生特定中断时,处理器内核立即跳转到向量表中的某个入口地址,执行相应的程序。每一种模式都有相对应的寄存器,保证引入引入异常时用户模式下的寄存器不被破坏

 

当处理器访问存储器失败时,进入数据访问中止模式(abort);

中断模式和快速中断模式分别对ARM处理器两种不同级别的中断作出响应;

处理器复位以后,进入管理模式,操作系统内核也通常处于这种模式;

系统模式是一种特殊的用户模式主要供操作系统的任务使用,允许对cpsr的完全读/写访问;

当处理器遇到没有定义的指令或处理器不支持该指令时,进入未定义模式;

用户模式运行应用程序。

 

6.特权模式可以访问系统的所有资源,也可以在各个模式之间进行切换

7.各种异常模式有自己的寄存器组,用户模式和系统模式的寄存器组是一样的,所以系统模式可以用户状态下相应的寄存器了,而不是使用异常模式下相应的寄存器,这样就可以保证当异常中断发生时任务的状态不被破坏

。用户模式通过异常可以进入异常模式,但是由用户模式进入系统模式并不是通过异常实现的。

8.需要任务保护的应用程序通常在用户模式下执行。 有些嵌入式应用程序可能完全运行在超级用户模式或系统模式下。进入除用户模式之外的模式是为了处理异常或访问特许资源。

 

在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。其中除了系统模式外的其他5种特权模式又称为异常模式。处理器模式可以通过软件来切换,在ARM Linux操作系统中,只有运行在内核态的程序才有可能更改处理器模式,用户态的程序是不能访问受操作系统保护的系统资源的,更不能直接进行处理器模式的切换。当需要处理器模式切换的时候,用户态的程序可以中断,内核态的中断处理程序开始响应并做出处理。

以上7种模式对应了系统中的中断向量表,这在移植操作系统的时候很重要。系统中所有的调度都是围绕着中断向量表展开的,在不用操作系统的系统中也就是通常所谓的裸机系统程序中,对于中断向量表的处理也很关键。这个向量表一般加载在CPU复位执行的开始地址的一段空间。在ARM Linux操作系统中,Boot Loader程序的移植中需要考虑这些问题,而一旦Boot Loader移植成功,运行起来以后,开发人员就不需要再考虑这个问题了。