第二章处理器工作模式21概述S3C2410A采 用了非常先进的 ARM920T 内核,它是由 ARM(Advanced RISC Machines)公司研 制的22处理工作状态从程序员的角度上看,ARM920T可以工作在下面两种工作状态下的一种:ARM状态:执行32位字对齐的ARM指令;THUMB状态:执行16位半字对齐的THUMB指令在这种状态下,PC寄存器的第1位 来选择一个字中的哪个半字注意:这两种状态的转换不影响处理模式和寄存器的内容2.3切换状态进入Thumb状态进入Thumb状态,可以通过执行8乂指令,同时将操作数寄存器的状态位(0位)置1来实现 当从异常(IRQ,FIQ,UNDEF,ABORT,SWI等)返回时,只要进入异常处理前处理器处 于Thumb状态,也会自动进入Thumb状态进AARM状态进入ARM状态,可以通过执行BX指令,并且操作数寄存器的状态位(0位)清零来实 现当处理进入异常(IRQ,FIQ,RESET,UNDEF,ABORT,SWI等)这时,PC值保持在 异常模式下的l ink寄存器中,并从异常向量地址处开始执行处理程序存储空间的格式ARM920将存储器空间视为从0开始由字节组成的线性集合,字节0到3中保存了第一个字 节,字节4到7中保存第二个字,依此类推,ARM920T对存储的字,可以按照小端(Little endian)或大端(Big endian)的方式对待。
大端格式:在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中,如 图所示:高地址▲312401570字地址39101184567401230低地址小端格式:与大端存储格式相反,在小端存储格式中,低地址中存放的是字数据的低字节,高地址存放 的是字数据的高字节31231615a~T0亍出让2411109e97654432100低,址2.4指令长度指令可以是32位长度(在ARM状态下)或16位长度(在THUMB状态)数据类型ARM920T支持字节(8位),半字(16位)和字(32位)数据类型字必须按照4字节对 齐,半字必须是2字节对齐2.5操作模式ARM920T支持7种操作模式:用户模式(user模式),运行应用的普通模式;快速中断模式(fiq模式),用于支持数据传输或通道处理;中断模式(irq模式),用于普通中断处理超级用户模式(svc模式),操作系统的保护模式异常中断模式(abt模式),输入数据后登入或预取异常中断指令系统模式(sys模式),是操作系统使用的一个有特权的用户模式未定义模式(und模式),执行了未定义指令时进入该模式外部中断,异常操作或软件控制都可以改变中断模式。
大多数应用程序都时是在用户模 式下运行进入特权模式是为了处理中断或异常请求或操作保护资源服务的2.6寄存器ARM共有37个32位的寄存器,其中31个是通用寄存器,6个是状态寄存器但在同一时 间,对程序员来说并不是所有的寄存器都可见在某一时刻存储器是否可见(可被访问), 是由处理器当前的工作状态和工作模式决定的ARM状态寄存器在ARM状态下,任何时刻都可以看到16个通用寄存器,1或2个状态寄存器在特权模 式(非用户模式)下会切换到具体模式下的寄存器组,其中包括模式专用的私有(banked) 寄存器图2—3显示了在每个模式下哪种寄存器是可见的:私有寄存器上都有一个黑三角标 记ARM状态寄存器系列中含有16个直接操作寄存器:R0到R15除了R15外其他的都是通 用寄存器,可用来存放地址或数据值除此之外,实际上有17个寄存器用来存放状态信息 具体说明如下:寄存器14:专职持有返回点的地址,在系统执行一条“跳转并链接(link) ”(BL)指令的时 候,R14将收到一个R15的拷贝其他的时候,它可以用作一个通用寄存器相应的它 在其他模式下的私有寄存器R14_svc,R14_irq,R14_fiq, R14_abt和R14_und都同样用 来保存在中断或异常发生时,或时在中断和异常中执行7BL指令时,R15的返回值。
寄存器15是程序计数器(PC)在ARM状态下,R15的bits[1:0]为0,bits[31:2]保存7PC的 值在Thumb状态下,bits[0]为0同时bits[31:1]保存7PC值寄存器16是CPSR (当前程序状态寄存器),用来保存当前代码标志和当前处理器模式位FIQ模式拥有7个私有寄存器R8-14 (R8_fiq-R14_fiq)在ARM状态下,多数卅处理都 不需要保存任何寄存器用户、中断、异常中止,超级用户和未定义模式都拥有2个私有寄 存器,R13和R14允许这些模式都可拥有1个私有堆栈指针和链接(link)寄存器ARM状态下寄存器集系蜿和用户 FIQ 超级用户异常中止皿状态下程序状态寄存理CPSR:添PSK i田CPSRTHUMB 状态寄存器THUMB状态寄存器是ARM状态寄存器的一个子集程序员可以直接操作8个通用寄存 器R0-R7,同样可以这样操作程序计数器(PC),堆栈指针寄存器(SP),链接(link)寄 存器(LR),和CPSR它们都是各个特权模式下的私有寄存器如下图所示:ARM920T包含一个当前程序状态寄存器(CPSR)和五个备份的程序状态寄存器 (SPSRs),备份的程序状态寄存器用来进行异常处理,这些寄存器的功能包括:保存ALU当前操作的有关信息控制中断的允许和禁止 设置处理器的运行模式程序状态寄存器的组成如图所示:iHums状态F的寄存露集THUMB状态下程序寄存卷影于寄存器ARM和THUMB状态寄存器间的关系:-THUMB态下R0-R7和ARM状态下R0-R7是等同的-THUMB状态的CPSR和SPSRs 跟ARM状态的CPSR 和SPSRs是等同的-THUMB状态下的SP映射在ARM状态下的R13上-THUMB状态下的LR映射在ARM状态下的R14上-THUMB状态下的程序计数器映射在ARM状态下的程序计数器上(R15)THUMB ARM 状态R0RDR1R1►R2R2 IR3R3R4R4AR5R5►R6R6 IR7R7R6RQRIOR11R12Stack Pointer (SPJStack Pointer (R13; Link register -(LR)Link register>(Ri4)Program Counter CPC)CPSRProgram Counter [R1 5) CPSR►SPSRSPSR山」甥5司中.1工在THUMB状态下访问高地址寄存器:在THUMB状态下寄存器R8-15(高地址寄存器)不是标准寄存器集。
但是,汇编语言的程 序员可以访问它们并用它们作快速暂存向R8-R15写入或读出数据,可以采用MOV指令的某个变型,从R0-R7(低地址寄存器)的 某个寄存器传送数据到到高地址寄存器,或者从高地址寄存器传送到低地址寄存器还可以 采用CMP和ADD指令,将高地址寄存器的值与低地址寄存器的值相进行比较或相加2・7程序寄存器状态ARM920T具有一个当前程序状态寄存器(CPSR),另外还有5个保存程序状态寄存 器(SPSRs)用于异常中断处理这些寄存器的功能有: 保留最近完成的ALU操作的信息; 控制中断的使能和禁止; 设置处理器的操作模式下图显示了程序状态寄存器的位定义:2.7.1条件码标志N、Z、C、V均为条件码标志位它们的内容根据算术或逻辑运算的结果所改变,并且 可用来作为一些指令是否运行的检测条件在ARM状态下,绝大多数的指令都是有条件执行的,详情请看表3-2; 在Thumb状态下,仅有分支指令是有条件执行的,详情请看图3-462.7.2控制位PRS的低8位(包括I、F、T和M[4:0])称为控制位,当发生异常时这些位会被改变,如果处 理器在特权模式下运行,这些位也可以由程序修改T标记位该位反映处理器的运行状态。
该位被设置为1时,处理器执行在THUMB状态,否 则执行在ARM状态这些由外部信号TBIT反映出来注意软件绝不能改变CPSR的TBIT状态如果这样做,处理器将会进入一种不可预 知的装态中断禁止位I、F/位为中断禁止位,当它们被置1时可以相应地禁止IRQ和FIQ中断 运行模式位M4,M3,M2,M 1和M0位(M[4:0])是模式位,它们决定了处理器的操作模式,如下 表2-7所示并不是所有的组合都决定一个有效的处理器模式只有那些明确定义 的值才能被采用用户必须意识到任何一种非法的值写入模式位,处理器都会进 入到以种不可重获的状态,如果发生这种情况,就要进行复位保留位PSR中的其余位为为保留位,当改变PSR中的条件码标志位或者控制位时,必须确保保留 位不被改变,在程序中也不要使用保留位来存储数据值PSR模式位的值M[4:0]模式可视的THUNM状态寄存器可视的ARM状态寄存器10000用户模式R7..R0, LR, SP PC, CPSRR14..R0, PC, CPSR10001FIQ模式R7..R0, LR_fiq, SPJiq PC, CPSR, SPSRJiqR7..R0. R14_fiq..R8_fiq, PC, CPSR, SPSRJiq100WIRQ模式R7..R0, LR_irq, SP_irq PC, CPSR, SPSRJrqR12..R0, R14_irq, R13_irq, PC, CPSR, SPSRJrq10011超级用户模式R7..R0, LR_svc, SP_svc. PC, CPSR, SPSR_svcR12..R0, R14_svc, R13_svc, PC, CPSR, SPSR_svc10111中止R7..R0, LR_abt, SP_abt, PC, CPSR, SPSR_abtR12..R0, R14_abt, R13_abt, PC, CPSR, SPSR_abt11011未定义模式R7..R0 LR_und, SP_und, PC, CPSR, SPSR_undR12..R0, R14_und, R13_und, PC,CPSR11111系统模式R7..R0. LR, SP PC. CPSRR14..R0, PC, CPSR2.8异常当正常的程序执行流程被临时中断时,称为产生了异常。
例如程序执行转向一个外设的 中断请求在异常能被处理前,当前处理器的状态必须被保留,这样按处理程序完成时就能 恢复原始的程序有可能同时产生好几个异常,如果出现这种情况,就应该按固定的顺序处理详情请看后面 对异常优先级的说明2.8.进入异常时的行为当一个异常发生时,ARM920T将进行以下步骤:1. 将下一条指令的地址保存到相应的Link寄存器中如果异常是从ARM状态进入的,下一条指令的地址(根据异常的类型,数值为当前PC+4或PC+8,具体请看表2-8)拷贝 到ULink寄存器如果异常是从THUMB状态进入,那么写入到1 ink寄存器的值是当前的 PC偏移一个值这表示异常处理程序不需要关心是从哪种状态进入异常的例如,在 SWI情况下,无论是来自什么状态,处理程序只要采用MOVS PC, R14_svc语句,总可 以返回到原始程序的下一条语句2. 拷贝CPSR到相应的SPSR;3. 根据异常类型强制改变CPRS模式位的值;4. 令PC的值指向异常处理向量所指的下一条指令这时也可能设置中断禁能标志,以防止不可估计的异常嵌套发生当处理器处于Thumb状态时发生了异常,当?载入异常矢量所在地址时,它将自动地 切换到ARM状态。
2.8.2离开异常处理时的行为当完成异常处理时,处理程序应该:1. 将Link寄存器,减去相应的偏移量,赋给PC (偏移量的值由异常的类型决定);2. 拷贝回SPSR至UCPSR;3. 如果在进入中断时设置了中断禁止标志,清除它注意,你不需要特别指明切换回THUMB状态因为原来的CPSR被自动地保存到了SPSR2.8.3异常进入/退出的总结表2-8总结了在进入异常时,保留到相应的R14中的PC的值,和推荐使用的退出异常处理时采用的语句返回指兮 '进入异常时RM的值MotesARM R14_kTHUMB R14_XBLMOV PC, R14PC + 4PC +21SWIMOVS PC, R14_s^cPC + 4PC + 21UDEFMOVS PC. ^14_undPC + 4PC+ 21FIQSUBSPC.R14_fiq, #4PC+ 4PC+ 42IRQSUBSPC?Rl4..irqr^PC+ 4PC+ 42PABTSUBS PC, R14_abL#4PC + 4PC+ 41DABTSUBS PC, R14_abtPC + SPC + 83RESETNA4注意:1, 这里PC所赋的是BL/SWI/未定义模式等指令所取的地址,它们在预取的阶段就被中断了。
2, 这里PC所赋的是由于FI Q或IRQ取得了优先权,而没有来得及得到执行的指令地址3. 这里PC所赋的地址是L oad或Sto re指令的地址,它们在执行时产生了数据的异常中断4. 在R14_svc复位之前保存的数值是不可预知的2.8.4 FIQ 中断FIQ (快速中断请求)异常通常是用来支持数据传输和通道操作的,在ARM状 态下,它具有充分的私有(私有)寄存器,用来减少寄存器存取的需要(从而减少进入中 断前的“上下文切换”的工作)FIQ中断是由外部设备通过拉低nFIQ引脚触发的通过对ISYNC输入引脚的控制nFIQ 可以区别同步或异步的传输情况当ISYNC为低电平,nFIQ和nIRQ将被认为是异步的, 中断之前产生同步周期延长的话会影响处理器的流程不管是ARM还是Thumb状态下的异常,FIQ处理程序都可以通过执行以下的语句来退出 中断处理:SUBS PC, R14_fiq, #4通过设置CPSR的F标记位可以禁止FIQ中断(但是要注意到在用户模式下是不可行的) 如果F标记位已经清除,ARM920T在每个指令的最后检测来自FIQ中断同步器的低电输出2.8.5 1公中断旧Q(中断请求)异常是由nIRQ输入低电平引发的普通中断。
旧Q中断相对FIQ中断来说 是优先级低,当一个FI Q中断序列进入时它将被屏蔽旧Q也可以通过设置CPRS中的T标 志来禁止,同样也不能够在用户模式中这样做(只能在特权模式下这样做)无论IRQ发生在ARM或者Thumb状态下,都可以采用以下语句来退出中断处理:SUBS PC, R14_irq, #42.8.6 Abort异常中止异常中止表示当前存储访问不能完成通过外部的ABORT输入信号来告知内核 ARM920T在每次的存储操作中检测该异常是否发生有两种类型的异常中止:预取指异常中断:指令预取时产生数据异常中断:数据访问时产生如果产生预取指中止,所取得的指令将会被标志为无效的,但是异常不会立即发生,要 直到取指到达了管道的头部才会发生如果这些指令不执行 例如在管道内发生了分支跳 转,那么异常就不会发生了如果产生数据异常中止,根据指令类型进行操作:简单数据传输指令(LDM,STR)写回改变的基址[变址]寄存器:异常中断处理器必须清 楚这些取消交换指令尽管它还没执行;数据块传输指令(LDM, STM)完成如果设置为写回,基址已经校正如果指令超出了 数据的写基址(传输目录中有它的基址),就应该防止写超出。
在中止异常将发生 时,所有寄存器的覆盖写入都是禁止的这意味着特别是R15 (经常是最后一个改 变的寄存器)的值将在中止的LDM指令中保留下来Abort机制使得页面虚拟存储器机制得以实现在采用虚拟存储器的系统中,处理器可 以产生任意的地址当某个地址的数据无效,MMU (存储器管理单元)将产生一个abort中 止这样abort的处理程序就必须找出异常中断的原因,使要求的数据可用,并重试被中止 掉的指令应用程序也就不需要了解实际可用存储空间的大小,也不需要了解异常中断对它 的影响在完成了异常中断的处理后,通过以下语句退出中断处理(与ARM状态还是Thumb状 态无关):SUBS PC, R14_abt, #4 ;预取指abortSUBS PC, R14_abt, #8 ;数据abort通过执行该语句,就恢复了?和CPSR,并重试被中断的指令2.8.7软件中断SWI(软件中断指令)用来进入超级用户模式,通常用于请求特殊的超级用户功能SWI的处理程序通过执行以下语句,退出异常处理(ARM或Thumb):MOV PC, R14_svc通过执行该语句,就恢复了 PC和CPRS,并返回至U SWI后面的指令上。
前面提到的nFIQ, nIRQ, ISYNC, LOCK, BIGEND,和ABORT引脚只存在于ARM920TCPU的内核上2.8.8未定义指令当ARM920T遇到一个它不能执行的指令,它将产生一个未定义指令陷阱这个机制是软件 仿真器用来扩展Thumb和ARM指令集用的在完成对未知指令的处理后,陷阱处理程序应该执行以下的语句退出异常处理(无论是ARM或Thumb状态):MOVS PC, R14_und通过执行该语句,恢复了CPSR,并返回执行未定义指令的下一条指令2.8.9异常中断向量异常中断的向量地址如下图所示:地址异常中断类型进入时处理器模式0x00000000ResetSupervisor0x00000004Undefined instructionUndefined0x00000008Software InterruptSupervisor0x00000000Abort (prefetch)Abort0x00000010Abort (data)Abort0x00000014ReservedReserved0x00000018IRQIRQ0x00000010FIQFIQ2.8.10异常中断优先级当多个异常中断同时发生时,处理器根据一个固定的优先级系统来决定处理它们的顺序。
最高优先级:1. 复位2. 数据 abort3. FIQ4. IRQ5. 预取指abort最低优先级:6.未定义指令,软件中断注意,并非所有的异常中断都可能同时发生:未定义指令和软件中断是相互排斥的,因为它们都对应于当前指令的唯一的(非重叠的) 解码结果如果一个数据abort和FIQ中断同时发生了,并且此时的FIQ中断是使能的,ARM920T 先进入到数据abort处理程序,然后立即进AFIQ向量从FIQ正常的返回后,数据abort的处 理程序才恢复执行将数据abort设计为比FIQ拥有更高的优先级,可以确保传输错误不能逃 避检测这种情况下进入FIQ异常处理的时间延长了,这一时间必须考虑到FIQ中断最长反 应时间的计算中去2.8.11中断反应时间最坏情况下的FI Q中断的反应时间,假设它是使能的,包括通过同步器最长请求时间(如 果是异步则是Tsyncmax),加上最长的指令执行时间(Tldm,LDM指令用于载入所有的寄 存器,因此需要最长的执行时间),加上数据abort进入时间(Texc),加上进入FIQ处理 所需要的时间(Tfiq)在这些时间的最后,ARM920T会执行位于0x1C的指令。
Tsyncmax是3个处理器周期,Tldm是20个,Texc是3个,Tfiq是2个周期也就 是总是28个处理周期在一个20MHZ的处理时钟的系统里,它使用的时间超过1.4微妙 最长的旧Q反应时间的计算方法是类似的,但是必须考虑到更高优秀级的FIQ中断可以推 迟任意长时间进入IRQ中断处理最小的FIQ或 旧Q的反应时间包括通过同步器的时间 Tsyncmax加上Tfiq它是4个处理器周期2.8.12复位当nRESET信号为低,ARM920T放弃任何指令的执行,并从增加的字地址处取指令当nRESET信号变高时ARM920T进行如下操作:1. 将当前的PC值和CPSR值写入R14_svc和SPSR_svc已保存的PC和SPSR的值是未知的2. 强制M[4:0]为10011 (超级用户模式),将CPSR中的T和“F”位设为1,并将T位清零;3. 强制PC从0x00地址取得下一条指令4. 恢复为ARM状态开始执行。