网站建设多少钱十年乐云seo,本溪做网站 淘宝店,手机行情网站,中山市建设局投诉网站一、MMU的产生许多年以前#xff0c;当人们还在使用DOS或是更古老的操作系统的时候#xff0c;计算机的内存还非常小#xff0c;一般都是以K为单位进行计算#xff0c;相应的#xff0c;当时的程序规模也不大#xff0c;所以内存容量虽然小#xff0c;但还是可以容纳当时…一、MMU的产生许多年以前当人们还在使用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~0x0FFFFFFF256MB。在没有使用虚拟存储器的机器上虚拟地址被直接送到内存总线上使具有相同地址的物理存储器被读写。而在使用了虚拟存储器的情况下虚拟地址不是被直接送到内存地址总线上而是送到内存管理单元——MMU主角终于出现了。他由一个或一组芯片组成一般存在与协处理器中其功能是把虚拟地址映射为物理地址。二、MMU工作过程大多数使用虚拟存储器的系统都使用一种称为分页paging的技术。虚拟地址空间划分成称为页page的单位而相应的物理地址空间也被进行划分单位是页框(frame).页和页框的大小必须相同。接下来配合图片我以一个例子说明页与页框之间在MMU的调度下是如何进行映射的在这个例子中我们有一台可以生成16位地址的机器它的虚拟地址范围从0x0000~0xFFFF(64K),而这台机器只有32K的物理地址因此他可以运行64K的程序但该程序不能一次性调入内存运行。这台机器必须有一个达到可以存放64K程序的外部存储器例如磁盘或是FLASH以保证程序片段在需要时可以被调用。在这个例子中页的大小为4K页框大小与页相同这点是必须保证的内存和外围存储器之间的传输总是以页为单位的对应64K的虚拟地址和32K的物理存储器他们分别包含了16个页和8个页框。我们先根据上图解释一下分页后要用到的几个术语在上面我们已经接触了页和页框上图中绿色部分是物理空间其中每一格表示一个物理页框。橘黄色部分是虚拟空间每一格表示一个页它由两部分组成分别是Frame Index(页框索引)和位ppresent 存在位Frame Index的意义很明显它指出本页是往哪个物理页框进行映射的位p的意义则是指出本页的映射是否有效如上图当某个页并没有被映射时或称映射无效Frame Index部分为X该位为0映射有效则该位为1。我们执行下面这些指令本例子的指令不针对任何特定机型都是伪指令例1: MOVE REG,0 //将0号地址的值传递进寄存器REG. 虚拟地址0将被送往MMU,MMU看到该虚地址落在页0范围内页0范围是0到4095从上图我们看到页0所对应映射的页框为2页框2的地址范围是8192到12287因此MMU将该虚拟地址转化为物理地址8192并把地址8192送到地址总线上。内存对MMU的映射一无所知它只看到一个对地址8192的读请求并执行它。MMU从而把0到4096的虚拟地址映射到8192到12287的物理地址。例2 MOVE REG,8192 被转换为 MOVE REG,24576 因为虚拟地址8192在页2中而页2被映射到页框6物理地址从24576到28671例3 MOVE REG,20500 被转换为 MOVE REG,12308 虚拟地址20500在虚页5虚拟地址范围是20480到24575距开头20个字节处虚页5映射到页框3页框3的地址范围是 12288到16383于是被映射到物理地址122882012308。通过适当的设置MMU可以把16个虚页隐射到8个页框中的任何一个但是这个方法并没有有效的解决虚拟地址空间比物理地址空间大的问题。从上图中我们可以看到我们只有8个页框物理地址但我们有16个页虚拟地址所以我们只能把16个页中的8个进行有效的映射。我们看看例4会发生什么情况MOV REG,32780 虚拟地址32780落在页8的范围内从上图总我们看到页8没有被有效的进行映射该页被打上X这是又会发生什么MMU注意到这个页没有被映射于是通知CPU发生一个缺页故障page fault.这种情况下操作系统必须处理这个页故障它必须从8个物理页框中找到1个当前很少被使用的页框并把该页框的内容写入外围存储器这个动作被称为page copy随后把需要引用的页例4中是页8映射到刚才释放的页框中这个动作称为修改映射关系然后从新执行产生故障的指令MOV REG,32780。假设操作系统决定释放页框1那么它将把虚页8装入物理地址的4-8K,并做两处修改首先把标记虚页1未被映射原来虚页1是被影射到页框1的以使以后任何对虚拟地址4K到8K的访问都引起页故障而使操作系统做出适当的动作这个动作正是我们现在在讨论的其次他把虚页8对应的页框号由X变为1因此重新执行MOV REG,32780时MMU将把32780映射为4108。我们大致了解了MMU在我们的机器中扮演了什么角色以及它基本的工作内容是什么下面我们将举例子说明它究竟是如何工作的注意本例中的MMU并无针对某种特定的机型它是所有MMU工作的一个抽象。首先明确一点MMU的主要工作只有一个就是把虚拟地址映射到物理地址。我们已经知道大多数使用虚拟存储器的系统都使用一种称为分页paging的技术就象我们刚才所举的例子虚拟地址空间被分成大小相同的一组页每个页有一个用来标示它的页号这个页号一般是它在该组中的索引这点和C/C中的数组相似。在上面的例子中0~4K的页号为04~8K的页号为18~12K的页号为2以此类推。而虚拟地址注意是一个确定的地址不是一个空间被MMU分为2个部分第一部分是页号索引page Index第二部分则是相对该页首地址的偏移量offset. 。我们还是以刚才那个16位机器结合下图进行一个实例说明该实例中虚拟地址8196被送进MMU,MMU把它映射成物理地址。16位的CPU总共能产生的地址范围是0~64K,按每页4K的大小计算该空间必须被分成16个页。而我们的虚拟地址第一部分所能够表达的范围也必须等于16这样才能索引到该页组中的每一个页,也就是说这个部分至少需要4个bit。一个页的大小是4K(4096),也就是说偏移部分必须使用12个bit来表示(2^124096这样才能访问到一个页中的所有地址),8196的二进制码如下图所示该地址的页号索引为0010二进制码既索引的页为页2第二部分为000000000100二进制偏移量为4。页2中的页框号为6页2映射在页框6见上图我们看到页框6的物理地址是24~28K。于是MMU计算出虚拟地址8196应该被映射成物理地址24580页框首地址偏移量24576424580。同样的若我们对虚拟地址1026进行读取1026的二进制码为0000010000000010page index00000,offset0100000000101026。页号为0该页映射的页框号为2页框2的物理地址范围是8192~12287故MMU将虚拟地址1026映射为物理地址9218页框首地址偏移量819210269218。以上就是MMU的工作过程。三、S3C24XX的MMU工作过程下面我们针对s3c2410的MMU(注1)进行讲解。 S3c2410总共有4种内存映射方式分别是 1Fault (无映射) 2Coarse Page (粗表) 3Section (段) 4Fine Page (细表) 我们以Section(段)进行说明。 ARM920T是一个32bit的CPU,它的虚拟地址空间为2^324G。而在Section模式这4G的虚拟空间被分成一个一个称为段Section的单位(与我们上面讲的页在本质上其实是一致的),每个段的长度是1M (而我们之前所使用的页的长度是4K)。4G的虚拟内存总共可以被分成4096个段1M*40964G,因此我们必须用4096个描述符来对这组段进行描述每个描述符占用4个Byte,故这组描述符的大小为16KB (4byte*4096),这4096个描述符构为一个表格我们称其为Tralaton Table.上图是描述符的结构 Section base address:段基地址相当于页框号首地址 AP: 访问控制位Access Permission Domain: 访问控制寄存器的索引。Domain与AP配合使用对访问权限进行检查 C:当C被置1时为write-through (WT)模式 B: 当B被置1时为write-back (WB)模式C,B两个位在同一时刻只能有一个被置1 下面是s3c2410内存映射后的一个示意图我的s3c2410上配置的SDRSAM大小为64M,该SDRAM的物理地址范围是0x3000 0000~0x33FF FFFF(属于Bank 6)由于1个Section的大小是1M,所以该物理空间可以被分成64个物理段(页框).在Section模式下送进MMU的虚拟地址(注1)被分为两部分这点和我们上面举的例子是一样的这两部分为 Descriptor Index(相当于上面例子的Page Index)和 Offset,descript index长度为12bit(2^124096,从这个关系式你能看出什么) )Offset长度为20bit2^201M你又能看出什么).观察一下一个描述符Descriptor中的Section Base Address部分它长度为12 bit里面的值是该虚拟段页映射成的物理段页框的物理地址前12bit由于每一个物理段的长度都是1M所以物理段首地址的后20bit总是为0x00000(每个Section都是以1M对齐)确定一个物理地址的方法是 物理页框基地址虚拟地址中的偏移部分Section Base Address20Offset,呵呵可能你有点糊涂了还是举一个实际例子说明吧。假设现在执行指令MOV REG, 0x30000012虚拟地址的二进制码为00110000 00000000 00000000 00010010前12位是Descriptor Index 00110000 0000768,故在Translation Table里面找到第768号描述符该描述的Section Base Address0x0300,也就是说描述符所描述的虚拟段页所映射的物理段页框的首地址为0x3000 0000物理段页框的基地址Section Base Address左移20bit0x0300200x3000 0000而Offset000000 00000000 000100100x12,故虚拟地址0x30000012映射成的物理地址0x3000 00000x120x3000 0012物理页框基地址虚拟地址中的偏移。你可能会问怎么这个虚拟地址和映射后的物理地址一样这是由我们定义的映射规则所决定的。在这个例子中我们定义的映射规则是把虚拟地址映射成和他相等的物理地址。我们这样书写映射关系的代码void mem_mapping_linear(void){ unsigned long descriptor_index, section_base, sdram_base, sdram_size; sdram_base0x30000000; sdram_size0x 4000000; for (section _base sdram_base,descriptor_index section _base20; section _base sdram_base sdram_size; descriptor_index1;section _base 0x100000) { *(mmu_tlb_base (descriptor_index)) (section _base20) | MMU_OTHER_SECDESC; }}上面的这段段代码把虚拟空间0x3000 0000~0x33FF FFFF映射到物理空间0x3000 0000~0x33FF FFFF由于虚拟空间与物理空间空间相吻合所以虚拟地址与他们各自对应的物理地址在值上是一致的。当初始完Translation Table之后记得要把Translation Table的首地址(第0号描述符的地址)加载进协处理器CP15的Control Register2(2号控制寄存器)中,该控制寄存器的名称叫做Translation table base (TTB) register。以上讨论的是descriptor中的Section Base Address以及虚拟地址和物理地址的映射关系,然而MMU还有一个重要的功能那就是访问控制机制(Access Permission )。简单说访问控制机制就是CPU通过某种方法判断当前程序对内存的访问是否合法是否有权限对该内存进行访问如果当前的程序并没有权限对即将访问的内存区域进行操作则CPU将引发一个异常s3c2410称该异常为Permission faultx86架构则把这种异常称之为通用保护异常General Protection什么情况会引起Permission fault呢比如处于User级别的程序要对一个System级别的内存区域进行写操作这种操作是越权的应该引起一个Permission fault搞过x86架构的朋友应该听过保护模式Protection Mode,保护模式就是基于这种思想进行工作的于是我们也可以这么说s3c2410的访问控制机制其实就是一种保护机制。那s3c2410的访问控制机制到底是由什么元素去参与完成的呢它们间是怎么协调工作的呢这些元素总共有 1协处理器CP15中Control Register3DOMAIN ACCESS CONTROL REGISTER 2段描述符中的AP位和Domain位 3协处理器CP15中Control Register1(控制寄存器1)中的S bit和R bit 4协处理器CP15中Control Register5(控制寄存器5) 5协处理器CP15中Control Register6(控制寄存器6) DOMAIN ACCESS CONTROL REGISTER 是访问控制寄存器该寄存器有效位为32被分成16个区域每个区域由两个位组成他们说明了当前内存的访问权限检查的级别如下图所示每区域可以填写的值有4个分别为00,01,10,11(二进制)他们的意义如下所示00当前级别下该内存区域不允许被访问任何的访问都会引起一个domain fault 01当前级别下该内存区域的访问必须配合该内存区域的段描述符中AP位进行权检查 10保留状态我们最好不要填写该值以免引起不能确定的问题 11当前级别下对该内存区域的访问都不进行权限检查。 我们再来看看discriptor中的Domain区域该区域总共有4个bit,里面的值是对DOMAIN ACCESS CONTROL REGISTER中16个区域的索引.而AP位配合S bit和A bit对当前描述符描述的内存区域被访问权限的说明,他们的配合关系如下图所示:AP位也是有四个值,我结合实例对其进行说明. 在下面的例子中我们的DOMAIN ACCESS CONTROL REGISTER都被初始化成0xFFFF BDCF,如下图所示例1Discriptor 中的domain4,AP10(这种情况下S bit ,A bit 被忽略)假设现在我要对该描述符描述的内存区域进行访问由于domain4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01系统会对该访问进行访问权限的检查。假设当前CPU处于Supervisor模式下则程序可以对该描述符描述的内存区域进行读写操作。假设当前CPU处于User模式下则程序可以对该描述符描述的内存进行读访问若对其进行写操作则引起一个permission fault.例2Discriptor 中的domain0,AP10(这种情况下S bit ,A bit 被忽略)domain0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是11系统对任何内存区域的访问都不进行访问权限的检查。由于统对任何内存区域的访问都不进行访问权限的检查所以无论CPU处于何种模式下Supervisor模式或是User模式程序对该描述符描述的内存都可以顺利地进行读写操作例3Discriptor 中的domain4,AP11(这种情况下S bit ,A bit 被忽略)由于domain4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01系统会对该访问进行访问权限的检查。由于AP11所以无论CPU处于合种模式下Supervisor模式或是User模式程序对该描述符描述的内存都可以顺利地进行读写操作例4Discriptor 中的domain4,AP00, S bit0,A bit0由于domain4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01系统会对该访问进行访问权限的检查。由于AP00S bit0,A bit0,所以无论CPU处于合种模式下Supervisor模式或是User模式程序对该描述符描述的内存都只能进行读操作否则引起permission fault.通过以上4个例子我们得出两个结论1对某个内存区域的访问是否需要进行权限检查是由该内存区域的描述符中的Domain域决定的。2某个内存区域的访问权限是由该内存区域的描述符中的AP位和协处理器CP15中Control Register1(控制寄存器1)中的S bit和R bit所决定的。