协处理器控制位详解cp15
- 格式:doc
- 大小:517.00 KB
- 文档页数:18
MMU,全称Memory Manage Unit,中文名——存储器管理单元。
许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。
但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。
覆盖块0首先运行,结束时他将调用另一个覆盖块。
虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。
人们必须找到更好的办法从根本上解决这个问题。
不久人们找到了一个办法,这就是虚拟存储器(virtual memory).虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。
比如对一个16MB的程序和一个内存只有4MB的机器,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 cacheCache的工作原理Cache的工作原理是基于程序访问的局部性;对大量典型程序运行情况的分析结果表明,在一个较短的时间间隔内,由程序产生的地址往往集中在存储器逻辑地址空间的很小范围内;指令地址的分布本来就是连续的,再加上循环程序段和子程序段要重复执行多次;因此,对这些地址的访问就自然地具有时间上集中分布的倾向;数据分布的这种集中倾向不如指令明显,但对数组的存储和访问以及工作单元的选择都可以使存储器地址相对集中;这种对局部范围的存储器地址频繁访问,而对此范围以外的地址则访问甚少的现象,就称为程序访问的局部性;根据程序的局部性原理,可以在主存和CPU通用寄存器之间设置一个高速的容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用;这对提高程序的运行速度有很大的作用;这个介于主存和CPU之间的高速小容量存储器称作高速缓冲存储器 Cache;系统正是依据此原理,不断地将与当前指令集相关联的一个不太大的后继指令集从内存读到Cache,然后再与CPU高速传送,从而达到速度匹配;CPU对存储器进行数据请求时,通常先访问Cache;由于局部性原理不能保证所请求的数据百分之百地在Cache中,这里便存在一个命中率;即CPU在任一时刻从Cache中可靠获取数据的几率;命中率越高,正确获取数据的可靠性就越大;一般来说,Cache的存储容量比主存的容量小得多,但不能太小,太小会使命中率太低;也没有必要过大,过大不仅会增加成本,而且当容量超过一定值后,命中率随容量的增加将不会有明显地增长;只要Cache的空间与主存空间在一定范围内保持适当比例的映射关系,Cache的命中率还是相当高的;一般规定Cache与内存的空间比为4:1000,即128kB Cache可映射32MB内存;256kB Cache可映射64MB内存;在这种情况下,命中率都在90%以上;至于没有命中的数据,CPU只好直接从内存获取;获取的同时,也把它拷进 Cache,以备下次访问;Cache的基本结构Cache通常由相联存储器实现;相联存储器的每一个存储块都具有额外的存储信息,称为标签Tag;当访问相联存储器时,将地址和每一个标签同时进行比较,从而对标签相同的存储块进行访问;Cache的3种基本结构如下:DCACHEARM cache架构由cache存储器和写缓冲器write-buffer组成,其中写缓冲器是CACHE按照FIFO原则向主存写的缓冲处理器;一般来说CACHEABILITY和BUFFERABILITY都是可以配置的,所以,一块存储区域可以配置成下面4种方式:NCNB CNB NCB CB; 在实际应用当中,可以根据需要对主存进行配置;对I/O MAP来说,一般都需要采用NCNB方式,以保证对I/O的正确操作;而其他的存储区域一般都可以配置成CB方式,以获取最好的性能;引入CACHE和WRITE BUFFER是为了提高存储访问的速度,提供系统性能;如果CACHE打开的话,CPU读写主存的时候,都是通过CACHE进行的;进行读操作的时候,如果在CACHE里面找到了所需的内容 CACHE HIT,直接从CACHE里读取;如果要读的内容不在CACHE上的时候 CACHE MISS,先把所需的内容装载到CACHE里,在从CACHE上读取;进行写操作的时候,数据先写到CACHE上;具体又可以分为WRITE THROUGH和 WRITE BACK两种方式;如果是WRITE THROUGH方式的话,每次写操作都通过CACHE+WRITE BUFFER把数据直接写到主存当中去;如果是WRITE BACK 方式的话,数据最初只是写到CACHE上,必要的时候CACHE REPLACEMENT 在将CACHE上的数据通过WRITE BUFFER实际回写到主存当中去;DCaches使用的是虚拟地址,它的大小是16KB,它被分成512行entry,每行8个字8 words,32Bits;每行有两个修改标志位dirty bits,第一个标志位标识前4个字,第二个标志位标识后4个字,同时每行中还有一个TAG 地址标签地址和一个valid bit;与ICaches一样,系统上电或重起Reset的时候,DCaches功能是被关闭的,我们必须往Ccr bit置1去开启它,Ccr bit在CP15协处理器中控制寄存器1的第2位关闭DCaches功能则是往该位置0;与ICaches不同,DCaches功能是必须在MMU开启之后才能被使用的;我们现在讨论的都是DCaches,你可能会问那Write Buffer呢他和DCaches区别是什么呢其实DCaches和Write Buffer两者间的操作有着非常紧密的联系,很抱歉,到目前为止我无法说出他们之间有什么根本上的区别-_-,但我能告诉你什么时候使用的是 DCaches,什么时候使用的是Write Buffer.系统可以通过Ccr bit对Dcaches的功能进行开启与关闭的设定,但是在s3c2410中却没有确定的某个bit可以来开启或关闭Write Buffer…你可能有点懵…我们还是来看一张表吧,这张表说明了DCaches,Write Buffer和CCr,Ctt descriptor中的C bit,Bttdescriptor中的B bit之间的关系,其中“Ctt and Ccr”一项里面的值是 Ctt与Ccr进行逻辑与之后的值Ctt&&Ccr.从上面的表格中我们可以清楚的知道系统什么时候使用的是DCaches,什么时候使用的是Write Buffer,我们也可以看到DCaches的写回方式是怎么决定的write-back or write-througth;在这里我要对Ctt and Ccr=0进行说明,能够使Ctt and Ccr=0的共有三种情况,分别是Ctt =0, Ccr=0Ctt =1, Ccr=0Ctt =0, Ccr=1我们分别对其进行说明;情况1Ctt =0, Ccr=0:这种情况下CPU的DCaches功能是关闭的Ccr=0,所以CPU存取数据的时候不会从DCaches里进行数据地查询,CPU直接去内存存取数据;情况2Ctt =1, Ccr=0:与情况1相同;情况3Ctt =0, Ccr=1:这种情况下DCaches功能是开启的,CPU读取数据的时候会先从DCaches里进行数据地查询,若DCaches中没有合适的数据,则CPU会去内存进行读取,但此时由于Ctt =0Ctt 是descriptor中的C bit,该bit决定该descriptor所描述的内存区域是否可以被Cache,所以CPU不会把读取到的数据Cache到DCaches不发生 linefill.到此为止我们用两句话总结一下DCaches与Write Buffer的开启和使用:1.DCaches与Write Buffer的开启由Ccr决定;2.DCaches与Write Buffer的使用规则由Ctt和Btt决定;ICACHE当系统上电或重起Reset的时候,ICaches功能是被关闭的,我们必须往lcr bit置1去开启它,lcr bit在CP15协处理器中控制寄存器1的第12位关闭ICaches功能则是往该位置0;ICaches功能一般是在MMU开启之后被使用的为了降低MMU查表带来的开销,但有一点需要注意,并不是说MMU被开启了ICaches才会被开启,正如本段刚开始讲的,ICaches的开启与关闭是由lcr bit所决定的,无论MMU是否被开启,只要lcr bit被置1了,ICaches 就会发挥它的作用;大家是否还记得discriptor描述符中有一个C bit我们称之为Ctt,它是指明该描述符描述的内存区域内的内容可以是指令也可以是数据是否可以被Cache,若Ctt=1,则允许Cache,否则不允许被Cache;于是CPU读取指令出现了下面这些情况:如果CPU从Caches中读取到所要的一条指令cache hit且这条指令所在的内存区域是Cacheble的该区域所属描述符中Ctt=1,则CPU执行这条指令并从Caches中返回不需要从内存中读取;若CPU从Caches中读取不到所要的指令cache miss而这条指令所在的内存区域是Cacheble 的同第1点,则CPU将从内存中读取这条指令,同时,一个称为“8-word linefill”的动作将发生,这个动作是把该指令所处区域的8个word写进ICaches的某个entry中,这个entry 必须是没有被锁定的对锁定这个操作感兴趣的朋友可以找相关的资料进行了解若CPU从Caches中读取不到所要的指令cache miss而这条指令所在的内存区域是UnCacheble的该区域所属描述符中Ctt=0,则CPU将从内存读取这条指令并执行后返回不发生linefill通过以上的说明,我们可以了解到CPU是怎么通过ICaches执行指令的;你可能会有这个疑问,ICaches总共只有512个条目entry,当 512个条目都被填充完之后,CPU要把新读取近来的指令放到哪个条目上呢答案是CPU会把新读取近来的8个word从512个条目中选择一个对其进行写入,那CPU是怎么选出一个条目来的呢这就关系到ICaches的替换法则replacemnet algorithm了; ICaches的replacemnet algorithm有两种,一种是Random模式另一种Round-Robin模式,我们可以通过CP15协处理器中寄存器1的RR bit对其进行指定0 = Random replacement 1 = Round robin replacement,如果有需要你还可以进行指令锁定INSTRUCTION CACHE LOCKDOWN;虚拟cacheCache 位于MMU前面靠近CPU称为逻辑CACHE又叫虚拟Cache;CPU可以直接访问CACHE的数据,而ARM 11ARMV6的结构是CACHE 在MMU后面CPU访问CACHE要通过MMU地址转换在DM6446的core用的是哈佛结构,即把CACHE分为8K的D-CACHE数据CACHE和16K的I-cache指令CACHE一个完整的CACHE分为CACHE控制器和CACHE存储器例子Davinci DM6446 D-cache行应为512行 ,cache存储器主要分为三个部分:目录存储段driectory-story,状态信息段status information和数据项段data section每一行cache 都包括这三部分;Cache用目录存储段来存储主存的地址,数据项段存放的是主存的数据,在cache中用状态信息段来记录状态信息,其中v表示有效位,d表示脏位,有效位记录当前cache行是活动的,cache行的数据和主存中的数据是一致的,处理器可以读取;脏位则表示cache行的数据和主存中的数据不一致;在读写请求到达存储器前会被CACHE捕获,cache存储器将该请求分成三部分标签,组索引和数据索引域,cache通过组索引域确定可能包含地址和数据cache的行,cache存储器检查匹配的CACHE 行的状态标签,如果是V表示cache hit命中,否则cache失效cachemiss在cache失效时从主存吧cache行考到CACHE存储器主存中的部分内容存放在cache中的最简单方式是直接映射,在一个直接映射中,主存的地址唯一对应cache行,因为主存容量很大所以主存的很多地址映射到同一个cache行见下图:在DM6446 中内存为128M bootargs 设为128M8K的D-CACHE则128×1024/8 = 16384映射一个cache行;由于cache的速度大大大于低速的主存速度,因此需要写缓冲器;Cache与DRAM存取的一致性在CPU与主存之间增加了Cache之后,便存在数据在CPU和Cache及主存之间如何存取的问题;读写各有2种方式;贯穿读出式Look Through该方式将Cache隔在CPU与主存之间,CPU对主存的所有数据请求都首先送到Cache,由Cache自行在自身查找;如果命中,则切断CPU对主存的请求,并将数据送出;不命中,则将数据请求传给主存;该方法的优点是降低了CPU对主存的请求次数,缺点是延迟了CPU对主存的访问时间; 旁路读出式Look Aside在这种方式中,CPU发出数据请求时,并不是单通道地穿过Cache,而是向Cache和主存同时发出请求;由于Cache速度更快,如果命中,则 Cache在将数据回送给CPU的同时,还来得及中断CPU对主存的请求;不命中,则Cache不做任何动作,由CPU直接访问主存;它的优点是没有时间延迟,缺点是每次CPU对主存的访问都存在,这样,就占用了一部分总线时间;写穿式Write Through任一从CPU发出的写信号送到Cache的同时,也写入主存,以保证主存的数据能同步地更新;它的优点是操作简单,但由于主存的慢速,降低了系统的写速度并占用了总线的时间; 回写式Copy Back为了克服贯穿式中每次数据写入时都要访问主存,从而导致系统写速度降低并占用总线时间的弊病,尽量减少对主存的访问次数,又有了回写式;它是这样工作的:数据一般只写到Cache,这样有可能出现Cache中的数据得到更新而主存中的数据不变数据陈旧的情况;但此时可在Cache 中设一标志地址及数据陈旧的信息,只有当Cache中的数据被再次更改时,才将原更新的数据写入主存相应的单元中,然后再接受再次更新的数据;这样保证了 Cache和主存中的数据不致产生冲突;ARM cache 策略Cache的写策略分为直写策略和回写策略;同时向cache行和相应的主存位置写数据,同时更新这两个地方的数据的方法称为直写策略writethrough,把数据写入cache行,不写入主存的或者只有当cache被替换时或清理cache行时才写入主存的策略称为回写策略writeback;采用回写策略时,当处理器cache命中,只向cache存储器写数据,不写入主存,主存里的数据就和cache里不一致,cache里的数据是最新的,主存里的数据是早前的;这就用cache存储器信息状态标志位了,当向cache存储器里某行写数据时,置相应行的信息标志脏位为1,那么主控制器下次访问cache存储器就知道cache里有主存没有的数据了,把数据写回到主存中去;当一个cache访问失效时,cache控制器必须从当前有效行中取出一个cache行存储从主存中取到的信息,被选中替换的cache行称为丢弃者,如果这个cache行中脏位为1则应把该cache行中的数据回写到主存中,而替换策略决定了那个cache行会被替换,在arm926ejs中ARM支持两种策略:轮转策略和伪随机策略;轮转策略就是取当前cache行的下一行,伪随机策略是控制器随机产生一个值;当cache失效时,ARM采取两种方式分配cache行,一种是读操作read-allocate还有一种是读-写分配策略read-write-allocate,当cache未命中时对于读操作策略,在对cache存储器读操作时才会分配cache行全相联Cache在全相联Cache中,存储的块与块之间,以及存储顺序或保存的存储器地址之间没有直接的关系;程序可以访问很多的子程序、堆栈和段,而它们是位于主存储器的不同部位上;因此,Cache保存着很多互不相关的数据块,Cache必须对每个块和块自身的地址加以存储;当请求数据时,Cache控制器要把请求地址同所有地址加以比较,进行确认;这种Cache结构的主要优点是,它能够在给定的时间内去存储主存器中的不同的块,命中率高;缺点是每一次请求数据同Cache中的地址进行比较需要相当的时间,速度较慢; 直接映像Cache直接映像Cache不同于全相联Cache,地址仅需比较一次;在直接映像Cache中,由于每个主存储器的块在Cache中仅存在一个位置,因而把地址的比较次数减少为一次;其做法是,为Cache中的每个块位置分配一个索引字段,用Tag字段区分存放在Cache位置上的不同的块;单路直接映像把主存储器分成若干页,主存储器的每一页与Cache存储器的大小相同,匹配的主存储器的偏移量可以直接映像为Cache偏移量;Cache的Tag存储器偏移量保存着主存储器的页地址页号;以上可以看出,直接映像Cache优于全相联Cache,能进行快速查找,其缺点是当主存储器的组之间做频繁调用时,Cache控制器必须做多次转换;组相联Cache组相联Cache是介于全相联Cache和直接映像Cache之间的一种结构;这种类型的Cache使用了几组直接映像的块,对于某一个给定的索引号,可以允许有几个块位置,因而可以增加命中率和系统效率;。
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。
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由内核占用,用户进程不允许访问。
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中mmu的映射原理与配置步骤下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!一、mmu的映射原理。
在arm架构中,mmu(Memory Management Unit)用于实现虚拟地址到物理地址的映射,以及页面级别的访问权限控制。
内存管理单元(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映射到其它不相冲突的存储空间位置。
在基于ARM的嵌入式应用系统中,存储系统通常是通过系统控制协处理器CP15完成的。
CP15包含16个32位的寄存器,其编号为0~15。
访问CP15寄存器的指令MCR ARM寄存器到协处理器寄存器的数据传送MRC 协处理器寄存器到ARM寄存器的数据传送MCR指令和MRC指令只能在处理器模式为系统模式时执行,在用户模式下执行MCR 指令和MRC指令将会触发未定义指令的异常中断。
MCR指令MCR指令将ARM处理器的寄存器中的数据传送到协处理器寄存器中。
如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
指令语法格式MCR{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}MCR{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}其中,<cond>为指令执行的条件码。
当<cond>忽略时指令为无条件执行。
< opcode_1>为协处理器将执行的操作的操作码。
对于CP15协处理器来说,< opcode_1>永远为0b000,当< opcode_1>不为0b000时,该指令操作结果不可预知。
<Rd>作为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中。
<CRn>作为目标寄存器的协处理器寄存器,其编号可能是C0,C1,…,C15。
<CRm>和<opcode_2>两者组合决定对协处理器寄存器进行所需要的操作,如果没有指定,则将为<CRm>为C0,opcode_2为0,否则可能导致不可预知的结果。
The CRm field and opcode_2 field are used to specify a particular action when addressing registers.The opcode_1, opcode_2 and CRm fields should be zero, except when the values specified are used to select the desired operations, in all instructions which access CP15. Using other values will result in unpredictable behavior. Attempting to read from a non-readable register, or writing to a non-writable register will cause unpredictable results.使用示例下面的指令从ARM寄存器R4中中将数据传送到协处理器CP15的寄存器C1中。
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}选项表示指令为长读取操作,如用于双精度数据的传输。
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内容锁定。
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用户手册]。
流水线、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的映射,页表里的每一个元素称为页表项,其类似数组元素。
在基于ARM的嵌入式应用系统中,存储系统通常是通过系统控制协处理器CP15完成的。
CP15包含16个32位的寄存器,其编号为0~15。
访问CP15寄存器的指令MCR ARM寄存器到协处理器寄存器的数据传送MRC 协处理器寄存器到ARM寄存器的数据传送MCR指令和MRC指令只能在处理器模式为系统模式时执行,在用户模式下执行MCR 指令和MRC指令将会触发未定义指令的异常中断。
MCR指令MCR指令将ARM处理器的寄存器中的数据传送到协处理器寄存器中。
如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
指令语法格式MCR{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}MCR{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}其中,<cond>为指令执行的条件码。
当<cond>忽略时指令为无条件执行。
< opcode_1>为协处理器将执行的操作的操作码。
对于CP15协处理器来说,< opcode_1>永远为0b000,当< opcode_1>不为0b000时,该指令操作结果不可预知。
<Rd>作为源寄存器的ARM寄存器,其值将被传送到协处理器寄存器中。
<CRn>作为目标寄存器的协处理器寄存器,其编号可能是C0,C1,…,C15。
<CRm>和<opcode_2>两者组合决定对协处理器寄存器进行所需要的操作,如果没有指定,则将为<CRm>为C0,opcode_2为0,否则可能导致不可预知的结果。
The CRm field and opcode_2 field are used to specify a particular action when addressing registers.The opcode_1, opcode_2 and CRm fields should be zero, except when the values specified are used to select the desired operations, in all instructions which access CP15. Using other values will result in unpredictable behavior. Attempting to read from a non-readable register, or writing to a non-writable register will cause unpredictable results.使用示例下面的指令从ARM寄存器R4中中将数据传送到协处理器CP15的寄存器C1中。
其中R4为ARM寄存器,存放源操作数,C1、C0为协处理器寄存器,为目标寄存器,opcode_1为0,opcode_2为0。
MCR p15, 0, R4, C1, C0, 0MRC指令MRC指令将协处理器的寄存器中的数值传送到ARM处理器的寄存器中、如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
指令语法格式MRC{<cond>} <p>,< opcode_1>,<Rd>,<CRn>,<CRm>{,<opcode_2>}MRC{<cond>} p15,0,<Rd>,<CRn>,<CRm>{,<opcode_2>}参数用法同MCR指令CP15中的寄存器介绍Register(寄存器)Read WriteC0ID Code (1)UnpredictableC0Catch type(1)UnpredictableC1Control ControlC2Translation table base Translation tablebaseC3Domain access control Domain accesscontrolC4Unpredictable UnpredictableC5Fault status(2)Fault status (2)C6Fault address Fault addressC7Unpredictable Cache operationsC8Unpredictable TLB operationsC9Cache lockdown(2)Cache lockdown (2)C10TLB lock down(2)TLB lock down(2)C11Unpredictable UnpredictableC12Unpredictable UnpredictableC13Process ID Process IDC14Unpredictable UnpredictableC15Test configuration Test configurationNotes:1.Register location 0 provides access to more than one register. The register accesseddepends upon values of the opcode_2 field. See the register description for details.2.Separate register for instruction and data .See the register description for details.寄存器0:ID Code Register ( 0 )This is a read-only register which returns a 32-bit device ID code这是一个只读寄存器,它存放微处理器的标识码。
The ID code register is accessed by reading CP15 register 0 with the opcode_2 field set to any value other than 1(the CRm field should be zero when reading). For example:MRC p15, 0, Rd, C0, C0, 0ID Code内容如下:Register bits Function Value[31:24]Implementor0x41(‘A’,表示Arm公司) [23:20]Specification revision0x1[19:16]Architecture version(4T)0x2(ARM体系版本4T) [15:4]Part number0x920[3:0]Layout revision0x0寄存器0:Cache type register ( 1 )This is a read-only register which contains information about the size and architecture of the caches, allowing operating systems to establish how to perform such operations as cache cleaning and lockdown.这个只读寄存器包含了高速缓存的大小和类型。
The cache type register is accessed by reading CP15 register 0 with the opcode_2 field set to 1.for example:MRC p15, 0, Rd, C0, C0, 1; returns cache detailsThe format of cache type register (寄存器的数据格式如下)Register bits Function Value[31:29]Reserved000[28:25]Cache type (缓存类型)0110[24]Harvard/Unified1(defines Harvard cache) [23:21]Reserved000[20:18]Data Cache size(数据缓存大小)101(defines 16KB)[17:15]Data Cache associativity110(defines 64 way)[14]Reserved0[13:12]Data Cache words per line10(defines 8 words per line) [11:9]Reserved000[ 8:6]Instruction Cache size(指令缓存大小)101(defines 16KB)[5:3]Instruction Cache Associativity110(defines 64 way)[2]Reserved0[1:0]Instruction Cache per line10(defines 8 words per line)寄存器1:Control register对该寄存器读写指令如下:MRC p15, 0, Rd, c1, c0, 0 ; read control registerMCR p15, 0, Rd, c1, c0, 0 ; write control register该寄存器功能如下表Registe bits Name Function Value31iA bit Asynchronous clock select见时钟模式表30nF bit notFastBus select见时钟模式表29:15-Reserved Read = UnpredictableWrite = should be zero14RR bit Round robin replacement0 = Random replacement1 = Round robin replacement13V bit Base location of exceptionregister(异常寄存器基地址)0 = Low address = 0x0000 00001 = High address = 0xFFFF 000012I bit Instruction cache enable0 = Instruction cache disable1 = Instruction cache enable11:10-Reserved Read = 00Write = 009R bit ROM protection见图18S bit System protection见图17 B bit Big-endian/little-endian0 = Little-endian operation1 = Big-endian operation6:3- Reserved Read = 1111Write = 11112 C bit Data cache enable0 = data cache disable1 = data cache enable1 A bit Alignment fault enable Data address alignment fault checking(地址对齐检查)0 = 禁用地址对齐检查功能1 = 使能地址对齐检查功能0M bit MMU enable0 = MMU disable1 = MMU enable时钟模式表Clocking mode(时钟模式)iA nFFastbus mode (快速总线模式)00Reserved10Synchronous (同步模式)01Asynchronous (异步模式)11寄存器2:Translation Table Base(TTB) RegisterRegister bits Function31:14 Pointer to first level translation table base . Read /write13:0 ReservedRead = UnpredictableWrite = Should be zero访问C2寄存器指令如下:MRC p15, 0, Rd, C2, C0, 0 ; Read TTB registerMCR p15, 0, Rd, C2, C0, 0 ; Write TTB register该寄存器存放第一级转换表基地址。