之前,一直都在看arm的驱动开发,最近看了ucos,一起也开端对arm的架构有了更深化一点的了解。大学学微机原理的时分学的是x86的架构,它和arm仍是有挺多差异的。下面就收拾一些自己的所学和在网上转载的关于arm架构的内容。有一本很好的讲arm架构的书:《ARM System Developers Guide》。
从编程人员的视角来看,arm核是由数据总线衔接的功用单元组成,如下图所示:
数据经过数据总线流向处理器中心,这儿的数据可所以即将履行的指令,也可所以数据项.上面的图是Von Neumann体系的arm核,数据项和指令共用同一总线.而哈佛结构体系的arm核就会用两个不同的总线.就像一切的RISC处理器,arm选用load-store体系结构.也就是说它含有两条不同的指令类型来收支处理器.load指令将数据从内存拷贝到寄存器,store指令是将数据从寄存器拷贝到内存.没有直接操作内存中数据的数据处理指令.数据的处理离不开寄存器.
ARM指令一般有两个源寄存器,Rn和Rm,和一个意图寄存器,Rd. ARM的一个重要特性是Rm能够在送入ALU之前被桶型移位器做预处理,这样就会有许多办法的表达式和寻址办法. 后边再写博客记载一下arm中的指令集。
下面介绍ARM处理器的几个要害重量:寄存器,当时程序状况寄存器和流水线
一、寄存器。
arm核一共有37个寄存器,有7种作业形式。其间在任一种作业形式下,可见的寄存器一般有18个(在user/system形式下可见的是17个)。别的,某几个寄存器(sp、lr、spsr)在不同的形式下对应的是不同的寄存器,所以总数加起来共有37个。一切的寄存器都是32bit巨细.
18个活动的寄存器包括:16个数据寄存器和2个程序状况寄存器.
(1)数据寄存器由r0–r15标明. 其间r0-r12是通用寄存器,r13-r15是三个特别的寄存器。
r13一般用作栈指针(sp),存储当时处理器作业形式下的栈顶;
r14被称作链接寄存器(lr),当产生函数调用时寄存当时的pc指针,作为子程序的回来地址;
r15被称作程序计数器(pc),保存被处理器预取的下一条指令的地址.
这三个寄存器,在写汇编句子的时分都不必r13这种来标明,都是用sp、lr、pc来标明的。
(2)两个程序状况寄存器:cpsr和spsr. 处理器的当时作业形式决议了哪些寄存器是可见的.
cpsr:当时程序状况寄存器。ARM核运用cpsr来显现和操控内部的操作.通用程序状况寄存器的内部如下:
cpsr分为四个域,每个域有8位的宽度:flags,status,extension和control.control域包括处理器形式和状况以及中止屏蔽位.flags域包括condition flags.处理器形式决议了当时哪些寄存器是可用的以及cpsr自身的拜访权限.
当产生反常时,arm会主动将cpsr保存到spsr寄存器中。
二、 处理器形式
处理器形式分为特权形式和非特权形式:特权形式对cpsr有彻底的读写操控.而非特权形式只能读cpsr的control域可是仍能够读写condition flags.一共有7种处理器形式:六种特权形式(abort,fiq,irq,svc,system和undefined)和一种非特权形式(user).
abort:当企图拜访内存失利时处理器会进入abort形式;
fiq和irq对应ARM处理器的两种中止等级, irq是一般的中止形式,fiq是快速中止形式。
svc是体系reset后进入的默许形式,也是os kernel作业的形式;
system形式是user形式的特别版别,它有对cpsr的读写操控.
undefined形式在处理器遇到不决以的指令或许不支持的操作时运用.
user形式在应用程序下运用.
在不同的形式下,有不同的Banked registers。所谓的banked register 就是说 这个寄存器是该形式所独有的,不与其他形式同享。
除了user形式,其它形式都能够经过直接写cpsr的形式位来改动处理器形式.当然,在反常或许中止到来时,硬件会主动切换形式.
下列反常和中止会引起形式切换:reset,irq,fiq,swi,data abort,prefetch abort和undefined instruction.
三、cpsr寄存器。
下面接着讲cpsr寄存器。处理器形式对应的cpsr寄存器:
需求留意的是:经过直接写cpsr来改动形式的办法不会将cpsr拷贝到spsr.只要在反常或中止产生时cpsr的值才会保存到spsr。
当ARM核上电时,处于svc特权形式.从特权形式开端是有用的:初始化代码彻底操控cpsr来树立其他形式的仓库.
cpsr中的bit T是标明指令簇用的是ARM指令集仍是thumb指令集.T为1标明thumb指令集,T为0标明ARM指令集.
ARM指令集和thumb指令集的特性:
中止屏蔽位:中止屏蔽位用来屏蔽处理器的特别中止请求.在ARM核中有两种等级的中止请求:irq和fiq.
cpsr中的中止屏蔽位是第7位和第6位(I和F),当I或F设为1时irq或fiq就被屏蔽了.
condtion flags:condition flags能够被比较操作和带S后缀的ALU操作来更新.
四、反常 中止和向量表
当反常产生时,处理器会将pc指向一个特别的内存地址.该地址地点的地址规模称为向量表.向量表的进口是跳转指令,跳转到专门处理某个反常或中止的子程序.
存储器映射地址0x00000000是为向量表预留的.在某些处理器中向量表能够放在更高的地址,从0xffff0000开端.linux等操作体系能够运用这个特性.
当反常产生时,处理器挂起正常的处理然后从向量表中加载指令.每个向量表的进口都包括指向特别处理例程的跳转指令.
reset向量是处理器上电后履行的第一条指令,这条指令跳转到初始化代码处.
undefined instruction向量是当处理器不能对指令译码时运用的.
software interrupt向量履行SWI指令时运用的.SWI能够用来体系调用的完成.
prefetch abort向量产生在当没有拜访权限的条件下企图获取该地址的指令时,反常产生在译码阶段.
data abort向量与prefetch abort相似,只不过是拜访数据产生的反常.
interrupt request向量被外部硬件用来中止处理器的正常履行.只要在cpsr的相应位为0时才干产生.
fast interrupt request向量与irq相似,是为要求更短的中止呼应时刻的硬件保存的.只要在cpsr的相应位为0时才干产生.
五、流水线
RISC处理器用流水线机制来履行指令.ARM流水线中的指令只要在彻底经过履行阶段才被处理.
上面这张图标明晰流水线的运用和程序计数器pc.在履行阶段,pc总是指向该指令地址加上8字节.也就是说pc总是指向当时指令的下下条指令.当用pc来核算
相对偏移量时这点是很重要的,而且它也是一切流水线的特征.
六、条件履行:
条件履行操控指令是否被ARM核履行.处理器会比较指令的条件特点和cpsr中的condition flags,假如匹配,该指令履行;不然该指令被疏忽.