cp15协处理器指令详解
- 格式:doc
- 大小:226.00 KB
- 文档页数:9
ARM汇编指令集汇编指令集的介绍,包括指令和伪指令。
指令和概念指令指令指的是CPU机器指令的助记符,是由CPU的指令集提供的,经过编译之后,会以机器码的形式由CPU读取执⾏伪指令伪指令本质上不是指令,和CPU的机器指令没有任何关系,只是和指令⼀起写在代码中⽽已,是由环境提供的,其⽬的是⽤于指导编译过程,伪指令经过编译后不会⽣成⼆进制机器码,仅仅在编译阶段有效果指令编程风格ARM官⽅风格官⽅风格指令⼀般使⽤⼤写,例如:LDR R0,[R1],Windows中常使⽤这种风格GUN Linux风格指令⼀般使⽤⼩写字母,例如:ldr r0,[r1],Linux环境中常⽤这种风格ARM汇编特点LDR/STR架构1. 采⽤RISC架构,CPU本⾝不能直接读取内存,⽽需要把内存中的数据加载到CPU的通⽤寄存器中,才能被CPU处理2. ldr(load register)将内存中的数据加载到通⽤寄存器3. str(store register)将寄存器内容存⼊内存空间4. ldr和str组合,可以实现ARM CPU和内存的数据交换8种寻址⽅式1. 寄存器寻址:move r1,r2:把r2的值赋值到r1寄存器中2. ⽴即寻址:move r0,#0xFF00:把⽴即数0xFF00赋值给r0寄存器3. 寄存器移位寻址:move r0,r1,lsl #3:把r1左移三位(*8)之后的值赋值给r0寄存器4. 寄存器间接寻址:ldr r1,[r2]:寄存器有中括号,表⽰内存地址对应的数据,所以这⾥r2表⽰⼀个内存地址,[]表⽰取r2指针对应的数据,这句代码的意思是把r2对应的内存中的数据赋值给r15. 基址变址寻址:ldr r1,[r2,#4]:将指针r2的值(内存地址)+4之后指向的数据赋值给r16. 多寄存器寻址:ldmia r1!,{r2 - r7,r12}:这种情况下,r1是⼀个指针,⾥边存放的内存地址,然后以r1⾥边的内存地址为基地址,向后以此加1得到{}⾥的寄存器数量个内存地址,然后将刚才得到的这些内存地址指向的变量的值赋值给{}⾥的对应位置的寄存器,类似从内存中读取数组,然后把数组的元素依次赋值给这些寄存器7. 堆栈寻址:stmfd sp!,{r2 - r7,lr}:和多寄存器类似,区别是将栈SP中连续访问{}数量个字节,然后依次赋值给{}⾥的寄存器8. 相对寻址:beq flag::flag:标号⽤于标记标号后⾯那句指令的地址,常⽤来表⽰⼊⼝点,函数名就是⼀个标号,C语⾔中的goto就可以跳转到⼀个标号,在ARM汇编中⽤指令b flag:就可以跳转到flag:对应的标号处执⾏,和beq flag:是⼀样的,其原理是相对于PC程序位置寄存器做⼀个偏移指令后缀1. ARM中的指令可以带后缀,从⽽丰富该指令的功能,这种形式叫做指令族,常⽤的后缀有:2. B(byte):功能不变,操作长度变为8位(依赖CPU位数,以下相同)3. H(Halfword):功能不变,操作长度变为16位3. H(Halfword):功能不变,操作长度变为16位4. S(signed):功能不变,操作数变为有符号数5. S(S标识):影响CPSR⾥的NZCV标识位,6. 举例:1. ldr指令族:ldrb,ldrh,ldrsb ldrsh,从内存中加载指定长度的数据2. mov指令族:movs r0,#0,结果是0,赋值会影响CPSR的NZCV标识,将Z位置为1条件执⾏后缀1. 条件执⾏后缀⽤于限制该执⾏执⾏的,只有在符合条件之后才能够执⾏该指令2.3. 举例:moveq r0,r1,如果eq成⽴,执⾏mov r0,r1,不成⽴则该条不执⾏,和C语⾔中的条件判断类似4. 条件后缀成⽴与否,不是取决于本条指令,⽽是取决于之前指令运⾏后的结果5. 条件后缀决定了本条指令是否执⾏,不会影响之前和之后指令6. 条件后缀和CPSR的NZCV位相关,例如,如果上⼀句代码执⾏的结果将Z置为1,下⼀句带有eq条件后缀的语句就会被执⾏多级指令流⽔线1. 多级流⽔线⽤于增加处理器处理指令的速度,2. 允许CPU同时异步的执⾏多条指令,⽽⾮上⼀条指令全部执⾏完毕之后才会执⾏下⼀条指令3. 多级可以简单那理解为把⼀条指令分为多个步骤来异步执⾏,例如:1. CPU把⼀条指令分为[取址,解码,执⾏]3个步骤,则为3级指令流⽔线2. 第⼀条指令进⾏取值操作3. 第⼀条指令取值完毕,进⼊解码操作,第⼆条指令紧随其后就开始执⾏取值操作4. 第⼀条指令解码完毕,进⼊执⾏操作,第⼆条指令紧接着进⼊解码操作,同时第三条指令进⼊取值操作5. 第⼀条指令执⾏完毕,第⼆条指令进⼊执⾏操作,第三条指令进⼊解码操作,第四条指令进⼊取值操作,依次类推4. 可见,多级流⽔线可以提⾼同时执⾏指令的数量,从⽽加速指令执⾏5. 需要注意的是,PC指向的是正在取值的指令,⽽⾮正在执⾏的指令,之间的差值就是流⽔线级数和单字节长度的乘积,在中断返回到PC的时候需要注意这个问题ARM指令数据处理指令数据传输指令mov:move,在两个寄存器之间或者⽴即数和寄存器之间传递数据,将后⼀个寄存器上的值或者⽴即数赋值给前⼀个寄存器 例如:mov r1,r0mov r1,#0xFF:将⽴即数0xFF赋值给寄存器r1mvn:和mov⽤法⼀致,区别是mvn会把后⼀个寄存器的值或者⽴即数按位取反后赋值给前⼀个寄存器 例如:mvn r0,#0xFF,则r0的值为0xffffff00(32位数据)算术运算指令add:加法运算sub:减法运算rsb:反减运算adc: 带进位的加法运算sbc: 带进位的减法运算rsc:带进位的反减指令逻辑指令and:与操作orr:或操作eor:异或操作bic:位清除操作⽐较指令cmp:⽐较⼤⼩cmn:取反⽐较tst:按位与运算teq:按位异或运算乘法指令mvl: mla: umull: umlal: smull: smlal:前导0计数clz:统计⼀个数的⼆进制位前⾯有⼏个0CPSR访问指令mrs⽤于读取CPSR和SPSRmsr⽤于写CPSR和SPSRCPSR和SPSRCPSR是程序状态寄存器,整个Soc只有⼀个SPSR在五种异常模式下各有⼀个,⽤于从普通模式进⼊异常模式的时候,保存普通模式下的CPSR,在返回普通模式时可以恢复原来的CPSR跳转分⽀指令b指令: ⽆条件直接跳转,没打算返回bl指令:跳转前把返回地址放⼊lr中,以便返回,常⽤在函数中bx指令:跳转同时切换到ARM模式,⽤于异常处理的跳转内存访问指令ldr:加载指定内存地址的数据到寄存器,按照字节访问str:加载指定寄存器数据到内存地址中,按照字节访问ldm:和ldr功能⼀样,⼀次多字节多寄存器访问stm:和str功能⼀样,⼀次多字节多寄存器访问swp:内存和寄存器互换指令,⼀边读⼀边写,例如:swp r1,r2,[r0]:读取指针r0的数据到r1中,同时把r2的数据赋值给r0指针指向的变量软中断指令swi(software interrupt),在软件层模拟产⽣⼀个中断,这个中断会传送给CPU,常⽤于实现系统调⽤⽴即数⾮法与合法ARM指令都是32为,除了指令标记和操作标记外,只能附带少位数的⽴即数,所以有⾮法与合法之分⾮法⽴即数:合法⽴即数:经过任意位数的移位后,⾮0部分可以⽤8位表⽰就是合法⽴即数协处理器与指令协处理器协处理器属于Soc中另外⼀颗核⼼,⽤于协助主CPU实现某些功能,被主CPU调⽤来执⾏任务,协处理器和MMU,Cache,TLB有功能和管理上的联系ARM设计可以⽀持多达16个协处理器,但是⼀般只实现其中的CP15协处理器指令mrc:读取CP15中的寄存器mcr:向CP15中的寄存器写数据指令⽤法:mcr{<”cond”>} p15,<”opcode_1”>,<”Rd”>,<”Crn”>,<”Crm”>,{<”opcode_2”>} opcode_1:对于CP15永远为0Rd:ARM通⽤寄存器Crn:CP15寄存器,取值范围c0~c15Crm:CP15寄存器,⼀般为c0opcode_2:省略或者为0ldm,stm和栈ldm,stmldr与str只能访问4个字节,当数据较⼤的时候,就会明显的降低效率,这时就需要使⽤到ldm和stm,ldm与stm是⼤量的从寄存器与内存交换数据的⽅式,常⽤于在内存和寄存器之间⼤量读取和写⼊数据:stmia sp {r0 - r12}:stm表⽰进⾏批量数据操作,ia的意思是将r0存⼊SP的内存地址处,然后SP内存地址+4(32位),将r1存⼊该地址,内存地址再+4,存⼊r2,依次存到r12,这就是⼀个寄存器和内存交换⼤量数据的⽰例,在⼀个周期内完成了多个内存地址和多个寄存器的操作。
协处理器指令系统协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。
协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。
协处理器在指令执行期间内利用数据总线来传递数据。
80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU 之间的数据交换,而80387~Pentium系列芯片,则是利用I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。
一.指令操作符的命名规则协处理器指令的操作符(或助忆符)在命名设计时,遵循了下列规则:1、在操作符后面加上字母P:表示该指令执行完后,还进行一次堆栈弹出操作,弹出栈顶数据以后要对其它的寄存器进行相应的调整。
如:FADDP/FSUBP/FSUBRP /FMULP/FDIVP /FDIVRP等;2、在操作符后面加上字母R:表示将两个操作数的源/目的位置交换再进行运算,它仅限于减法、除法指令,因为加法和乘法不受源/目的操作数的位置影响结果。
如:FSUBR和FDIVR等;不加R时——目的操作数=目的操作数op 源操作数加R模式——目的操作数=源操作数op 目的操作数假设:栈顶数据st(0)为10,内存变量data的值为1,分别执行下列指令将有不同的结果。
F SUB data ; ST(0)=ST(0)-dataF SUBR data ;ST(0)=data-ST(0)F SUB ST(3), ST(0) ;指令执行后,ST(3)=ST(3)-ST(0)F SUBR ST(3), ST(0) ;指令执行后,ST(3)=ST(0)-ST(3)3、操作符的第2个字母是I:表示内存操作数是整数(注意:不能是BYTE类型)。
它对加、减、乘、除指令以及堆栈操作指令都有效。
FIADD data ——整数加法,它表示内存单元data是一个整数,把该整数加到栈顶的浮点数上(ST(0)=ST(0)+data)。
ARM920T的MMU与Cache目录虚拟地址和物理地址的概念虚拟内存管理ARM920T的CP15协处理器MMUCache操作MMU和Cache的内核启动代码参考资料索引虚拟地址和物理地址的概念CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分,如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将直接传到CPU芯片的外部地址引脚上,直接被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA),如下图所示。
图 1. 物理地址示意图如果CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU 的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址,如下图所示[1]。
图 2. 虚拟地址示意图MMU将虚拟地址映射到物理地址是以页(Page)为单位的,对于32位CPU通常一页为4K。
例如,虚拟地址0xb700 1000~0xb700 1fff是一个页,可能被MMU映射到物理地址0x2000~0x2fff,物理内存中的一个物理页面也称为一个页框(Page Frame)。
虚拟内存管理现代操作系统充分利用MMU提供的VA到PA的映射机制来做内存管理,以下称为虚拟内存管理(Virtual Memory Management)。
首先看下面的例子:例 1. 进程的地址空间这是bash进程的虚拟地址空间,32位CPU的虚拟地址空间是4GB,也就是0x0000 0000-0xffff ffff,该进程占用的地址范围近似为0x0000 0000-0xbfff ffff,地址范围0xc000 0000-0xffff ffff由内核占用,用户进程不允许访问。
内存管理单元(MMU)和协处理器CP15介绍(转)内存管理单元(MMU)和协处理器CP15介绍内存管理单元(MMU)介绍嵌⼊式系统中,存储系统差别很⼤,可包含多种类型的存储器件,如FLASH,SRAM,SDRAM,ROM等,这些不同类型的存储器件速度和宽度等各不相同;在访问存储单元时,可能采取平板式的地址映射机制对其操作,或需要使⽤虚拟地址对其进⾏读写;系统中,需引⼊存储保护机制,增强系统的安全性。
为适应如此复杂的存储体系要求,ARM处理器中引⼊了存储管理单元来管理存储系统。
⼀内存管理单元(MMU)概述在ARM存储系统中,使⽤MMU实现虚拟地址到实际物理地址的映射。
为何要实现这种映射?⾸先就要从⼀个嵌⼊式系统的基本构成和运⾏⽅式着⼿。
系统上电时,处理器的程序指针从0x0(或者是由0Xffff_0000处⾼端启动)处启动,顺序执⾏程序,在程序指针(PC)启动地址,属于⾮易失性存储器空间范围,如ROM、FLASH等。
然⽽与上百兆的嵌⼊式处理器相⽐,FLASH、ROM等存储器响应速度慢,已成为提⾼系统性能的⼀个瓶颈。
⽽SDRAM具有很⾼的响应速度,为何不使⽤SDRAM来执⾏程序呢?为了提⾼系统整体速度,可以这样设想,利⽤FLASH、ROM对系统进⾏配置,把真正的应⽤程序下载到SDRAM中运⾏,这样就可以提⾼系统的性能。
然⽽这种想法⼜遇到了另外⼀个问题,当ARM处理器响应异常事件时,程序指针将要跳转到⼀个确定的位置,假设发⽣了IRQ中断,PC将指向0x18(如果为⾼端启动,则相应指向0vxffff_0018处),⽽此时0x18处仍为⾮易失性存储器所占据的位置,则程序的执⾏还是有⼀部分要在FLASH或者ROM中来执⾏的。
那么我们可不可以使程序完全都SDRAM中运⾏那?答案是肯定的,这就引⼊了MMU,利⽤MMU,可把SDRAM的地址完全映射到0x0起始的⼀⽚连续地址空间,⽽把原来占据这⽚空间的FLASH或者ROM映射到其它不相冲突的存储空间位置。
MMU,全称Memory Manage Unit, 中文名——存储器管理单元。
许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。
但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。
覆盖块0首先运行,结束时他将调用另一个覆盖块。
虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。
人们必须找到更好的办法从根本上解决这个问题。
不久人们找到了一个办法,这就是虚拟存储器(virtual memory).虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。
比如对一个16MB的程序和一个内存只有4M B的机器,OS通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。
而这个16M的程序在运行前不必由程序员进行分割。
任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。
这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T).这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。
与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集,这里举一个最简单的例子直观地说明这两者,对于一台内存为256MB的32bit x86主机来说,它的虚拟地址空间范围是0 ~0xFFFFFFFF(4G),而物理地址空间范围是0x000000000~0x0FFFFFFF(256MB)。
ARM的CP15协处理器的寄存器访问CP15寄存器的指令访问CP15寄存器指令的编码格式及语法说明如下:1)主标识符寄存器访问主标识符寄存器的指令格式如下所示:mrc p15, 0, r0, c0, c0, 0 ;将主标识符寄存器C0,0的值读到r0中ARM不同版本体系处理器中主标识符寄存器的编码格式说明如下。
ARM7之后处理器的主标识符寄存器编码格式如下所示:ARM7处理器的主标识符寄存器编码格式如下所示:ARM7之前处理器的主标识符寄存器编码格式如下所示:控制字段位[23:12]和控制字段位[11:0]的编码格式相同,含义如下所示:cache容量字段bits[8: 6]的含义如下所示:cache相联特性字段bits[5: 3]的含义如下所示:cache块大小字段bits[1: 0]的含义如下所示:•CP15的寄存器C1访问主标识符寄存器的指令格式如下所示:mrc p15, 0, r0, c1, c0{, 0} ;将CP15的寄存器C1的值读到r0中mcr p15, 0, r0, c1, c0{, 0} ;将r0的值写到CP15的寄存器C1中CP15中的寄存器C1的编码格式及含义说明如下:•CP15的寄存器C2CP15中的寄存器C2保存的是页表的基地址,即一级映射描述符表的基地址。
其编码格如下所示:mcr p15, 0, <rd>, <c7>, crm, <opcode_2> ;<rd>、<crm>和<opcode_2>的不同取值组合实现不同功能•CP15中的寄存器C8CP15的C8寄存器用来控制清除TLB的内容,是只写寄存器,读操作将产生不可预知的后果。
访问CP15的C8寄存器的指令格式如下所示:mcr p15, 0, <rd>, <c8>, crm, <opcode_2> ;<rd>、<crm>和<opcode_2>的不同取值组合实现不同功能,见第4.2节•CP15中的寄存器C9CP15的C9寄存器用于控制cache内容锁定。
arm汇编cp15格式-回复[ARM汇编CP15格式] 是一种用于ARM架构的处理器指令集。
在本文中,我们将详细介绍CP15格式并逐步解答相关问题。
CP15格式,也称为协处理器15(Co-processor 15),是ARM体系结构中的一种特殊指令格式。
它用于访问处理器的系统控制寄存器(System Control Registers),这些寄存器可以对系统的整体行为进行配置和控制。
首先,让我们了解一下CP15格式的基本结构。
CP15指令由四部分组成:协处理器代码(coproccode)、操作码(opcode)、操作数(operand)、和目标寄存器(destination register)。
协处理器代码(coproccode)指定要访问的协处理器的类型,例如CP15。
操作码(opcode)指定进行的具体操作,例如读取或写入寄存器。
操作数(operand)用于指定操作数的来源或目标位置。
目标寄存器(destination register)用于存储操作的结果。
现在,我们来回答一些与CP15格式相关的问题。
问题一:CP15格式有什么作用?CP15格式允许程序访问处理器的系统控制寄存器,从而配置和控制系统的各种行为。
例如,通过CP15指令,程序可以访问处理器的缓存控制寄存器,从而控制缓存的策略和行为。
此外,CP15指令还可以用于访问处理器状态寄存器,从而查询或修改一些处理器的状态信息。
问题二:CP15格式常用的操作有哪些?CP15指令提供了广泛的操作,用于对系统进行配置、查询和控制。
常见的操作包括读取和写入寄存器、查询和修改处理器状态、控制缓存和内存管理等。
问题三:如何使用CP15格式进行寄存器读写操作?要使用CP15格式进行寄存器读写操作,首先需要指定相应的协处理器代码(coproccode)。
对于CP15来说,该代码是15。
然后,在操作码(opcode)中指定读取或写入操作,并在操作数(operand)中指定寄存器的标识符。
arm汇编cp15格式-回复CP15格式是一个用于ARM架构处理器中的协处理器格式。
它被用于实现对特殊寄存器和一些特权操作的访问和控制。
在本文中,我们将一步一步地回答一些关于CP15格式的问题,包括它的功能、如何使用它以及它的一些使用示例。
一、什么是CP15格式?CP15格式是ARM架构中的一个协处理器格式。
它被用来实现对一些特殊寄存器和特权操作的访问和控制。
这些特殊寄存器和特权操作对于操作系统和处理器架构之间的通信和控制至关重要。
二、CP15格式的功能是什么?CP15格式的主要功能包括:1. 访问系统控制寄存器(System Control Registers,SCR)和体系结构版本寄存器(Architectural Version Registers,AVR)等特殊寄存器;2. 控制处理器的访问权限和特权级别;3. 提供对异常处理的支持,例如中断处理和系统调用;4. 管理cpu缓存和内存管理单元(MMU)等。
5. 提供对TLB(Translation Lookaside Buffer)的访问和控制。
三、怎么使用CP15格式?使用CP15格式,我们需要通过特殊的指令来进行访问和控制。
在ARM 汇编语言中,这些指令通常以"MCR"(Move to Co-processor Register)或"MRC"(Move from Co-processor Register)开头,后跟协处理器编号和寄存器编码。
下面是一些使用CP15格式的示例:1. 读取系统控制寄存器的值:MRC p15, 0, R1, c1, c0, 0这条指令读取CP15寄存器1(c1)中的值,并将其放入R1寄存器中。
2. 更新系统控制寄存器的值:MCR p15, 0, R0, c1, c0, 0这条指令将R0寄存器的值写入CP15寄存器1(c1)中,从而更新系统控制寄存器的值。
四、CP15格式的使用示例1. 启用或禁用MMU:MRC p15, 0, R1, c1, c0, 0 读取系统控制寄存器的值ORR R1, R1, #0x1 << 0 将R1寄存器中的Bit 0位置1以启用MMUMCR p15, 0, R1, c1, c0, 0 更新系统控制寄存器的值通过读取和更新系统控制寄存器的值来启用或禁用MMU。
协处理器的三大类数据传送指令
协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。
协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。
协处理器在指令执行期间内利用数据总线来传递数据。
80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而80387~PenTIum系列芯片,则是利用I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。
协处理器的三大类数据传送指令数据传送指令
为了满足协处理器和CPU之间进行数据交流的需求,就需要实现内存单元和协处理器之间进行数据传送的指令。
协处理器的指令系统中有三大类数据传送指令:BCD传送指令、浮点数传送和整数传送指令。
一、BCD传送指令。
ARM指令集-协处理器指令详解ARM可支持多达16个协处理器,主要的作用:ARM处理器初始化,ARM与协处理器的数据处理操作,ARM的寄存器与协处理器的寄存器之间传送数据,以及ARM协处理器的寄存器和存储器之间传送数据。
共有5条:-CDP 协处理器数据操作指令-LDC 协处理器数据加载指令-STC 协处理器数据存储指令-MCR ARM的寄存器到协处理器的寄存器的数据传送-MRC 协处理器的寄存器到ARM的寄存器的数据传送1、CDP 指令CDP 指令的格式为:CDP{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。
CDP 指令用于ARM 处理器通知ARM 协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。
其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM 处理器的寄存器和存储器。
指令示例:CDP P3 , 2 , C12 , C10 , C3 , 4 ;该指令完成协处理器 P3 的初始化2、LDC 指令LDC 指令的格式为:LDC{条件}{L} 协处理器编码,目的寄存器,[源寄存器]LDC 指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。
其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
指令示例:LDC P3 , C4 , [R0] ;将 ARM 处理器的寄存器 R0 所指向的存储器中的字数据传送到协处理器 P3 的寄存器 C4 中。
3、STC 指令STC 指令的格式为:STC{条件}{L} 协处理器编码,源寄存器,[目的寄存器]STC 指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。
其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
协处理器CP15使用介绍一、访问CP15寄存器的指令访问CP15寄存器指令的编码格式及语法说明如下:说明:<opcode_1>:协处理器行为操作码,对于CP15来说,<opcode_1>永远为0b000,否则结果未知。
<rd>:不能是r15/pc,否则,结果未知。
<crn>:作为目标寄存器的协处理器寄存器,编号为C0~C15。
<crm>:附加的目标寄存器或源操作数寄存器,如果不需要设置附加信息,将crm设置为c0,否则结果未知。
<opcode_2>:提供附加信息比如寄存器的版本号或者访问类型,用于区分同一个编号的不同物理寄存器,可以省略<opcode_2>或者将其设置为0,否则结果未知。
指令说明语法格式mcr 将ARM处理器的寄存器中的数据写到CP15中的寄存器中mcr{<cond>} p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>}mrc 将CP15中的寄存器中的数据读到ARM处理器的寄存器中mcr{<cond>} p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>}二、CP15寄存器介绍CP15的寄存器列表如下所示。
1.CP15的寄存器C0CP15中寄存器C0对应两个标识符寄存器,由访问CP15中的寄存器指令中的<opcode_2>指定要访问哪个具体物理寄存器,<opcode_2>与两个标识符寄存器的对应关系如下所示:1)主标识符寄存器访问主标识符寄存器的指令格式如下所示:mrc p15, 0, r0, c0, c0, 0 ;将主标识符寄存器C0,0的值读到r0中ARM不同版本体系处理器中主标识符寄存器的编码格式说明如下。
ARM920T的CP15协处理器ARM920T的MMU和Cache都集成在CP15协处理器中,MMU和Cache的联系非常密切,本节首先从总体上介绍MMU、Cache和CPU核是如何协同工作的,后面两节分别讲解MMU和Cache的细节。
三星公司的S3C2410是一种很常见的采用ARM920T的芯片,涉及到具体的芯片时我们以S3C2410为例。
以下是CP15协处理器的寄存器列表(摘自[S3C2410用户手册]),和CPU核的r0到r15寄存器一样,协处理器寄存器也是用0到15来编号,在指令中用4个bit来表示寄存器编号,有些协处理器寄存器有影子寄存器,这种情况下对同一个编号的寄存器使用不同的选项读或者写实际上访问的是不同的寄存器,后文用到某个寄存器时会详细说明它的功能。
表1. CP15协处理器的寄存器列表对CP15协处理器的操作使用mcr和mrc两条协处理器指令,这两条指令的记法是从后往前看:mcr是把r(CPU核寄存器)中的数据传送到c(协处理器寄存器)中,mrc则是把c(协处理器寄存器)中的数据传送到r(CPU核寄存器)中。
对CP15协处理器的所有操作都是通过CPU核寄存器和CP15寄存器之间交换数据来完成的。
下图是协处理器的指令格式(摘自[S3C2410用户手册])。
图8. 协处理器指令格式和其它ARM指令一样,Cond是条件码,bit 20是L位,表示该指令是读还是写,如果L=1就表示Load,从外面读到CPU核中,也就是mrc指令,如果L=0就表示Store,也就是mcr指令。
[11:8]这四个位是协处理器编号,CP15的编号是15,因此是4个1。
CRn是CP15寄存器编号,Rd是CPU核寄存器编号,各占4个位。
对于CP15协处理器,规定opcode1应该为0,opcode2和CRm是指令的选项,具体含义取决于不同的寄存器。
虽然这里介绍了协处理器的寄存器编号和相关指令,但读者只需了解对协处理器是这样进行操作的就可以了,我们的重点是讲解MMU和Cache的基本概念,具体各种操作的指令该怎么写可以参考[S3C2410用户手册]。
常用CP 指令不当之处,敬请谅解。
仅供参考,具体指令格式和用法请查ALEX 进行确认。
XLF一、CP1、CP 的工作方式DPWSP; 显示CP 状态。
我们可以看到如下信息:CP STATEMAU SB SBSTATE NRM B WO从上面我们可以看到,MAU 的状态为NORMAL ,备用边为B 边,状态为WO 。
与CP 状态相关的指令:DPSWI ;交换CP 两侧的状态。
SB-WO → EX ;EX → SB-WO DPHAS ;Halt CP 一侧。
SB-WO → SB-HA DPSES ;分离备用侧。
SB-WO → SB-SEDPPAI ;并边,命令SB-HA 或SB-SE 侧进行更新。
命令下达后备用侧状态变成SB-UP ,最终CP-A 变成EX ,CP-B 变成SB-WO 。
———————————————————————————————————————2、备份,按操作过程列出sybue; 打死CP 自动备份功能sybfp:file; 查看CP 备份文件信息,常用文件:RELFSW0 RELFSW1 RELFSW2 sybup:file; CP 备份,提示备份到RELFSW2中,输入两次 ; 确认 sytuc; 轮转CP 备份,2-0 0-1 1-2sybui:disc; 或 sybui; 激活CP 自动备份功能SYTUC其他:SYBMP; 查看主存备份信息SYBFP:MS; 查看主存备份信息SYBCI:FILE=RELFSW0;对RELFSW0进行校验SYBRP; 最后一次启动信息———————————————————————————————————————3、启动和reloadsyrei:rank=small,expl=other;系统小启动syrei:rank=large,expl=other; 系统大启动syrei:rank=reload,expl=other;系统reloadsyati:restart; 系统大启动SYRBI;关闭自动RELOAD,伴随出现告警“Backup information fault”,在FUNCTION CHANGE期间只有CP的执行侧接受该指令。
流水线、MMU、Cache、协处理器CP151.流水线·CPU内部有3个主要组成部分:指令寄存器,指令译码器,指令执行单元(包括算术逻辑单元ALU和通用寄存器组)。
·CPU执行一条指令的时候,主要有三个步骤:取指,译码,执行。
·取指阶段占用的CPU硬件是指令通路和指令寄存器;译码阶段占用的CPU硬件是指令译码器;执行阶段占用的CPU硬件是指令执行单元和数据通路。
流水线操作的本质是利用指令运行的不同阶段使用的CPU硬件互不相同,并发的运行多条指令,从而提高时间效率。
·对于ARM指令集而言,每条指令的长度为32bit,占4B,所以一条指令在内存中需要4B存储。
因此,指令执行时:PC值=当前正在执行指令在内存中的地址+82.MMU与内存保护的实现·现代的操作系统都支持虚拟内存,这样可以让操作系统内核更合理的保护内存区,控制硬件地址访问权限,切换用户的进程空间。
·在ARM系统中,MMU主要完成以下工作:(1)虚拟存储空间地址到物理存储空间地址的映射。
(2)控制存储器访问权限。
(3)设置虚拟存储空间的缓冲特性。
·CPU内核--------CP15协处理器(C13)--------MMU--------内存3.快速上下文切换·在ARM中每个进程最大可使用内存空间为32MB,当一个CPU 访问的VA地址小于32MB时,MMU认为它是一个用户进程地址。
当VA小于32MB时,MVA = PID(进程ID号)<< 25 + VA ·ARM内核支持运行多个进程,每个进程执行空间为0-32MB,则4GB地址空间被分成128个32MB空间,也就是说ARM内核最多支持128个进程同时运行。
·PID是通过设置对应寄存器来告诉MMU硬件,在需要进行地址转换时将PID的值写入CP15协处理器的C13寄存器即可。
4.页表、页表项和TTB·MMU页表存放在内存中的一块映射区域,主要用来做虚拟地址VA和物理地址PA的映射,页表里的每一个元素称为页表项,其类似数组元素。
关于mrc?p15,0,r0,c1,c0,0
mrc是协处理器命令。
用于读取协处理器中的寄存器的数据到ARM处理器的寄存器里面。
mrc p15,0,r0,c1,c0,0 这句话的意思应该是读协处理器中的寄存器数据到ARM处理器的r0里面。
应该是ARM访问MMU,一般cp15就是MMU。
<MCR|MRC>{cond} p#, <expression1>,Rd,cn,cm{, <expression2>}
MRC 从协处理器移到ARM7寄存器(L=1)
MCR 从ARM7寄存器移到协处理器(L=0)
{cond} 两个字符的条件代码
p# 被请求得协处理器的惟一标识苻
<expression1> 计算一个常量并放到CP Opc域
Rd 是一个表达式计算ARM7有效寄存器序号
cn 和cm 是计算有效协处理器寄存器CRn CRm序号
<expression2> 计算一个常量,并放到CP域
举例:
MRC 2,5,R3,c5,c6 ;请求协处理器2 执行操作5 ,操作数为c5和c6,
; 传送结果到R3 (单次32位字)
MCR 6,0,R4,c6 ; 请求协处理器6执行操作0,操作数为R4
;结果送到c6。
ARM之协处理器CP15
CP15 系统控制协处理器(the system control coprocessor)他通过协处理器指令MCR 和MRC 提供具体的寄存器来配置和控制caches、MMU、保护系统、配置时钟模式(在bootloader 时钟初始化用到)CP15 的寄存器只能被
MRC 和MCR(Move to Coprocessor from ARM Register )指令访问
他包括15 个具体的寄存器如下:-R0:ID 号寄存器这是一个只读寄存器,
返回一个32 位的设备ID 号,32 具体功能参考2410 datesheet 的table 2-5
-R0:缓存类型寄存器(CACHE TYPE REGISTER),注意有2 个R0,根据MCR 操作数的不同传送不同的值,这也一个只读寄存器,包含了caches 的信息。
读这个寄存器的方式是通过设置协处理操作码为1.
如:
MRC p15,0,Rd,c0,c0,1; 返回caches 的详细信息
详见:table 2-6
-R1:控制寄存器2-10
-R2:转换表基址寄存器(Translation Table Base --TTB)2-12
-R3:域访问控制寄存器(Domain access control )2-13
-R4:保留2-14
-R5:异常状态寄存器(fault status -FSR)2-14
-R6:异常地址寄存器(fault address -FAR)2-15
-R7:缓存操作寄存器2-15
-R8:TLB 操作寄存器2-18
-R9:缓存锁定寄存器2-19
-R10:TLB 锁定寄存器2-21。
ARM处理器中CP15协处理器的寄存器注意:You can only access CP15 registers with MRC and MCR instructions in a privileged mode (只能在特权模式下,对cp15进行MRC,MCR操作)。
1.访问CP15寄存器的指令访问CP15寄存器指令的编码格式及语法说明如下:说明:Opcode_1 :协处理器行为操作码,对于CP15来说,永远为0b000,否则结果未知。
Rd:处理器核心的寄存器名称,不能是r15/pc,否则,结果未知。
Crn:作为目标寄存器的协处理器寄存器名称,编号为C0~C15。
Crm:协处理器中附加的目标寄存器或源操作数寄存器,如果不需要设置附加信息,将Crm设置为c0,否则结果未知。
Opcode_2 :提供附加信息,比如寄存器的版本号或者访问类型,用于区分同一个编号的不同物理寄存器,可以省略或者将其设置为0,否则结果未知。
指令语法格式说明:mcr :将ARM处理器的寄存器中的数据写到CP15中的寄存器中mcr{<cond>} p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>}mrc 将CP15中的寄存器中的数据读到ARM处理器的寄存器中mcr{<cond>} p15, <opcode_1>, <rd>, <crn>, <crm>, {<opcode_2>}2 .CP15寄存器介绍CP15中的寄存器列表如表4-1所示。
表4-1 ARM处理器中CP15协处理器的寄存器CP15的寄存器C0CP15中寄存器C0对应两个标识符寄存器,都是只读的,表明某些信息。
由访问CP15中的寄存器指令中的指定要访问哪个具体物理寄存器,与两个标识符寄存器的对应关系如下所示:1)主标识符寄存器 (通俗:标明该处理器的某些型号信息)访问主标识符寄存器的指令格式如下所示:mrc p15, 0, r0, c0, c0, 0 ;将主标识符寄存器C0的值读到r0中,两个c0作用不同的。
1.c0:表示协处理器中的源寄存器;2.c0:表示未使用附加的寄存器,这是要写c0。
ARM不同版本体系处理器中主标识符寄存器的编码格式说明如下。
ARM7之后处理器的主标识符寄存器编码格式如下所示:ARM7处理器的主标识符寄存器编码格式如下所示:续表ARM7之前处理器的主标识符寄存器编码格式如下所示:2)cache类型标识符寄存器访问cache类型标识符寄存器的指令格式如下所示:mrc p15, 0, r0, c0, c0, 1 ;将cache类型标识符寄存器C0的值读到r0中,1表示cache标示ARM处理器中cache类型标识符寄存器的编码格式如下所示:其中控制字段位[28:25]的含义说明如下:表4-2 cache类型标识符寄存器的控制字段位[28:25]控制字段位[23:12]和控制字段位[11:0]的编码格式相同,含义如下所示:cache容量字段bits[8: 6]的含义如下所示:cache相联特性字段bits[5: 3]的含义如下所示:cache块大小字段bits[1: 0]的含义如下所示:◆CP15的寄存器C1访问控制位寄存器C1的指令格式如下:mrc p15, 0, r0, c1, c0{, 0} ;将CP15的寄存器C1的值读到r0中mcr p15, 0, r0, c1, c0{, 0} ;将r0的值写到CP15的寄存器C1中CP15中的寄存器C1的编码格式及含义说明如下:◆ CP15的寄存器C2CP15中的寄存器C2保存的是页表的基地址,即一级映射描述符表的基地址。
其编码格如下所示:一级映射描述符表的基地址(物理地址)◆CP15的寄存器C3CP15中的寄存器C3定义了ARM处理器的16个域的访问权限。
◆CP15的寄存器C5CP15中的寄存器C5是失效状态寄存器,编码格式如下所示:其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。
状态标识bit[3:0]表示引起存储访问失效的存储访问类型,该字段含义如表4-3所示(优先级由上到下递减)。
表4-3 状态标识字段含义◆ CP15中的寄存器C6CP15中的寄存器C6是失效地址寄存器,编码格式如下所示:失效地址(虚拟地址)◆CP15中的寄存器C7CP15的C7寄存器用来控制cache和写缓存,它是一个只写寄存器,读操作将产生不可预知的后果。
访问CP15的C7寄存器的指令格式如下所示:mcr p15, 0, , , crm, ;不同取值组合,实现不同功能◆CP15中的寄存器C8CP15的C8寄存器用来控制清除TLB的内容,是只写寄存器,读操作将产生不可预知的后果。
访问CP15的C8寄存器的指令格式如下所示:mcr p15, 0, , , crm, ;不同取值组合实现不同功能◆CP15中的寄存器C9C P15的C9寄存器用于控制cache内容锁定。
访问CP15的C9寄存器的指令格式如下所示:mcr p15, 0, , , c0,mrc p15, 0, , , c0,如果系统中包含独立的指令cache和数据cache,那么对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器,用来选择其中的某个寄存器:1:选择指令cache的内容锁定寄存器;0:选择数据cache的内容锁定寄存器。
CP15的C9寄存器有A、B两种编码格式。
编码格式A如下所示:其中index表示当下一次发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index 的cache块中。
此时序号为0~index-1的cache块被锁定,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块。
编码格式B如下所示:续表◆CP15的寄存器C10CP15的C10寄存器用于控制TLB内容锁定。
访问CP15的C10寄存器的指令格式如下所示:mcr p15, 0, , , c0,mrc p15, 0, , , c0,如果系统中包含独立的指令TLB和数据TLB,那么对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器,用来选择其中的某个寄存器:1:选择指令TLB的内容锁定寄存器;0:选择数据TLB的内容锁定寄存器。
C10寄存器的编码格式如下:◆CP15的寄存器C13C13寄存器用于快速上下文切换FCSE。
访问CP15的C13寄存器的指令格式如下所示:mcr p15, 0, , , c0, 0mrc p15, 0, , , c0, 0C13寄存器的编码格式如下所示:其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127。
0:MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0;非0:使能FCSE。
MMU是Memory Manage Unit的缩写,即存储管理单元的意思。
MMU实现以下功能:1)虚拟存储地址到物理存储地址的映射;2)控制存储空间访问权限;3)设置存储空间的缓冲特性。
与MMU相关的一些基本概念介绍如下:⏹页表(Translate Table)页表又叫翻译表,用来将虚拟地址翻译成对应的物理地址,它位于内存中,是实现MMU功能的重要组成部分,处理器通过查找页表中的描述符来获取虚拟地址对应的物理地址。
ARM处理器是按两级分页来管理内存的,所以页表包括一级页表和二级页表。
一级页表中的每一项(1个字,4字节)对应于虚拟存储空间的一段(section),一段的大小为1MB(0x100000字节),该项包含了该虚拟存储段对应的物理存储段的基地址或者一段存储空间内每页的二级页表描述符组成的表的基地址、所属的内存域编号、缓冲特性等,一级页表的基地址保存在ARM处理器中CP15协处理器的C2寄存器中,该寄存器中保存的是一级页表的物理基地址,而不是虚拟地址。
二级页表中的每一项(1word,4bytes)对应于虚拟存储空间的一页,一页的大小可以是4KB或1KB,该项包含了该虚拟存储页对应的物理存储页的基地址、该页的访问权限和该页的缓冲特性等。
我们将页表中的每一项叫做一个地址变换条目(entry),也可以叫一个页表项。
⏹翻译援助缓冲区(Translation Lookaside Buffer,TLB)TLB在硬件上和cache一样,是处理器内部的一小块高速SRAM内存,用于缓存,与cache不同的是,它专门缓存存放在内存中的页表,容量相对比较小,而cache则用于缓存普通内存,容量相对比较大。
TLB 也分为数据TLB和指令TLB,指令TLB用于取指令时的指令地址翻译,而数据TLB用于其他存储访问操作时的地址翻译。
有的处理器中数据TLB和指令TLB是分开的,有的处理器中这两者是统一的。
TLB是为了提高处理器查询页表的速度而设计的,所以TLB又叫快表。
当处理器要查询页表时首先在TLB中查找,如果要查找的页表项不在TLB中,那么CPU从位于内存中的页表中查询,并把相应的结果添加到TLB 中,这样CPU下次查找该页表项时就可以从TLB中直接获取。