Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5636305
  • 博文数量: 922
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11226
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(922)

文章存档

2023年(1)

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类:

2012-05-05 16:49:29

原文地址:1.4 ARM处理器工作模式 作者:nuaagcj

1.4  ARM处理器工作模式

这里介绍的是ARM处理器的工作模式、通用寄存器、异常中断和存储系统设计等。这些是从事ARM开发的基本知识,尤其对于BSP的开发,甚至Boot Loader及操作系统的移植来说都是至关重要的。如果对ARM处理器的基础知识比较熟悉的话,可以直接跳过这一小节。

1.4.1  ARM和Thumb状态

ARM体系结构在V4T及其以上版本定义了称为Thumb指令集的16位指令集。Thumb指令集的功能是32位ARM指令集的功能子集。Thumb指令集在性能和代码大小之间提供了出色的折中。

正在执行Thumb指令集的处理器是工作在Thumb状态下的。同样,正在执行ARM指令集的处理器是工作在ARM状态下。ARM状态下的处理器不能执行Thumb指令,在Thumb状态下的处理器也不能执行ARM指令。必须确保处理器不接受对当前状态来说为错误指令集的指令。每个指令集都包括切换处理器状态的指令。ARM处理器总是在ARM状态下开始执行代码。ARM处理器支持7种处理器模式,取决于体系结构版本。

1.4.2  ARM处理器模式

ARM处理器共有7种运行模式如表1-2所示。

表1‑2  ARM处理器运行模式

处理器模式

描    述

用户模式(User,usr)

正常程序执行的模式

快速中断模式(FIQ,fiq)

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

外部中断模式(IRQ,irq)

用户通常的中断使用

特权模式(Supervisor,sve)

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

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

用于虚拟存储及存储保护

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

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

系统模式(System,sys)

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

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

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

1.4.3  ARM寄存器介绍

在移植操作系统的时候,尤其是在移植Boot Loader的时候必须了解ARM处理器的寄存器。在Boot Loader里有一段很重要的处理器初始化程序是用ARM汇编写的,有几个关键参数需要传递,关于这些参数在后面介绍Boot Loader时会有详细的描述。

ARM处理器含有37个寄存器,这些寄存器包括以下两类寄存器。

(1)31个通用寄存器:包括程序计数器PC等,这些寄存器都是32位寄存器。

(2)6个状态寄存器:状态寄存器也是32位的寄存器,但是只使用了其中的12位。

1.通用寄存器

在ARM处理器的7种模式下都有一组对应的寄存器组。在任意时刻,可见的寄存器组包括15个通用寄存器R0~R14、一个或两个状态寄存器和PC。在所有的寄存器中,有些是各种模式下共用的同一个物理寄存器,有些是各种模式自己独立拥有的物理寄存器。详细如表1-3所示。

表1‑3  ARM物理寄存器

用户模式

系统模式

特权模式

中止模式

未定义指令模式

外部中断模式

快速中断模式

R0

R0

R0

R0

R0

R0

R0

R1

R1

R1

R1

R1

R1

R1

R2

R2

R2

R2

R2

R2

R2

R3

R3

R3

R3

R3

R3

R3

R4

R4

R4

R4

R4

R4

R4

R5

R5

R5

R5

R5

R5

R5

R6

R6

R6

R6

R6

R6

R6

R7

R7

R7

R7

R7

R7

R7

R8

R8

R8

R8

R8

R8

R8_fiq

R9

R9

R9

R9

R9

R9

R9_fiq

R10

R10

R10

R10

R10

R10

R10_fiq

R11

R11

R11

R11

R11

R11

R11_fiq

R12

R12

R12

R12

R12

R12

R12_fiq

R13

R13

R13_svc

R13_abt

R13_und

R13_irq

R13_fiq

R14

R14

R14_svc

R14_abt

R14_und

R14_irq

R14_fiq

PC

PC

PC

PC

PC

PC

PC

CPSR

CPSR

CPSR

CPSR

CPSR

CPSR

CPSR

SPSR_svc

SPSR_abt

SPSR_und

SPSR_irq

SPSR_fiq

通用寄存器通常又可以分为下面3类。

n  未备份寄存器:包括R0~R7。

n  备份寄存器:包括R8~R14。

n  程序计数器PC:即R15。

1)未备份寄存器R0~R7

对于每个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器,在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏。未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未备份寄存器。

2)备份寄存器R8~R14

备份寄存器中的每个寄存器对应于两个不同的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记做R8_fiq和R9_fiq,当使用用户模式下的寄存器时,寄存器R8和寄存器R9分别记做R8_usr和R9_usr等。在这两种情况下使用的是不同的物理寄存器,系统没有将这几个寄存器用于任何的特殊用途。中断处理非常简单,仅仅使用R8~R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程很迅速。

对于备份寄存器R13、R14来说,每个寄存器对应于6个不同的物理寄存器,其中的一个是用户模式和系统模式共用的,另外的5个则对应于其他5种处理器模式,采用下面的方法来标识。

R13_mode,其中mode是usr、svc、abt、und、irq和fiq的一种。

R13通常用做堆栈指针。每一种模式都拥有自己的物理R13。程序初始化R13,使其指向该模式专用的栈地址。当进入该模式时,可以将需要使用的寄存器保存在R13所指的栈中,当退出该模式时,将保存在R13所指的栈中的寄存器值弹出。这样就实现了程序的现场保护。

寄存器R14又被称为连接寄存器(LR),在ARM中有下面两种特殊用途。

① 每一种处理器模式在自己的物理R14中存放当前子程序的返回地址。当通过BL或者BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,就实现了子程序返回。具体的汇编调用方式是:MOV PC,LR或BX LR。

② 当发生异常中断的时候,该模式下的特定物理R14被设置成该异常模式将要返回的地址。

3)程序计数器PC→R15

由于ARM处理器采用的是流水线机制,当正确地读取了PC值时,该值为当前指令地址值加8字节。也就是说对于ARM指令来说,PC指向当前指令的下两条指令的地址,由于ARM指令是字对齐的,PC值的第0位和第1位总是为0。

当成功地向PC写入一个地址数值时,程序将跳转到该地址执行。

在ARM系统进行代码级调试时对于R13、R14及PC的跟踪很重要,可以用来分析系统堆栈及PC指针值的变化等。

2.程序状态寄存器

CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。每一种模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常退出时,可以用SPSR中保存的值来恢复CPSR。CPSR的具体格式如下。

31

30

29

28

27

26

7

6

5

4

3

21

0

N

Z

C

V

Q

DNMLRAZ

I

F

I

M4

M3

M

M0

1)条件标志位

N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令可以依据CPSR中的这些标志位来选择性地执行。各条件标志位的具体含义,如表1-4所示。

表1‑4  CPSR标志位含义

标  志  位

含    义

N

本位设置成当前指令运算结果的bit[31]的值

当两个补码表示的有符号整数运算时,N=1表示运算的结果为负数,N=0 表示结果为正数或零

Z

Z=1表示运算结果是0,Z=0表示运算结果不是零

对于CMP指令,Z=1表示进行比较的两个数大小相等

C

在加法指令中(包括比较指令CMN),结果产生进位了,则C=1,表示无符号数运算发生上溢出,其他情况下C=0

在减法指令中(包括比较指令CMP),结果产生借位了,则C=0,表示无符号数运算发生下溢出,其他情况下C=1

对于包含移位操作的非加/减法运算指令,C中包含最后一次被溢出的位的数值,对于其他非加/减法运算指令,C位的值通常不受影响

V

对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出

其他的指令通常不影响V位

2)Q标志位

在ARM v5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的DSP指令是否发生了溢出,同样的,SPSR的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。

3)CPSR中的控制位

CPSR的低8位I、F、T及M[4:0]统称为控制位,当异常中断发生时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。

① I中断禁止位

当I=1时禁止IRQ中断。

当F=1时禁止FIQ中断。

通常一旦进入中断服务程序可以通过置位I和F来禁止中断,但是在本中断服务程序退出前必须恢复原来I、F位的值。

② T控制位,用来控制指令执行的状态,即说明本指令是ARM指令还是Thumb指令。对于不同版本的ARM处理器,T控制位的含义是有些不同的。

对于ARM v3及更低的版本和ARM v4的非T系列版本的处理器,没有ARM和Thumb指令的切换,所以T始终为0。

对于ARM v4及更高版本的T系列处理器,T控制位含义如下。

当T=0,表示执行ARM指令。

当T=1,表示执行Thumb指令。

对于ARM v5及更高的版本的非T系列处理器,T控制位的含义如下。

当T=0表示执行ARM指令。

当T=1表示强制下一条执行的指令产生为定义指令中断。

③ M 控制位

控制位M[4:0]称为处理器模式标识位,具体说明如表1-5所示。

表1‑5   CPSR 处理器模式位

M[4:0]

处理器模式

可访问的寄存器

0b10000

User

PC,R14~R0,CPSR

0b10001

FIQ

PC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq

0b10010

IRQ

PC,R14_irq~R13_irq,R12~R0,CPSR,SPSR_irq

0b10011

Supervisor

PC,R14_svc~R13_svc,R12~R0,CPSR,SPSR_svc

0b10111

Abort

PC,R14_abt~R13_abt,R12~R0,CPSR,SPSR_abt

0b11011

Undefined

PC,R14_und~R13_und,R12~R0,CPSR,SPSR_und

0b11111

System

PC,R14~R0,CPSR(ARM v4及更高版本)

CPSR的其他位用于将来ARM版本的扩展,程序可以先不操作这些位。

1.4.4  ARM体系结构的异常中断

ARM体系结构中的异常中断是ARM处理器的核心,而对于异常中断的处理则是嵌入式操作系统的核心。一般来说ARM体系结构中程序的执行通常由以下3种方式来控制。

n  在正常程序执行时,每执行一条ARM指令,PC的值加4字节,每执行一条Thumb指令,PC加2字节,整个过程是按顺序执行。

n  通过跳转指令,程序可以跳到特定的地址标号执行,或者跳转到特定的子程序处执行。常用的跳转指令有 B、BL、BX、BLX等。

n  当异常中断发生时,系统执行好当前指令后,跳转到相应的异常中断处理程序处执行。当异常中断执行后,程序返回到发生中断指令的下一条指令处执行。当然这里需要注意程序现场的保护和恢复。

ARM体系结构中异常中断的种类,具体如表1-6所示。

表1‑6  ARM异常中断

异常中断名称

含    义

复位(Reset)

当处理器复位引脚有效时,系统产生复位,程序跳转到复位异常中断处理程序处执行,复位异常中断的优先级是最高优先级的中断。通常复位产生有下面几种情况:系统加电时、系统复位时、各种不同的ARM处理器的复位有一些区别的,具体的参见后面的实例中的描述

未定义的指令

Undefined instruction

当ARM处理器或者系统中的协处理器认为当前指令未定义时,产生该中断,可以通过该异常中断仿真浮点向量运算

软件中断

Software Interrupt SWI

这是由用户定义的中断指令,可用于用户模式下的程序调用特权操作指令

数据访问中止

Data Abort

数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常中断

外部中断请求

IRQ

当处理器的外部中断请求引脚有效,或者CPSR寄存器的I控制位被清除时,处理器产生外部中断请求,应用中对于IRQ的中断处理是比较关键的技术

快速中断请求

FIQ

当处理器的外部中断请求引脚有效,或者CPSR寄存器的F控制位被清楚时,处理器产生外部中断请求

ARM处理器对异常中断的响应过程是首先保存处理器当前状态、中断屏蔽位及CPSR寄存器中的各个条件标志位。这是通过将当前程序状态寄存器CPSR的内容保存到将要执行的异常中断对应的SPSR寄存器中实现的。其次设置当前程序状态寄存器CPSR中相应的位。再次将寄存器LR_mode(R14_mode)设置成返回地址。最后将PC设置成该异常中断的中断向量地址,从而跳转到对应的中断处理程序处执行。

ARM处理器从异常中断程序中返回的过程:首先恢复被中断程序的处理器状态,也就是将SPSR_mode 内容复制到CPSR。然后返回到发生异常中断指令的下一条指令处执行,即将LR_mode(R14_mode)寄存器的内容复制到PC中。

1.4.5  ARM体系结构中的存储系统

在介绍ARM体系结构中的存储系统之前,先简单介绍一下ARM编程模型中与存储系统相关的一些概念。ARM体系结构使用单一的平板地址空间,该地址空间的范围大小为232个8位字节。这些字节单元的地址是一个无符号的32位数值,其取值范围为0~232-1。有了存储系统的寻址范围之后,还需要讨论一下实际存储系统中的大/小端格式及ARM体系结构中的MMU等概念。

1.ARM存储系统中的大/小端

在ARM体系结构中,每个字单元包含4字节单元或者2个半字单元,1个半字单元包含2字节单元。但是在字单元中,4字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式,通常称为大端格式或者小端格式,也就是big-endian格式和little-endian格式。大/小端的选择对于不同的芯片来说有一些不同的选择方式,一般都可以通过外部的引脚或内部的寄存器来选择。具体要参见处理器的数据手册。

在大端模式下的存储格式如下所示。

31                  24 23                 16 15                 8 7                 0

字单元A

半字单元A

半字单元A+2

字节单元A

字节单元A+1

字节单元A+2

字节单元A+3

而在小端模式下的存储格式如下所示。

31                24 23                16 15                 8 7                   0

字单元A

半字单元A+2

半字单元A

字节单元A+3

字节单元A+2

字节单元A+1

字节单元A

非对齐的存储访问操作:在ARM体系结构中通常希望字单元的地址是字对齐的(地址的低两位是0b00),半字单元的地址是半字对齐的(地址的最低位为0b0),但在存储单元中地址没有遵守上述的对齐规则,称为非对齐的存储访问操作,在ARM体系结构的伪指令集中有专门的align指令来指定对齐格式。

在ARM体系结构中允许指令预取,在CPU执行当前代码的同时,可以从存储器中预取其后若干条指令,具体预取多少条指令则由不同的ARM处理器内核的实现来决定。

2.ARM体系结构中的MMU

另外一个重要的概念就是MMU(Memory Manager Unit)。ARM存储系统的体系结构适应不同的嵌入式系统应用,它的差别很大。最简单的存储系统使用平板式的地址映射机制,地址空间的分配是固定的,系统中各部分都使用物理地址,这样的处理器不带MMU。而一些复杂的系统可能包含一种或多种下面提到的技术,从而提供功能更为强大的存储系统。

(1)系统中可能包含多种类型的存储器件,一般都有Flash、SRAM、SDRAM等接口。

(2)使用指令/数据cache及Write Buffer技术缩小处理器和存储系统速度差别,从而提高系统的整体性能。

(3)系统中包含有MMU单元。

MMU使用内存映射技术实现虚拟空间到物理空间的映射,这种映射机制对于嵌入式系统尤其重要。通常程序放在ROM/Flash中,这样系统掉电后程序能够保存。但是ROM/Flash比SDRAM速度慢很多,而且在嵌入式系统中,中断向量表存放在RAM中,不过利用内存映射就可以解决这种问题。在系统加电时将ROM/Flash地址映射到

0x00000000,在0x00000000地址处存放启动代码,来完成系统设备的初始化,之后再把内核程序加载到SDRAM,然后把地址映射到SDRAM的地址,跳转到SDRAM地址运行就可以了。

针对具有MMU的ARM处理器可以移植Linux for ARM操作系统,针对没有MMU的处理器,一般都是移植uClinux for ARM。比如说Samsung公司的S3C4510、S3C2510都是不带MMU的处理器,只能移植uClinux,而针对S3C2410、PXA27x、OMAP591x等带有MMU单元的ARM处理器通常都可以移植Linux操作系统。带有MMU的处理器内部都有用于存储管理的系统控制协处理器CP15,在移植嵌入式操作系统的Boot Loader时,必须要对存储管理单元进行初始化设置。

3.快速上下文切换技术

FCSE(Fast Context Switch Extension)技术通过修改系统中不同进程的虚拟地址,避免在进程间切换时造成的虚拟地址到物理地址的重映射,从而提高系统的性能。通常FCSE位于CPU和MMU之间,其责任就是将不同进程使用的相同虚拟地址映射为不同的虚拟空间,使得在上下文切换时无须重建TLB等。

相信通过对ARM处理器架构的简单介绍,读者可以对ARM处理器有大体地了解,如果要继续深化研究,可以到ARM公司的网站去下载对于每个体系结构的详细技术说明文档。对于MMU部分更为详细的介绍,推荐参考《ARM体系结构与编程》(杜春雷编著)一书。接下来介绍一下运行在ARM处理器之上的几种常用的嵌入式软件操作系统。

阅读(1834) | 评论(0) | 转发(0) |
0

上一篇:学习

下一篇:misc tips when coding

给主人留下些什么吧!~~