Chinaunix首页 | 论坛 | 博客
  • 博客访问: 345602
  • 博文数量: 41
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 784
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-21 20:58
文章分类

全部博文(41)

文章存档

2017年(1)

2010年(1)

2009年(18)

2008年(21)

分类: LINUX

2008-11-23 19:10:45

在成功移植U-boot(支持NAND启动)到skyeye上后,发现需要进行相关的一些ARM基础知识的掌握,于是花了半天时间学习了ARM的基础知识,有哪类知识的需求,就进行相关知识的定位,感觉不错,效率蛮高的:-),先把相关重要的知识点记录下来。


ARM微处理器的工作状态
- 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令;
- 第二种为Thumb状态,此时处理器执行16位的、半字对齐的Thumb指令。

ARM体系结构的存储器格式
大端格式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中
小端格式:低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节

处理器模式
ARM微处理器支持7种运行模式,分别为:
─ 用户模式(usr):       ARM处理器正常的程序执行状态
─ 快速中断模式(fiq):   用于高速数据传输或通道处理
─ 外部中断模式(irq):   用于通用的中断处理
─ 管理模式(svc):       操作系统使用的保护模式
─ 数据访问终止模式(abt): 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。
─ 系统模式(sys):       运行具有特权的操作系统任务。
─ 未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
ARM微处理器的运行模式可以通过软件改变,也可以通过外部中断或异常处理改变。
大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式(Privileged Modes);其中除去用户模式和系统模式以外的5种又称为异常模式(Exception Modes),常用于处理中断或异常,以及需要访问受保护的系统资源等情况。

寄存器组织
ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可编程访问的,取决微处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个或两个状态寄存器都是可访问的

通用寄存器:
    通用寄存器包括R0~R15,可以分为三类:
    ─  未分组寄存器R0~R7;
    ─ 分组寄存器R8~R14
    ─  程序计数器PC(R15)

分组寄存器R8~R14
对于分组寄存器,他们每一次所访问的物理寄存器与处理器当前的运行模式有关。
对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。
对于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。
采用以下的记号来区分不同的物理寄存器:
  R13_
  R14_
其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。
寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。
由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。
R14也称作子程序连接寄存器(Subroutine Link Register)或连接寄存器LR。当执行BL子程序调用指令时,R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。与之类似,当发生中断或异常时,对应的分组寄存器R14_svc、R14_irq、R14_fiq、R14_abt和R14_und用来保存R15的返回值。
寄存器R14常用在如下的情况:
在每一种运行模式下,都可用R14保存子程序的返回地址,当用BL或BLX指令调用子程序时,将PC的当前值拷贝给R14,执行完子程序后,又将R14的值拷贝回PC,即可完成子程序的调用返回。以上的描述可用指令完成:
1、执行以下任意一条指令:
MOV       PC,LR 
BX        LR
2、在子程序入口处使用以下指令将R14存入堆栈:
  STMFD   SP!,{,LR}
    对应的,使用以下指令可以完成子程序返回:
  LDMFD   SP!,{,PC}
R14也可作为通用寄存器。
程序计数器PC(R15)
寄存器R15用作程序计数器(PC)。在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;在Thumb状态下,位[0]为0,位[31:1]用于保存PC;虽然可以用作通用寄存器,但是有一些指令在使用R15时有一些特殊限制,若不注意,执行的结果将是不可预料的。在ARM状态下,PC的0和1位是0,在Thumb状态下,PC的0位是0。

 程序状态寄存器
ARM体系结构包含一个当前程序状态寄存器(CPSR)和五个备份的程序状态寄存器(SPSRs)。备份的程序状态寄存器用来进行异常处理,其功能包括:
─  保存ALU中的当前操作信息
─  控制允许和禁止中断
─  设置处理器的运行模式
       |----条件码标志--||-------保留-------||-------------------控制位--------------|
       31   30  29  28   27  26  25  24   8  7   6   5    4     3    2    1    0

N

Z

C

V

.

.

.

.  .

I

F

T

M3

M4

M2

M1

M0

                                   程序状态寄存器格式

条件码标志(Condition Code Flags)
N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。
在ARM状态下,绝大多数的指令都是有条件执行的。
在Thumb状态下,仅有分支指令是有条件执行的。

N  当用两个补码表示的带符号数进行运算时,N=1 表示运算的结果为负数;N=0 表示运算的结果为正数或零;      
Z    Z=1 表示运算的结果为零;Z=0表示运算的结果为非零;      
C    可以有4种方法设置C的值:
─ 加法运算(包括比较指令CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。
─ 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。
─ 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。
─ 对于其他的非加/减运算指令,C的值通常不改变。      
V    可以有2种方法设置V的值:
─ 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。
─ 对于其他的非加/减运算指令,V的值通常不改变。      
Q    在ARM v5及以上版本的E系列处理器中,用Q标志位指示增强的DSP运算指令是否发生了溢出。在其他版本的处理器中,Q标志位无定义。     
控制位
PSR的低8位(包括I、F、T和M[4:0])称为控制位,当发生异常时这些位可以被改变。如果处理器运行特权模式,这些位也可以由程序修改。
─  中断禁止位I、F:
I=1   禁止IRQ中断;
F=1   禁止FIQ中断。
─  T标志位:该位反映处理器的运行状态。
对于ARM体系结构v5及以上的版本的T系列处理器,当该位为1时,程序运行于Thumb状态,否则运行于ARM状态。
对于ARM体系结构v5及以上的版本的非T系列处理器,当该位为1时,执行下一条指令以引起为定义的指令异常;当该位为0时,表示运行于ARM状态。
─  运行模式位M[4:0]:M0、M1、M2、M3、M4是模式位。这些位决定了处理器的运行模式
 
M[4:0]    处理器模式    可访问的寄存器      
0b10000    用户模式    PC,CPSR,R0-R14      
0b10001    FIQ模式    PC,CPSR, SPSR_fiq,R14_fiq-R8_fiq, R7~R0      
0b10010    IRQ模式    PC,CPSR, SPSR_irq,R14_irq,R13_irq,R12~R0      
0b10011    管理模式    PC,CPSR, SPSR_svc,R14_svc,R13_svc,,R12~R0,      
0b10111    中止模式    PC,CPSR, SPSR_abt,R14_abt,R13_abt, R12~R0,      
0b11011    未定义模式    PC,CPSR, SPSR_und,R14_und,R13_und, R12~R0,      
0b11111    系统模式    PC,CPSR(ARM v4及以上版本), R14~R0     

保留位
PSR中的其余位为保留位,当改变PSR中的条件码标志位或者控制位时,保留位不要被改变,在程序中也不要使用保留位来存储数据。保留位将用于ARM版本的扩展。
异常(Exceptions)
当正常的程序执行流程发生暂时的停止时,称之为异常,例如处理一个外部的中断请求。在处理异常之前,当前处理器的状态必须保留,这样当异常处理完成之后,当前程序可以继续执行。处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。
ARM体系结构中的异常,与8位/16位体系结构的中断有很大的相似之处,但异常与中断的概念并不完全等同。


ARM体系结构所支持的异常
异常类型    具体含义      
复位    当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常处理程序处执行。      
未定义指令    当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真。      
软件中断    该异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用。      
指令预取中止    若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。      
数据中止    若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常。      
IRQ(外部中断请求)    当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务。      
FIQ(快速中断请求)    当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。     

对异常的响应
当一个异常出现以后,ARM微处理器会执行以下几步操作:
1、将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SWI,指令 MOV PC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。
2、将CPSR复制到相应的SPSR中。
3、根据异常类型,强制设置CPSR的运行模式位。
4、强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

用伪码可以描述为:
R14_ = Return Link
SPSR_ = CPSR
CPSR[4:0] = Exception Mode Number
CPSR[5] = 0                 ;当运行于ARM工作状态时
If == Reset or FIQ then
                            ;当响应FIQ异常时,禁止新的FIQ异常
  CPSR[6] = 1    
CPSR[7] = 1
    PC = Exception Vector Address

异常向量(Exception Vectors)

异常向量表

地 址

异 常

进入模式

0x0000,0000

复位

管理模式

0x0000,0004

未定义指令

未定义模式

0x0000,0008

软件中断

管理模式

0x0000,000C

中止(预取指令)

中止模式

0x0000,0010

中止(数据)

中止模式

0x0000,0014

保留

保留

0x0000,0018

IRQ

IRQ

0x0000,001C

FIQ

FIQ

 







阅读(3118) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~