ARM MMU L1 L2页表计算说明剖析_第1页
ARM MMU L1 L2页表计算说明剖析_第2页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ARM的存储管理单元MMU知识点介绍1ARMMMU页表设置计算9ARM的存储管理单元MMU知识点介绍由于ARM的MMU知识体系比较庞大,只总结必须知道了解的MMU知识点。(一) MMU内存管理单元的作用(1) 虚拟存储空间到物理存储空间的映射(2) 存储器访问权限控制(3) 设置虚拟存储空间的缓冲特性(二) MMU的地址变换的内存块单元(1)段单元:按大小为1M的内存块单元为单位进行的虚拟地址物理地址之间的变换。2)大页单元:按大小为64K的内存块单元为单位进行的虚拟地址物理地址之间的变换。(3)小页单元:按大小为4K的内存块单元为单位进行的虚拟地址物理地址之间的变换。(4)极小页单元:按大小

2、为1K的内存块单元为单位进行的虚拟地址物理地址之间的变换。Linux在最初的汇编代码中使用段单元的映射机制来实现MMU的开启。当Linux系统启动之后采用的是小页单元的映射机制,因为我们知道Linux把物理内存和虚拟内存的管理是按页来管理的,每个页大小为4k字节。(三)MMU的地址变换方式(1)一级页表地址映射第1页共47页Modifiedvirtualaddresssaio3114130TfantlalkinHas旧Translationtablebas-e一级描述捋地址一级描述符2019PhysicalSsctian'ndejc31141321aTins-liun如昭Tahitii

3、nife屈00Sectionfirst-leveldescriptorSectiaTi茫笑屯sezA.P0Dornain1C呂101211109S5432100内存勃理地址一级页表地址段映射,是指按1M大小的内存块单元进行的地址映射,查找的过程就是找到页表基地址和当前需要转化的虚拟地址的高12位为索引的页目录项,由于每个目录项都是4字节对齐的,所以应该为:页表基地址+虚拟地址高12位X4,从上图中可看出第3页共47页一级描述符的地址总是4字节对齐的,即后两位为0级描述符地址中存放的是一级描述符,一级描述符的格式定义如下:2019Sectionbaseaddress1211109S543210D

4、omatn1CB10啓的和理地址基地址映射实例:题目:把内存的地址从0x100000-0x200000空间映射成虚拟地址0xc0100000-0xc0200000的地址空间.(第一步)根据图1的介绍,我们先把内存虚拟地址右移20位:Tableindex=(0xc0100000>>20)=0xc01(第二步)我们打算用内存地址0x4000-0x8000的内存空间内作为存放页表的内存地址。所以把0x4000写到CP15:C2寄存器。注意0x4000正好是16k对齐。所以这里的一级描述符地址为:一级描述符地址:(0x4000+(0xc01<<2)=0x4000+0x3004=

5、0x7004(第三步)我们根据需要把该虚拟地址映射到实际的物理地址的需求,来构建一级页表描述符:根据图2,我们为了取得被映射的物理地址基地址,需要将物理地址右移20位:Sectionbaseaddress=(0x100000>>20)=0x1AP,Domain,C,B属性在实例中不做设置。所以最终的一级页表描述符为:'lcblO'=0bl0010=0xl2一级页表描述符=(0x1<<20)+0x12=0x100000+0x12=0x100012然后把这个0x100012(级页表描述符)写到一级描述符地址0x7004指向的内存中去。这样当我们需要访问虚拟内

6、存地址0xc0100000的时候,CPU需要做的事情就是读取C2寄存器,找到页表基地址0x4000,然后根据OxcOlOOOOO>>20的index索引找到一级描述符基地址(0x4000+(0xc01<<2),然后读取这个地址里面的一级描述符:0x100012,得到段映射的物理基地址0x100012>>20,然后再与虚拟地址的低20位相加,得到对应的物理地址0x100000第5页共47页(2)二级页表地址映射虚拟地址C2中旋表的辜故址TranslationtabebaseIvlodifiedvirtualaddress辽卄g也LWDtabteindes311

7、4130"fansSaflonSase一级皓述符地址31?321QTrajTsiadotba弗TabtemetaGd壊描述荷First-ie*/eidescrlplorCnarfi>a产守imhStu-caJscSdrRKDamain1611j-ji二亵描述褂地册31109210Cuhtmpag?t-abJflbd*«ddrt533口怙团eirdex.£二级描谜特Physicaladdress12113121110ga7654321aPagebaseaddressAP3AP2AP1APOCB1aSBXjnd-ltiVfcjlS3第9页共47页二级页表的映射查

8、找过程其实就是,找到页表基地址,然后找到一级描述符,然后通过一级描述符找到二级页表的基地址,然后再找到二级页表的描述符,通过二级页表描述符来找到对应的物理地址基地址。二级描述符结构:311615121110P876543210SmallpagebaseaddressAP3AP2AP1APOCB0Smallpage團4二级描述符的说明可以参考一级描述符的描述。31-2221-1211-0(3)一级,二级页表地址映射的过程图:目录项和页面表都是存放在内存中的表。虚拟地址和物理地址的转化就是查找这些表的过程。ARMMMU页表设置计算内存管理单元简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机

9、制的内存访问权限检查。MMU使得每个用户进程拥有自己独立的地址空间,并通过内存访问权限的检查保护每个进程所用的内存不被其他进程破坏。重点就在于地址映射:页表的结构与建立、映射的过程。1、S3C2410/S3C2440MMU地址变换过程1)地址的分类一个程序在运行之前,没有必要全部装入内存,仅需要将那些要运行的部分先装入内存,其余部分在用到时从磁盘载入,当内存不足时,再将暂时不用的部分调出到磁盘。这使得大程序可以在较小的内存空间中运行,也使得内存中可以同时装入更多的程序并发执行,这样的存储器一般称为虚拟存储器。虚拟地址最终需要转换为物理地址才能读写实际的数据,通过将虚拟地址空间和物理空间划分为同

10、样大小的空间(段或页),然后两个空间建立映射关系。由于虚拟地址空间远大于物理地址,可能多块虚拟地址空间映射到同一块物理地址空间,或者有些虚拟地址空间没有映射到具体的物理地址空间上去(使用到时再映射)。ARMcpu地址转换涉及三种地址:虚拟地址(VA,VirtualAddress)、变换后的虚拟地址(MVA,ModifiedVirtualAddress)、物理地址(PA,PhysicalAddress)没有启动MMU时,CPU核心,cache,MMU,外设等所有部件使用的都是物理地址。启动MMU后,CPU核心对外发出虚拟地址VA;VA被转换为MVA供cache,MMU使用,在这里MVA被转换成P

11、A;最后使用PA读取实际设备 CPU核心看到和用到的只是虚拟地址VA,至于VA如果去对应物理地址PA,CPU核心不理会 caches和MMU看不到VA,他们利用MVA转换得到PA 实际设备看不到VA、MVA,读写它们使用的是物理地址PAMVA是除CPU核心外的其他部分看到的虚拟地址,VA与MVA的变化关系如果VA<32M,需要使用进程标识号PID(通过读CP15的C13获得)来转换为MVAif(VA<32M)thenMVA=VA|(PID<<25)elseMVA=VA使用MVA,而不使用VA的目的是,当有重叠的VA时,转换为MVA地址并不重叠,减小转换为PA的代价比如两

12、个进程1、2,VA都是0-(32M-1),则MVA分别为0x02000000-0x03ffffff,0x04000000-0x05ffffff。下文说到虚拟地址,如果没有特别指出,就是指MVA2)虚拟地址到物理地址的转换过程armcpu使用页表来进行转换,页表由一个个条目组成,每个条目存储一段虚拟地址对应的物理地址及访问权限,或者下一级页表的地址S3C2440最多会用到两级页表,以段(Section,1M)的方式进行转换时只用到一级页表,以页(Page)的方式进行转换时用到两级页表。页的大小有3种:大页(64KB),小页(4KB),极小页(1KB)。条目也称为描述符,有:段描述符、大页描述符、

13、小页描述符、极小页描述符-保存段、大页、小页、极小页的起始物理地址;粗页表描述符、细页表描述符,它们保存二级页表的物理地址。下图为S3C2440的地址转换图第11页共47页TrinSIn轴MtyfmwlilidvKulj-ddrorMbitsfii空tf|SfKlican|rtd«-wdby哂iKuolacMrswbits11或妫Largopagic牛口为曾Indexedbymodlflod-virtualJ日曲口“Ms|15t:d|Tr-iypagg-cabiixkwlnd»x$dbymodifiodvirtualdkiwabitT.|19;Wrrcifllifie百im

14、gl订dMretibife|19-12ltwiti-Fifwp啊olbdo-Srn-all|世g与bs-MTinypagwvirtualmsia:o64KBlndDKGdlyvirtualMuii:qSm«tl|l卩為鈔4KBInd&xoclDymodified菊町pogo1KB第11页共47页TTBbase代表一级页表的地址,将它写入协处理器CP15的寄存器C2(称为页表基址寄存器)即可,一级页表的地址是16K对齐,使用31:14存储页表基址,13:0为0一级页表使用4096个描述符来表示4GB空间,每个描述符对应1MB的虚拟地址,存储它对应的1MB物理空间的起始地址,或者

15、存储下一级页表的地址。使用MVA31:20来索引一级页表(20-31共12位,212=4096,所以是4096个描述符),得到一个描述符,每个描述符占4个字节。一级页表描述符格式如下:00占心口憧口pageIziblebnatiuddreaaDonmin1Ci1Sccllontuncnddft-131Qoiraln1cE10fim戶恥轉話曙bfruMdr+iiOOVUlHi11s5«1tenFIh«paaUblc一级页表描述符最低两位:0b00:无效0b01:粗页表(Coarsepagetable)31:10为粗页表基址,此描述符低10位填充0后就是一个二级页表的物理地址,

16、二级页表含256个条目(使用9:2,28=256个),称为粗页表(Coarsepagetable)。其中每个条目表示4KB大小的物理地址空间,一个粗页表表示1MB物理地址0b10:段(Section)31:20为段基址,、此描述符低20位填充0后就是一块1MB物理地址空间的起始地址。MVA19:0,用来在这1MB空间中寻址。描述符的位31:20和皿VA19:0构成了这个虚拟地址MVA对应的物理地址以段的方式进行映射时,虚拟地址MVA到物理地址PA的转换过程如下: 页表基址寄存器位31:14和MVA31:20组成一个低两位为0的32位地址,MMU利用这个地址找到段描述符 取出段描述符的位31:2

17、0(段基址),它和MVA19:0组成一个32位的物理地址(这就是MVA对应的PA)312019Physicaladdress段地址转换过程Obll:细页表(Finepagetable)31:12为细页表基址(Finepagetablebaseaddress),此描述符的低12位填充0后,就是一个二级页表的物理地址。此二级页表含1024个条目(使用11:2,10位),其中每个条目表示大小1kb的物理地址空间,一个细页表表示1MB物理地址空间以大页(64KB),小页(4KB)或极小页(1KB)进行地址映射时,需要用到二级页表,二级页表有粗页表、细页表两种,二级页表描述符格式如下:0Lirs>

18、ebate3ddlnif*11*3P2plapDCa1Srmalllpa-geba±eaddresspqapOC1=0Tinypaig»ci131FaultL老I*口豐p口書SmaillpagtfrH呼pag.二级页表描述符最低两位:0b00:无效ObOl:大页描述符位31:16为大页基址,此描述符的低16位填充0后就是一块64KB物理地址空间的起始地址粗页表中的每个条目只能表示4KB物理空间,如果大页描述符保存在粗页表中,则连续16个条目都保存同一个大页描述符。类似的,细页表中每个条目只能表示1KB的物理空间,如果大页描述符保存在细页表中,则连续64个条目都保存同一个大页

19、描述符。下面以保存在粗页表中的大页描述符为例,说明地址转化那过程 页表基址寄存器31:14和MVA31:20组成一个低两位为0的32位地址,MMU利用这个地址找到粗页表描述符 取出粗页表描述符的31:10(即粗页表基址),它和MVA19:12组成一个低两位为0的32位物理地址,通过这个地址找到大页描述符 取出大页描述符的31:16(即大页基址),它和MVA15:0组成一个32位的物理地址,即MVA对应的PA步骤和中,用于在粗页表中索引的MVA19:12、用于在大页内寻址的MVA15:0有重合的位15:12,当位15:12从0b0000变化到0b1111时,步骤得到的大页描述符相同,所以粗页表中

20、有连续16个条目保存同一个大页描述符第17页共47页3120191090Physicaladdress第19页共47页大页的地址转换过程(大页描述符保存在粗页表中)OblO:小页描述符31:12为小页基址(Smallpagebaseaddress),此描述符的低12位填充0后就是一块4kb(11:0,共12位,22=4096)物理地址空间的起始地址。粗页表中每个条目表示4kb的物理空间,如果小页描述符保存在粗页表中,则只需要用一个条目来保存一个小页描述符。类似的,细页表中每个条目只能表示1kb的物理空间,如果小页保存在细页表中,则连续4个条目都保存同一个小页描述符。下面以保存在粗页表中的小页描

21、述符为例,说明地址转换过程: 页表基址31:14和MVA31:20组成一个低两位为0的32位地址,MMU利用这个地址找到粗页表描述符 取出粗页表描述符31:10(即粗页表基址),它和MVA19:12组成一个低两位为0的32位物理地址,用这个地址找到小页描述符 取出小页描述符的位31:12(即小页基址),它和MVA11:0组成一个32位物理地址(即MVA对应的PA)小页描述符保存在细页表中,地址转换过程和上面类似。小页的地址转换过程(小页描述符保存在粗页表中)0b11:极小页描述符31:10为极小页基址(Tinypagebaseaddress),此描述符的低10位填充0后就是一块1KB物理地址空

22、间的起始地址。极小页描述符只能保存在细页表中,用一个条目来保存一耳光极小页描述符下面是极小页的地址转换过程: 页表基址寄存器31:14和MVA31:20组成一个低两位为0的32位地址,MMU通过这个地址找到细页表描述符 取出细页表描述符31:12(即细页表基址),它和MVA19:10组成一个低两位为0的32位物理地址,通过这个地址即可找到极小页描述符 取出极小页描述符31:10(即极小页基址),它和MVA9:0组成一个32位的物理地址(即MVA对应的PA)第21页共47页31201S1090PageaddressPage-indexPhysicaladdress第23页共47页极小页的地址转换

23、过程(极小页描述符保存在粗页表中)从段、大页、小页、极小页的地址转换过程可知 以段进行映射时,通过MVA31:20结合页表得到一段(1MB)的起始物理地址,MVA19:0用来在段中寻址 以大页进行映射时,通过MVA31:16结合页表得到一个大页(64KB)的起始物理地址,MVA15:0用来在小页中寻址 以小页进行映射时,通过MVA31:12结合页表得到一个小页(4KB)的起始物理地址,MVA11:O用来在小页中寻址 以极小页进行映射时,通过MVA31:10结合页表得到一个极小页(1KB)的起始物理地址,MVA9:0用来在极小页中寻址2、内存的访问权限检查它决定一块内存是否允许读、是否允许写。这

24、由CP15寄存器C3(域访问控制)、描述符的域0omain)、CP15寄存器Cl的R/S/A位、描述符的AP位共同决定。“域”决定是否对某块内存进行权限检查,“AP”决定如何对某块内容进行权限检查。S3C2440有16个域,CP15寄存器C3中每两位对应一个域(一共32位),用来表示这个域是否进行权限检查每两位数据的含义00:无访问权限(任何访问都将导致“Domainfault"异常)01:客户模式(使用段描述符、页描述符进行权限检查)10:保留(保留,目前相当于“无访问权限”)11:管理模式(不进行权限检查,允许任何访问)Domain占用4位,用来表示内存属于0-15,哪一个域例如

25、: 段描述符中的“Domain”为0b0010,表示1MB内存属于域2,如果域访问控制寄存器的5:4等于0b00,则访问这1MB空间都会产生“Domainfault"异常,如果等于0b01,则使用描述符中的“Ap”位进行权限检查 粗页表中的“Domain"为0b1010,表示1MB内存属于域10,如果域访问控制寄存器的21:20等于0b01,则使用二级页表中的大页/小页描述符中的ap3、ap2、ap1、ap0位进行权限检查,如果等于0b11,则允许任何访问,不进行权限检查。如下图:霍邮I导12?$4J2ig00刊皿iCoaracpibgcIsbltibnaaDdJrt3&g

26、t;3DDirainICi11aH府SeelionbncaddmsIAPODiraln1cb1OiS«1tonFlMrm轉隠bifrt酬少暫111FImiible一级页表描述符0i.1b倉主色曲ddirts整養11PpSP9|胪apbCa1Smll1bieiddrsss1ap3ap2|叩】apOCLfl*Tinypsig»sbddr*aitaFcfa113116151S1-1I0S8765*3210FaultL右口毛Small二级页表描述符AP、ap3、ap2、apl、apO结合CP15寄存器Cl的R/S位,决定如何进行访问检查。段描述符中AP控制整个段(1MB)访问权限;

27、大页描述符每个apx(0-3)控制一个大页(64KB)中1/4内存的访问权限,即ap3对应大页高端的16KB,ap0对应大页低端的16KB;小页描述符与大页描述符类似,每个apx(0-3)控制一个小页(4KB)的1/4内存的访问权限;极小页中的ap控制整个极小页(1KB)的访问权限。下表为AP、S、R的对照表APSR特权模式用户模式说明0000无访问权限无访问权限任何访问将产生"Permissionfault”异常0010只读无访问权限在超级权限下可以进行读操作0001只读只读任何写操作将产生"Permissionfault"异常0011保留-01XX读/写无访问

28、权限只允许在超级模式下访问10XX读/写只读在用户模式下进行写操作将产生"Permissionfault"异常11XX读/写读/写在所有模式下允许任何访问XX11保留-第25页共47页3、TLB的作用从MVA到PA的转换需要访问多次内存,大大降低了CPU的性能,有没有办法改进呢?程序执行过程中,用到的指令和数据的地址往往集中在一个很小的范围内,其中的地址、数据经常使用,这是程序访问的局部性。由此,通过使用一个高速、容量相对较小的存储器来存储近期用到的页表条目(段、大页、小页、极小页描述符),避免每次地址转换都到主存中查找,这样就大幅提高性能。这个存储器用来帮助快速地进行地址

29、转换,成为转译查找缓存(TranslationLookasideBuffers,TLB)当CPU发出一个虚拟地址时,MMU首先访问TLB。如果TLB中含有能转换这个虚拟地址的描述符,则直接利用此描述符进行地址转换和权限检查,否则MMU访问页表找到描述符后再进行地址转换和权限检查,并将这个描述符填入TLB中,下次再使用这个虚拟地址时就直接使用TLB用的描述符。使用TLB需要保证TLB中的内容与页表一致,在启动MMU之前,页表中的内容发生变化后,尤其要注意。一般的做法是在启动MMU之前使整个TLB无效,改变页表时,使所涉及的虚拟地址对应的TLB中条目无效。4、Cache的作用同样基于程序访问的局部

30、性,在主存和CPU通用寄存器之间设置一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用,对提高程序的运行速度有很大作用。这个cache般称为高速缓存。 写穿式(WriteThrough)任一CPU发出写信号送到Cache的同时,也写入主存,保证主存的数据同步更新。优点是操作简单,但由于主存速度慢,降低了系统的写速度并占用了总线的时间。 回写式(WriteBack)数据一般只写到Cache,这样可能出现Cache中的数据得到更新而主存中的数据不变(数据陈旧)的情况。此时可在Cache中设一个标志地址及数据陈旧的信息,只有当C

31、ache中的数据被换出或强制进行”清空“操作时,才将原更新的数据写入主存响应的单元中,保证了Cache和主存中数据一致。Cache有以下两个操作: ”清空“(clean):把Cache或Writebuffer中已经脏的(修改过,但未写入主存)数据写入主存 ”使无效“(Invalidate):使之不能再使用,并不将脏的数据写入主存。S2C2440内置了指令Cache(ICaches)、数据Cache(DCaches)、写缓存(Writebuffer),需要用到描述符中的C位(Ctt)和B位(Btt)1)指令Cache(ICaches)第27页共47页系统刚上电或复位时,ICaches中的内容是无

32、效的,并且ICaches功能关闭。往1呪位(CP15协处理器中寄存器1的第12位)写1可以启动ICaches,写0停止ICachesICaches一般在MMU开启后使用,此时描述符的C位用来表示一段内存是否可以被Cache。若Ctt=1,允许Cache,否则不允许。如果MMU没有开启,ICaches也可以被使用,此时CPU读取指令时所涉及的内存都被当做允许CacheICaches关闭时,CPU每次取指都要读取主存,性能低,所以通常尽早启动ICachesICaches开启后,CPU每次取指时都会先在ICaches中查看是否能找到所用指令,而不管Ctt是0还是1。如果找到成为Cache命中,找不到

33、称为Cache丢失,ICaches被开启后,CPU的取指有如下三种情况: Cache命中且Ctt为1时,从ICaches中取指,返回CPU Cache丢失且Ctt为1时,CPU从主存中取指,并且把指令缓存到Cache中 Ctt为0时,CPU从主存中取指2)数据Cache(DCaches)与ICaches相似,系统刚上电或复位时,DCaches中的内容无效,并且DCaches功能关闭,Writebuffer中的内容也是被废弃不用的。往Ccr位(CP15协处理器中寄存器1的第二位)写1启动DCaches,写0停止DCaches。Writebuffer和DCaches紧密结合,额米有专门的控制来开启

34、和停止它与ICaches不同,DCaches功能必须在MMU开启之后才能被使用。DCaches被关闭时,CPU每次都去内存取数据。DCaches被开启后,CPU每次读写数据时都会先在DCaches中查看是否能找到所要的数据,不管Ctt是0还是1,找到了成为Cache命中,找不到成为Cache丢失。通过下表可知DCaches和Writebuffer在Ccr,Ctt,Btt各种取值下,如何工作,CttandCcr意为Ctt与Ccr进行逻辑与后的值CttandCcrBttDCaches、Writebuffer和主存的访问方式00Non-cached,non-buffered(NCNB)读写数据时都是

35、直接操作主存,并且可以被外设中止;写数据时不使用Writebuffer,CPU会等待写操作完成;不会出现Cache命中01Non-Cachedbuffered(NCB)读数据时都是直接操作主存;不会出现Cache命中;写数据时,数据线存入Writebuffer,并在随后写入主存;数据存入Writebuffer后,CPU立即继续执行;第29页共47页读数据时,可以被外设中止;写数据时,无法被外设中止10Cached,write-through(写通)mode读数据时,如果Cache命中则从Cache中返回数据,不读取主存;读数据时,如果Cache丢失则从读主存中返回数据,并导致"lin

36、efill”的动作;写数据时,数据先存入Writebuffer,并在随后写入主存;数据存入Writebuffer后,CPU立即继续执行;写数据时,如果Cache命中则新数据也写入Cache中;写数据时,无法被外设中止11Cached,write-back(写回)mode读数据时,如果Cache命中则从Cache中返回数据,不读取主存;读数据时,如果Cache丢失则从读主存中返回数据,并导致"linefile”的动作;写数据时,如果Cache丢失则将数据先存入Writebuffer,存储完毕后CPu立即继续执行,这些数据在随后写入主存;写数据时,如果Cache命中则在Cache中更新数

37、据,并设置这些数据为”脏的",但是不会写入主存;无论Cache命中与否,写数据都无法被外设中止使用Cache时需要保证Cache、Writebuffer的内容和主存内容一致,保证下面两个原则: 清空DCaches,使主存数据得到更新 使无效ICaches,使CPU取指时重新读取主存在实际编写程序时,要注意如下几点: 开启MMU前,十五小ICaches,DCaches和Writebuffer 关闭MMU前,清空ICaches、DCaches,即将”脏“数据写到主存上 如果代码有变,使无效ICaches,这样CPU取指时会从新读取主存 使用DMA操作可以被Cache的内存时,将内存的数据

38、发送出去时,要清空Cache;将内存的数据读入时,要使无效Cache 改变页表中地址映射关系时也要慎重考虑 开启ICaches或DCaches时,要考虑ICaches或DCaches中的内容是否与主存保持一致 对于I/O地址空间,不使用Cache和Writebuffer5、S3C2440MMU、TLB、Cache的控制指令S3C2440除了ARM920T的CPU核心外,还有若干个协处理器,用来帮助主CPu完成一些特殊功能。对MMU、TLB、Cache等的操作涉及到协处理器。<MCR|MRC>条件协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2&l

39、t;MCR|MRC>condp#,<expression1>,Rd,cn,cm,<expression2>MRC/从协处理器获得数据,传给ARM920TCPU核心寄存器MCR/数据从ARM920TCPU核心寄存器传给协处理器cond/执行条件,省略时表示无条件执行p#/协处理器序号<expression1>/一个常数Rd/ARM920TCPU核心的寄存器cn和cm/协处理器中的寄存器<expression2>/一个常数其中,<expression1>、cn、cm、<expression2>仅供协处理器使用,它们的作用

40、如何取决于具体的协处理器第33页共47页二、MMU使用实例:地址映射这个实例将开启MMU,并将虚拟地址OxAOOOOOOO-OxAOlOOOOO映射到物理地址0x56000000-0x56100000(GPBC0N物理地址为0x56000010,GPBDAT物理地址为0x56000014),来驱动LED。将虚拟地址0xB0000000-0xB3FFFFFF映射到物理地址0x30000000-0x33FFFFFF,在连接程序时,将一部分代码的运行地址指定为0xB0004000.这个程序只使用一级页表,以段的方式进行地址映射,32位CPU虚拟地址空间达到4G,一级页表使用4096个描述符来表示4G

41、空间(每个描述符对应1MB),每个描述符占4字节,所以一级页表占16KB。这个程序使用SDRAM的开始16KB存放一级页表,所以剩下的内存开始地址就为0x30004000,这个地址最终会对应虚拟地址0xB0004000(所以代码运行地址为0xB0004000)程序分为两部分:第一部分的运行地址为0,它用来初始化SDRAM,复制第二部分的代码到SDRAM中(存放在0x30004000)、设置页表、启动MMU,最后跳到SDRAM中(地址0xB0004000),第二部分运行地址设为0xB0004000,用来驱动LED先看连接文件mmu.ldsSECTIONSfirtst0x00000000:head

42、.oinit.osecond0xB0004000:AT(2048)leds.o程序分两个段:first和second。first由head.o和init.o组成,加载和运行地址都是0,second由leds.o组成,加载地址为2048,重定位地址为0xB0004000。*File:head.S功能:设置SDRAM,将第二部分代码复制到SDRAM,设置页表,启动MMU,然后跳到SDRAM继续执行*.text.global_start_start:ldrsp,=4096设置栈指针,以下都是C函数,调用前需要设好栈bldisable_watch_dog关闭WATCHDOG,否则CPU会不断重启blc

43、opy_2th_to_sdram将第二部分代码复制到SDRAMblcreate_page_table设置页表blmmu_init启动MMU,启动以后下面代码都用虚拟地址ldrsp,=0xB4000000重设栈指针,指向SDRAM顶端(使用虚拟地址)ldrpc,=0xB0004000跳到SDRAM中继续执行第二部分代码halt_loop:bhalt_loopblmemsetup设置存储控制器以使用SDRAM/*init.c:进行一些初始化,在Steppingstone中运行*它和head.S同属第一部分程序,此时MMU未开启,使用物理地址*/第35页共47页/*WATCHDOG寄存器*/#def

44、ineWTCON(*(volatileunsignedlong*)0x53000000)/*存储控制器的寄存器起始地址*/#defineMEM_CTL_BASE0x48000000/*关闭WATCHDOG,否则CPU会不断重启*/voiddisable_watch_dog(void)WTCON=0;/关闭WATCHDOG很简单,往这个寄存器写0即可/*设置存储控制器以使用SDRAM*/第37页共47页voidmemsetup(void)/*SDRAM13个寄存器的值*/unsignedlongconstmem_cfg_val=0x22011110,/BWSCON0x00000700,0x000

45、00700,0x00000700,0x00000700,0x00000700,0x00000700,0x00018005,0x00018005,0x008C07A3,OxOOOOOOBl,/BANKCONO/BANKCONI/BANKC0N2/BANKC0N3/BANKC0N4/BANKC0N5/BANKC0N6/BANKC0N7/REFRESH/BANKSIZE第34页共47页0x00000030,/MRSRB60x00000030,/MRSRB7;inti=0;volatileunsignedlong*p=(volatileunsignedlong*)MEM_CTL_BASE;for(;i

46、<13;i+)pi=mem_cfg_vali;/循环复制13个寄存器到内存控制器基址/*将第二部分代码复制到SDRAM*/voidcopy_2th_to_sdram(void)unsignedint*pdwSrc=(unsignedint*)2048;/第二段代码加载地址2048第35页共47页unsignedint设置页表pdwDest二(unsignedint*)0x30004000;/4kb最大4096while(pdwSrc<(unsignedint*)4096)*pdwDest二*pdwSrc:pdwDest+;pdwSrc+;voidcreate_page_table(

47、void)/0x30004000前放页表第36页共47页/*用于段描述符的一些宏定义第37页共47页*31:20段基址,ll:10AP,*/#defineMMU_FULL_ACCESS#defineMMU_DOMAIN#defineMMU_SPECIAL#defineMMU_CACHEABLE#defineMMU_BUFFERABLE#defineMMU_SECTION#defineMMU_SECDESC#defineMMU_SECDESC_WB8:5Domain,3C,2B,1:00b10为段描述符(3<<10)/*访问权限AP*/(0<<5)/*属于哪个域Domai

48、n*/(1<<4)/*必须是1*/(1<<3)/*cacheableC位*/(1<<2)/*bufferableB位*/(2)/*表示这是段描述符*/(MMU_FULL_ACCESS|MMU_DOMAIN|MMU_SPECIAL|MMU_SECTION)(MMU_FULL_ACCESS|MMU_DOMAIN|MMU_SPECIAL|MMU_CACHEABLE|MMU_BUFFERABLE|MMU_SECTION)#defineMMU_SECTION_SIZE0x00100000/*每个段描述符对应1MB大小空间*/unsignedlongvirtuladdr

49、,physicaladdr;unsignedlong*mmu_tlb_base=(unsignedlong*)0x30000000;/*SDRAM开始地址存放页表*/*Steppingstone的起始物理地址为0,第一部分程序的起始运行地址也是0,*为了在开启MMU后仍能运行第一部分的程序,*将01M的虚拟地址映射到同样的物理地址*/virtuladdr=0;physicaladdr=0;/虚拟地址31:20用于索引一级页表,找到它对应的描述符,对应于(virtualaddr>>20)/段描述符中31:20保存段的物理地址,对应(physicaladdr&0xFFF0000

50、0)*(mmu_tlb_base+(virtuladdr>>20)=(physicaladdr&0xFFF00000)|MMU_SECDESC_WB;/* 0x56000000是GPIO寄存器的起始物理地址,* GPBCON和GPBDAT这两个寄存器的物理地址0x56000010、0x56000014,*为了在第二部分程序中能以地址0xA0000010、0xA0000014来操作GPBCON、GPBDAT,*把从0xA0000000开始的1M虚拟地址空间映射到从0x56000000开始的1M物理地址空间*/virtuladdr=0xA0000000;physicaladdr

51、=0x56000000;*(mmu_tlb_base+(virtuladdr>>20)=(physicaladdr&0xFFF00000)|MMU_SECDESC;/* SDRAM的物理地址范围是0x300000000x33FFFFFF,* 将虚拟地址0xB00000000xB3FFFFFF映射到物理地址0x300000000x33FFFFFF上,*总共64M,涉及64个段描述符*/virtuladdr=0xB0000000;physicaladdr=0x30000000;while(virtuladdr<0xB4000000)*(mmu_tlb_base+(virt

52、uladdr>>20)=(physicaladdr&0xFFF00000)|MMU_SECDESC_WB;virtuladdr+=0x100000;/右移20位就是1physicaladdr+=0x100000;/右移20位就是1/*启动MMU*/voidmmu_init(void)unsignedlongttb=0x30000000;asm_("movr0,#0n""mcrpl5,0,r0,c7,c7,0n/*使无效ICaches和DCaches*/"mcrp15,0,r0,c7,c10,4n"/*drainwritebufferonv4*/"mcrp15,0,r0,c8,c7,0n/*使无效指令、数据TLB*/"movr4,%0n"/*r4=页表基址*/"mcrp15,0,r4,c2,c0,0n/*设置页表基址寄存器*/"mvnr0,#0n"mcrp15,0,rO,c3,cO,0n"/*域访问控制寄存器设为OxFFFFFFFF,不进行权限检查*/*对于控制寄存器,先读出其值,在这基础上修改感兴趣的位,*然后再写入*/"mrcp15,0,r0,c1,c0,0n"/R、S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论