MMU详解
E500内核MMU介绍
MMU(Memory Management Units)内存管理单元mmu是处理器的重要组成部分,主要功能是将程序使用的虚拟地址转换为处理器硬件能够直接访问的物理地址。
mmu为系统软件设立了转换查找表以支持虚实地址的映射。
在这些查找表中将规定虚实地址的对应关系及访问控制等一系列信息。
系统软件将利用处理器提供的查找表完成虚实地址的映射。
E500内核mmu中共使用两个查找表TLB0(translation lookaside buffer)和TLB1来实现虚拟地址和物理地址的转换。
其中TLB0用来进行页式映射,而TLB1用来实现段式映射。
段式映射:采用段式映射可以直接使用硬件提供的TLB1查找表,而不使用在内存中的页表就可以完成虚实地址的转换。
这种虚实地址的转换的效率较高。
我们目前一般只使用TLB1实现虚实地址的转换。
在E500 V1内核中,TLB1中一共有16个Entry,其中每个Entry 能映射4KB~256MB大小的页面。
页式映射:使用TLB0和系统页表完成虚实地址的转换。
其中TLB0存放在E500内核中,而系统页表存放在主存储器中。
在E500 V1内核中,TLB0中一共有256个Entry,其中每个Entry只能固定映射4KB大小的页面。
因此在TLB0中最多只能保存256*4KB=1MB 大小的虚拟地址空间。
对于32位的PowerPC处理器,TLB0能直接映射的虚拟地址空间远远不够,不可避免的会出现TLB Miss异常,即处理器访问的地址空间不在TLB0的Entry 中。
当发生这种异常时,需要查找系统页表,获得与被访问虚拟地址对应的物理地址,并同步TLB0。
E500 V1内核的虚实地址转换:有上图可知,E500内核的41位虚拟地址由1位AS,8位PID和32位的EA组成。
AS位:在E500内核中根据AS位的不同将地址空间分为两种,分别为地址空间0和地址空间1。
AS=0对应地址空间0;AS=1对应地址空间1。
MMU所起的作用
MMU所起的作用
一、名词解释
①逻辑地址(虚拟地址)
用户程序经编译、链接以后形成的每条指令或数据单元的地址,这些地址都是相对于某个基地址来编制的。
②逻辑地址空间
某个用户程序的虚拟地址的集合。
③物理地址(绝对地址)
处理机能直接访问的存储器地址。
④物理地址空间
物理地址空间是指进程在内存中一系列存储信息的物理单元的集合。
物理地址空间也叫存储空间,存储空间与地址空间既相互关联,又相互独立,是内存管理的核心概念。
二、MMU所起的作用
1.内存分配和回收
使各作业或进程各得其所
2.内存保护
内存保护就是确保多个进程都在各自分配到内存区域内操作,互不干扰,防止一个进程破坏其他进程的信息。
3.内存扩充
内存“扩充”包含了存储器利用的提高和扩充两方面的内容。
为用户提供比内存物理空间大得多的地址空间。
比较典型的内存扩充是虚拟存储器。
4.地址映射
地址映射就是将进程的逻辑地址变换为内存中的物理地址。
我们需要实现从逻辑地址到物理地址的变换,即实现从虚地址到实地址的变换。
这种变换就是重定位。
内存管理以及内存管理单元简介(MMU)
MMU简介1.概念MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。
虚拟地址映射为物理地址内存访问授权另一个概念:内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。
其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
2.术语虚拟地址空间——又称逻辑地址空间,CPU看到的使用的地址空间。
32位CPU可以使用0~0xFFFFFFFF(4G)的地址空间。
物理地址空间——实际的内存空间,例如一个256M的内存,实际地址空间也就是0~0x0FFFFFFF(256M)。
VA——virtual address,虚拟地址PA——physical address,物理地址3.背景内存有限内存保护内存碎片1)内存有限——交换程序很大,而内存不够一次装入太大的程序。
在磁盘中分配虚拟内存。
进程在内存中执行,可以暂时从内存中交换(swap)出去到备份存储上,当需要时再调回到内存中。
2)内存保护不同进程使用不同的物理地址空间,必须防止不同进程使用同一块内存产生冲突。
内存保护最基本的思路是操作系统为不同进程分配不同的地址空间。
可以是逻辑地址,也可以是实际物理地址。
(但如果是实际物理地址,操作系统还要负责实际物理地址的分配调度,任务过重,因此设计MMU减轻操作系统负担,负责逻辑地址到物理地址的映射。
)3)内存碎片最初操作系统的内存是连续分配的,即进程A需要某一大小的内存空间,如200KB,操作系统就需要找出一块至少200KB的连续内存空间给进程A。
随着系统的运行,进程终止时它将释放内存,该内存可以被操作系统分配给输入队列里的其他等待内存资源的进程。
可以想象,随着进程内存的分配和释放,最初的一大块连续内存空间被分成许多小片段,即使总的可用空间足够,但不再连续,因此产生内存碎片。
三层交换机之MMU
三层交换机之MMU概述MMU介于Ingress和Egress之间,被所有端⼝共享。
MMU同时⽀持内部和外部缓存。
⼀个⼊⼝报⽂,可以缓存到内部缓存、外部缓存或者both,取决于报⽂转发到哪个端⼝(Egress Port)。
每个Egress Port要么指定内部缓存,要么指定外部缓存,not both。
对于组播报⽂这种转发到多个Egress Ports的情况,则可能报⽂会根据Egress Port同时缓存到内部和外部缓存中。
MMU包含以下功能组件:(buffer blocks⽤来缓存报⽂,queue blocks⽤来缓存控制结构和转发数据)Admission Control:根据⼊端⼝和优先级、出端⼝、队列和缓存占⽤情况,决定转发还是丢弃报⽂Internal Buffer:2MB⽚内SRAM,EMA(External Memory Access) buffer pool也在其中External Buffer:外部DRAM(外接DDR)EMA Queues:访问External Buffer的队列,即Ingress和外部DRAM之间的缓冲区Replication Engine Work Queues:组播、镜像包和copy_to_cpu报⽂的队列Egress Port Queues:每个Egress Port⼀组队列,包括Internal Buffer Queues和External Buffer Queues,总共有256K条egress queuesLife of a Packet Inside the MMUMMU内部报⽂转发流程如下图,主要分为控制路径和数据路径:控制路径上报⽂头(packet header)缓存在Replication Engine Queues和Egress Queues中;数据路径上报⽂负载(packet payload)缓存到Internal Buffers、EMA和External Buffers。
ARM存储管理系统MMU
ARM存储管理系统MMU一、虚拟地址和物理地址的区别CPU 通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分。
如果CPU 没有MMU(Memory Management Unit,内存管理单元),或者有MMU 但没有启用,CPU 在访问内存时发出的地址将直接传送到地址总线上,使具有相同地址的物理存储器被读写。
这称为物理地址(Physical Address,以下简称PA),如下一级页表要表示4G 的地址范围,一共4096 项,每一项都表示1M 的大小。
二级页表相当于对一级页表这1M 的范围作更详细的划分,所以每个二级页表要表示1M 的地址范围。
对这1M 地址范围进行分页,有三种分法:大页:将这1M 地址范围分成单位为64KB 大小小页:将这1M 地址范围分成单位为4KB 大小极小页:将这1M 地址范围分成单位为1KB 大小注:二级页表分为两类:粗粒度的二级页表和细粒度的二级页表。
粗粒度的二级页表:当二级页表为粗粒度时,一级页表中一项的内容如下表所示:因为不论是一级页表还是二级页表,页表中的每一项都是四个字节,所以页表中每一项的地址都是字对齐的,也就是最低两位的值都为0。
所以因为粗粒度的二级页表的基地址为22 位,而偏移量只能为8位,则粗粒度的二级页表中只能有256 个项,大小为1KB。
而这256 个项要表示1M 大小,所以粗粒度二级页表中的每个项要表示4KB 的物理空间范围。
细粒度的二级页表:当二级页表为细粒度时,一级页表中一项的内容如下表所示:因为不论是一级页表还是二级页表,页表中的每一项都是四个字节,所以页表中每一项的地址都是字对齐的,也就是最低两位的值都为0。
所以因为细粒度的二级页表的基地址为20 位,而偏移量只能为10 位,则细粒度的二级页表中能有1024 个项,大小为4KB。
而这1024 个项要表示1M 大小,所以细。
MMU技术理解
MMU 技术理解MMU 支持三种地址转换:1.页地址转换(每页4K )2.块地址转换(每块128K -256M )3.实地址转换(无地址转换-物理地址与虚地址一一对应)CPU 实现地址转换的机制:MMU 在关闭时,CPU 处理地址就走蓝线所示路线,程序的逻辑地址就与物理地址一一对应,这地址包括CPU 的4G 的地址空间,不仅仅指内存部分。
当MMU 打开后CPU 处理地址就走红、黄两条路线,黄色路线是块地址转换,优先于页地址转换执行,逻辑地址到物理地址的转换是通过与BAT 表比较实现的,BAT 表一共有8组表项,4个指令BAT 表项,4个数据BAT 表项。
这个表存放在SPR (特殊用途寄存器)528-SPR543中。
在BSP 中对于这个BAT 表的设置是在sysLib.c 中通过sysBatDesc 数组实现的。
根据VxWorks 的内存管理的建议,虽然将内存地址同时映射成块地址和页地址是CPU 允许的,但由于VxWorsk 的缘故,这种做法会导致出错,所以块地址映射一般用于I/O 地址映射,PROM ,FLASH 地址映射,由于BAT 表无法不激活,所以不管在BAT 表中放什么值都将会有一段地址空间被作为块地址寻址,这很容易与页地址映射造成冲突,所以在sp8240的BSP 中8个BAT 表项被全部用作FLASH 地址空间的映射,避开了作为页地址映射的内存地址空间。
31逻辑地址MMU 关闭实地址模式逻辑地址=物理地址物理地址31与BAT 寄存器比较块地址转换物理地址31段地址描述符T =0T =1直接存取段转换与硬件相关31页地址转换虚拟地址51查找页表物理地址31早期CPU 用于访问外部总线的方式,建议不用块地址转换优先页地址转换块地址转换MMU 打开上图中的红线部分是逻辑地址到物理地址的页映射方式,页映射方式首先通过段描述符,确定逻辑地址是访问页地址还是直接存取段地址(建议不用),若是访问页地址,则根据页描述符中的内容生成一个52位的虚拟地址,MMU根据8240提供的TLB缓冲(内部寄存器)用于快速确定与52位虚拟地址对应的32位物理地址,若TLB缓冲中没有对应关系则根据内存中的页表确定。
MMU(一)
MMU(⼀)4. MMU现代操作系统普遍采⽤虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,内存管理单元)提供⽀持,本节简要介绍MMU的作⽤。
⾸先引⼊两个概念,虚拟地址和物理地址。
如果处理器没有MMU,或者有MMU但没有启⽤,CPU执⾏单元发出的内存地址将直接传到芯⽚引脚上,被内存芯⽚(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,以下简称PA),如下图所⽰。
图 17.5. 物理地址如果处理器启⽤了MMU,CPU执⾏单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),⽽MMU将这个地址翻译成另⼀个地址发到CPU芯⽚的外部地址引脚上,也就是将VA映射成PA,如下图所⽰。
图 17.6. 虚拟地址如果是32位处理器,则内地址总线是32位的,与CPU执⾏单元相连(图中只是⽰意性地画了4条地址线),⽽经过MMU转换之后的外地址总线则不⼀定是32位的。
也就是说,虚拟地址空间和物理地址空间是独⽴的,32位处理器的虚拟地址空间是4GB,⽽物理地址空间既可以⼤于也可以⼩于4GB。
MMU将VA映射到PA是以页(Page)为单位的,32位处理器的页尺⼨通常是4KB。
例如,MMU可以通过⼀个映射项将VA的⼀页0xb7001000~0xb7001fff映射到PA的⼀页0x2000~0x2fff,如果CPU执⾏单元要访问虚拟地址0xb7001008,则实际访问到的物理地址是0x2008。
物理内存中的页称为物理页⾯或者页帧(Page Frame)。
虚拟内存的哪个页⾯映射到物理内存的哪个页帧是通过页表(Page Table)来描述的,页表保存在物理内存中,MMU会查找页表来确定⼀个VA应该映射到什么PA。
操作系统和MMU是这样配合的:1. 操作系统在初始化或分配、释放内存时会执⾏⼀些指令在物理内存中填写页表,然后⽤指令设置MMU,告诉MMU页表在物理内存中的什么位置。
MMU解读——精选推荐
MMU解读mmu页表也是放在内存中,mmu⾥有⼀个寄存器存放页表⾸地址,从⽽找到页表(地址为物理地址)。
当我们执⾏⼀个程序时,会把这个进程的mmu页表地址放到该寄存器中,跳转找到mmu页表执⾏。
TLB是MMU内部的缓存,页表是每个进程都有的⼀段保存虚拟地址到物理地址对应映射关系的数组,此数据在内存中(TLB---Translation Lookaside Buffers,转译查找缓存):由于从MVA到PA的转换需要访问多次内存,⼤⼤降低了CPU的性能,故提出TLB办法改进。
当CPU发出⼀个虚拟地址时,MMU⾸先访问TLB。
如果TLB中含有能转换这个虚拟地址的描述符,则直接利⽤此描述符进⾏地址转换和权限检查,否则MMU访问页表找到描述符后再进⾏地址转换和权限检查,并将这个描述符填⼊TLB中,下次再使⽤这个虚拟地址时就直接使⽤TLB⽤的描述符。
使⽤TLB需要保证TLB中的内容与页表⼀致,在启动MMU之前,页表中的内容发⽣变化后,尤其要注意。
⼀般的做法是在启动MMU之前使整个TLB⽆效,改变页表时,使所涉及的虚拟地址对应的TLB中条⽬⽆效。
不同进程切换时,通过CR3(x86时)寄存器把页表缓存地址传递给MMU模块,进⽽时MMU的TLB更新为对应进程的页表内容程序的⼤部分代码都可以在必要的时候才加载到内存去执⾏,运⾏完后可以被直接丢弃或者被其他代码覆盖。
我们PC上同时跑着很多的应⽤程序,每个应⽤程序使⽤的虚拟地址空间⼏乎可以整个线性地址空间(除了部分留给操作系统或者预留它⽤),可以认为每个应⽤程序都独占了整个虚拟地址空间(字长是32的CPU是4G的虚拟地址空间),但我们的物理内存只是1G或者2G。
即多个应⽤程序在同时竞争使⽤这块物理内存,其必然会导致某个时刻只存在程序的某个⽚段在执⾏,也即是所有程序代码和数据分时复⽤物理内存空间—这就是内存管理单元(MMU)⼯作核⼼作⽤所在。
处理器系列的芯⽚(如X86、ARM7以上、MIPS)⼀般都会有MMU,跟操作系统⼀块实现虚拟内存管理,MMU也是Linux、Wince等操作系统的硬件要求。
MMU详解
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的存储管理单元MMU
ARM的存储管理单元MMUarm的存储管理单元mmu2021-01-1922:06:08mmu提供的一个关键服务是,能使各个任务作为独立的程序在其自己的私有存储空间运行.地址转换过程允许运行的多个程序使用相同的虚拟地址,而各自存储在物理存储器的不同位置.区域可以就是活跃的,也可以就是呼吸的:活跃区域涵盖当前系统正在采用的代码或数据;呼吸区域涵盖当前不采用,但可能将在短时间内变成活跃的代码或数据.呼吸区域就是被维护的,因此当前正在运转的任务就是无法出访的.mpu和mmu的主要区别就是,mmu中减少了额外的硬件,以积极支持虚存.一个重定位寄存器只能转换一块存储空间.这块存储空间的大小由虚拟地址的偏移量部分所占的位数所决定.arm的mmu中临时存放转换数据的一组重定位寄存器实际上是一个由64个重定位寄存器组成的全相联cache.这个cache就是转换旁路缓冲器--tlb.tlb缓存最近被访问的页的转换数据.mmu还使用主存中的表来存放描述系统中用到的虚拟存储器映射数据,这些转换数据的表就是页表.页表中的每个项代表了将虚拟存储器的一个页转换到物理存储器的一个页帧所需要的所有信息.在mmu中,区域被定义为一组页表的子集,并做为虚存中的已连续页全然由软件掌控.除了l1一级页表外,所有其他的页表都代表虚存的1mb空间.如果一个区域的大小大于1mb 或者它越过页表的1mb边界地址,那么就必须采用一组页表去叙述这个区域.页表可以留驻在存储器中,而不必态射至mmu硬件.当在2个应用程序任务间实现上下文切换时,处理器其实要发生多次上下文切换.它先从用户模式任务切换到内核模式任务,以处理准备运行下一个应用程序任务时的上下文数据的移动;然后,它从内核模式任务切换到下一个上下文的新的用户模式任务.mmu在切换一个地址时失利,就可以产生一个终止异常.mmu只有在切换失利,权限错误和域错误时,才可以终止.l1住页表包含2种类型的页表项:保存指向二级页表起始地址指针的页表项和保存用于转换1mb页的页表项.l1页表也称为段页表.当l1页表作为页目录时,其页表项包含的是1mb虚拟空间的l2粗页表或l2细页表指针;当l1页表用于转换一个1mb的段时,其页表项包含的是物理存储器中1mb页帧的首地址.目录页表项和1mb的段页表项可以共存于l1主页表.cp15:c2寄存器保存转换表基地址ttb--指向l1主页表在虚存中的位置.tlb只积极支持两种类型的命令:去除tlb和瞄准tlb中的切换数据.存储器出访时,mmu将虚拟地址的一部分与tlb中的所有值展开比较.如果tlb中已有所必须的切换数据,即为为一次tlb击中,则由tlb提供更多物理地址的切换数据.如果tlb中不存有有效率的切换数据,即为为一次tlb失灵,则mmu可以由硬件自动处置tlb失灵,通过主存中的页表搜寻有效率的切换数据,并将其放入tlb的64行及的一行.如果tlb中的某一行就是瞄准的,则当tlb去除命令收到时,它仍然留存在tlb中.arm的存储保护单元mpu2021-01-1922:03:38在受保护的系统中,主要存有两类资源须要监控:存储器系统和外围设备.存储器中对区域的出访可以就是念/写下,所读或不容出访,基于当时的处理器模式--管理模式或用户模式,除了一些额外的权限.区域除了掌控cache和写下缓冲器属性的cache写下策略.当处理器出访主存的一个区域时,mpu比较该区域的出访权限属性和当时的处理器模式.如果命令合乎区域出访标准,则mpu容许内核念/写下主存;如果存储器命令引致存储器出访违例,则mpu产生一个异常信号.区域与内核是冯.诺依曼结构还是哈佛结构无关.每个区域通过0~7的号码来标识和引用.区域的属性如下:(1)区域可以相互重合;(2)每个区域都分配有一个优先级,该优先级与分配区域的权限无关;(3)当区域重合时,具备最低优先级的区域的属性可以全面覆盖其他区域的属性,优先级仅促进作用于重合部分的地址;(4)区域的起始地址必须是其大小的倍数;(5)区域的大小可以就是4kb~4gb之间的任何2的乘幂;(6)访问所定义区域外的存储器将产生异常.如果是内核预取指令,则mpu产生预取指令中止异常;如果是存储器数据请求,则产生数据中止异常.在投入使用存储器维护单元之前,必须至少定义一个数据区域和一个指令区域,而且必须在投入使用cache和写下缓冲器之前(或同时)投入使用存储器维护单元.控制器通过设置cp15的主寄存器c1~5去布局mpu.通过布局寄存器c2和c3去设置区域的cache和写下缓冲器的属性,寄存器c5掌控区域的出访权限,在寄存器c6里存有8个或16个次寄存器用以定义每个区域的大小和边线.初始化mpu,cache和写下缓冲器须要以下步骤:(1)使用cp15:c6来定义指令和数据区域的大小和位置(2)采用cp15:c5去设置每个区域的出访权限(3)分别使用cp15:c2和cp15:c3来设置每个区域的cache和写缓冲器属性(4)采用cp15:c1去CX600Xcache和mpu每个内核有3个cp15寄存器用来控制区域的cache和写缓冲器属性.其中cp15:c2:c0:0和cp15:c2:c0:1两个寄存器保存d-cache和i-cache区域属性;第三个寄存器,cp15:c3:c0:0用于保存区域写缓冲器属性,并应用于存储器数据区域.当配置数据区域时,区域的cache位和写缓冲器位一起决定区域的策略.写缓冲器位有2个用途:使能和禁止区域的写缓冲器和设置区域的cache策略.区域的cache位控制写缓冲器位的作用.当cache位为0时,写缓冲器位为1,则使能写缓冲器;写缓冲器位为0,则禁用写缓冲器.当cache位为1时,cache和写缓冲器都被使能,此时写缓冲器位决定cache策略.若写缓冲器位为0,则区域使用直写策略;若写缓冲器位为1,则区域使用回写策略.s3c2440从sd卡启动wince2021-04-1615:47:25经过一周的时间终于在s3c2440上把sdboot给跑起来了。
MMU和Cache的文章
一篇介绍MMU和Cache的文章,比较浅显MMU简介嵌入式系统中,存储系统差别很大,可包含多种类型的存储器件,如FLASH,SRAM,SDRAM,ROM等,这些不同类型的存储器件速度和宽度等各不相同;在访问存储单元时,可能采取平板式的地址映射机制对其操作,或需要使用虚拟地址对其进行读写;系统中,需引入存储保护机制,增强系统的安全性。
为适应如此复杂的存储体系要求,ARM处理器中引入了存储管理单元来管理存储系统。
§1.3.1内存管理单元(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映射到其它不相冲突的存储空间位置。
例如,FLASH的地址从 0x0000_0000-0x00ff_ffff,而SDRAM的地址范围是0x3000_0000-0x31ff_ffff,则可把SDRAM地址映射为0x0000_0000-0x1fff_ffff而FLASH 的地址可以映射到0x9000_0000-0x90ff_ffff(此处地址空间为空闲,未被占用)。
arm9处理器的虚拟内存管理单元(MMU)
arm9处理器的虚拟内存管理单元(MMU)arm9处理器的虚拟内存管理单元(MMU)收藏Linux与ulinux的主要区别其中一点就是有没有mmu。
所以我想在这里记录一下我对它的理解。
文章分2个部分来记录,第一部分就是讲述当虚拟地址传递给cpu后,cpu是如何解析它,把它装换成物理地址,再把这个地址送到内存总线上;第二部分就是要讨论MMU是如何控制存储空间的访问权限的。
这里我先述说第一部分:我先在这里述说一下一些基本概念,页表,页表项。
表是用来干什么的?其实就是反应虚拟地址和物理地址的映射关系。
具体来说就是当一个虚拟地址穿给cpu后,cpu就会根据这个地址找到对应页表,再找到页表项。
然后只要访问页表项的内容,你就知道这个虚拟地址是对应哪个物理地址了。
ARM可以通过一级表就可以完成目的,但是也可以通过二级表来完成任务。
linux是选择后者来实现的,所以我只是讨论后者的情况。
页表项就是页表里面的每一项咯。
虚拟存储空间到物理存储空间的映射是以块为单位的,ARM支持的存储块的大小有以下几种:1.段,大小为1MB2.大页,大小为64KB3.小页,大小为4KB4.极小页,大小为1KB对于一级页表来说,它的基址是存放在cp15的c2寄存器里面的。
一级页表的页表项的结构是这样的:31位~10位细粒度二级页表基址;(其实这只是其中的一种变换方法,一共有6种变换方法,我这里只说linux里面常用的粗粒度小页地址变换方法。
这里说的小页就是我们上面刚说的存储块的大小中的一种。
)1位~0位:这两位数可以有4种组合,对于这种方法,我们用的是01。
对于中间的几位与访问权限和cache有关。
这里以免弄混,用到时我们再来讨论。
好了现在了解了一级页表项里面的结构了。
我们现在来说说二级页表,和它的页表项结构。
但是在说这个之前,我先要说说一个规则。
当以二级分页管理某段存储空间时,要同时设置一级页表项和二级页表项,一个一级页表项对应1段(1MB)虚拟存储空间的映射关系,一个一级页表项对应一张二级页表,这张二级页表中的所有页表项对应的虚拟空间映射关系的总和,就是一级页表的页表项虚拟存储空间的映射了。
10张图详解MMU那些事儿
10张图详解MMU那些事儿最近在重新看这部分知识点,内存管理和进程调度应该是Linux 下最核心的两个东西,不管你做得多牛逼了,这两点拿出来讨论,总是会让人眼前一亮,或者是可以讨论很久很久,这篇文章,读完后可能也可以让大家耳目一新。
欢迎有问题的同学留言一起学习。
祝大家周末快乐~[导读]本文从内存管理的发展历程角度层层递进,介绍MMU 的诞生背景,工作机制。
而忽略了具体处理器的具体实现细节,将MMU 的工作原理从概念上比较清晰的梳理了一遍。
#MMU 诞生之前:在传统的批处理系统如DOS 系统,应用程序与操作系统在内存中的布局大致如下图:•应用程序直接访问物理内存,操作系统占用一部分内存区。
•操作系统的职责是“加载”应用程序,“运行”或“卸载”应用程序。
如果我们一直是单任务处理,则不会有任何问题,也或者应用程序所需的内存总是非常小,则这种架构是不会有任何问题的。
然而随着计算机科学技术的发展,所需解决的问题越来越复杂,单任务批处理已不能满足需求了。
而且应用程序需要的内存量也越来越大。
而且伴随着多任务同时处理的需求,这种技术架构已然不能满足需求了,早先的多任务处理系统是怎么运作的呢?程序员将应用程序分段加载执行,但是分段是一个苦力活。
而且死板枯燥。
此时聪明的计算机科学家想到了好办法,提出来虚拟内存的思想。
程序所需的内存可以远超物理内存的大小,将当前需要执行的留在内存中,而不需要执行的部分留在磁盘中,这样同时就可以满足多应用程序同时驻留内存能并发执行了。
从总体上而言,需要实现哪些大的策略呢?•所有的应用程序能同时驻留内存,并由操作系统调度并发执行。
需要提供机制管理 I/O 重叠,CPU 资源竞争访问。
•虚实内存映射及交换管理,可以将真实的物理内存,有可变或固定的分区,分页或者分段与虚拟内存建立交换映射关系,并且有效的管理这种映射,实现交换管理。
这样,衍生而来的一些实现上的更具体的需求:•竞争访问保护管理需求:需要严格的访问保护,动态管理哪些内存页/段或区,为哪些应用程序所用。
MMU控制器介绍
文档类型:内部文档加密级别:CMMU 控制器Ver:1.0编制陈吏弘审批校对陈吏弘日期版本信息Ver:1.0 2009年03月3日陈吏弘目录1注意事项: (3)2MMU 控制器 (3)3MMU产生历史背景 (3)4虚拟寻址的实现原理 (4)5ARM9处理器MMU的介绍 (7)5.1大页-模式 (10)5.2段-模式 (14)5.3小页-模式 (18)5.4微页-模式 (22)6MMU使用实现 (27)7MMU寄存器介绍 (28)7.1MMU寄存器操作指令 (28)7.2MMU寄存器介绍 (29)7.2.1C0寄存器 297.2.2C1寄存器 317.3C2寄存器 (32)7.4C3寄存器 (32)7.5C4寄存器 (33)7.6C5寄存器 (33)7.7C6寄存器 (34)7.8C7寄存器 (35)7.9C8寄存器 (37)7.10C9寄存器 (38)7.11C10寄存器 (40)7.12C11寄存器 (40)7.13C12寄存器 (41)7.14C13寄存器 (41)7.15C14寄存器 (41)7.16C15寄存器 (42)8附件A (42)9附件B-MMU映射过程 (43)1注意事项:本文在描述MMU是,举例实现描述是使用ARM926上的MMU来介绍的,如果你发现与你了解到的ARM MMU不同可能是因为CPU不一样。
2MMU 控制器这里说讲述的MMU是Memory Manager Unit,即存储管理单元。
它使用来保护并管理存储器的一个器件,可以实现对指定区域进行访问保护,确保系统的安全性,还可以实现虚拟地址与物理地址之间的转换。
这里还会涉及Cache、TCM的介绍。
此文档是针对那些有一定技术知识的人员阅读。
3MMU产生历史背景现在使用MMU的时候,绝对想象不到MMU出现的时候并不是希望解决当前的问题,在古老的年代,前辈们还是使用DOS的时候,那念头存储器是非常昂贵的,一般的对于32位的CPU实际寻址是4G空间,但是内存的昂贵使得系统中实际配置的内存一般只有1M或者略多一点,好在那年头代码size非常的小,1M的空间已经可以满足各种需求了,当是很快前辈们就发现,1M的空间已经没有办法容纳他们的软件了。
内存管理MMU实例分析
0、MMU概述1、地址变换过程2、访问权限3、高速缓存4、程序实例0、MMU概述内存管理单元(Memory Management Unit)简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件的内存访问权限检查。
运行大型操作系统的平台,一般都采用MMU进行内存管理但对于带MMU的系统来说,内存中页命中率和换入换出所耗费的时间严重破坏了整个系统的确定性,这也是大多数实时操作系统采用直接内存管理,而不采用虚拟内存管理的原因地址:虚拟地址-VA,这是可执行文件运行时section在内存中的运行地址变换后虚拟地址-MVA,gcc编译时使用同一个默认链接脚本,所以VA是相同的,为了得到不同的运行地址,所以需要结合PID通过FCSE单元再次转换物理地址-PA,这是代码运行所在的物理存储设备,在嵌入系统中通常比虚拟地址范围小快速上下文切换,简称FCSE,用于避免在进程间切换时造成的虚拟地址到物理地址的重映射,将各进程的相同虚拟空间变换成不同的虚拟空间,从而避免重映射例如:一个32位的CPU,它的地址范围是0-0xFFFFFFFF(4G)而对于一个64位的CPU,它的地址范围为0-0xFFFFFFFFFFFFFFFF (64T),这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。
大多数时候系统所具备的物理地址空间只是虚拟地址空间的一个子集,对于一台内存为256MB的32bit x86主机来说,它的物理地址空间范围是0x000000000-0x0FFFFFFF(256M)。
在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写。
在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到内存管理单元——MMU。
由MMU把虚拟地址映射为物理地址,从而完成存储器读写,MMU由一个或一组芯片组成,一般存在协处理器中。
mmu以及cache入门详解
mmu以及cache入门详解Cache随着CPU频率的提高, CPU对数据的计算速度一直在提高, 而CPU 直接从内存中读取数据的时间要比计算时间慢了50-100倍, 可以想象一下,CPU没有下一个数据,只能等待,等到SDRAM主存的数据送到才能进行下一步的计算。
因此为了提升系统的性能,高效的流水线还需要加上高速缓存. 高速缓存能够提高CPU对内存访问的速度,提高至少50倍.Cache是一种容量小,速度快的存储阵列。
它位于SDRAM和处理器CPU RISC核心之间,保存着最近一段时间处理器涉及到的SDRAM的部分代码内容。
因为CPU直接从SDRAM拿数据比较慢,而为了加快CPU数据的传送,因此该cache的主要目的就是,减小SDRAM因为低速和处理器内核造成存储器访问瓶颈的问题。
(cache 管理可不是简单的单纯的进行SDRAM数据拷贝)Cache还经常与写缓冲器(write buffer)一起使用。
Write buffer 是一个很小的先进先出(FIFO)存储器。
Write buffer的作用主要就是将高速cache从SDRAM较慢的写操作中解放出来,为cache中写到主存中的数据提供缓冲,有时候CPU也会利用到writebuffer,直接丢一部分数据到该FIFO,由它写入到SDRAM中。
注意到cache和write buffer都是设计在ARM内核中的,因此都有附加的硬件控制器,设定好之后,可以自动的处理处理器CPU和SDRAM之间的数据传送。
因为cache存储器只是提供了主存中非常少的一部分数据,在执行过程中,cache会很快填满,因此cache控制器会不停的交换SDRAM和cache的内容,在特定的代码空间中,交换的数据是随机的,因此不同的程序,执行所需的时间会有细微的差别!(从上面可以理解为ARM处理器中的cache其实功能相当于是程序中的一个子函数,将SDRAM中的某个特定功能的函数代码数据取出,放到该cache缓存中完成,这样的话,在cache控制器下,有部分重复的代码是不需要移出移入的,因此会节省很多时间! 因此,难点就是如何设计出一个有效的cache控制器,来帮助cpu跑的更加的有效率,详细的cache设计在后面介绍!)正常的流程:CPU处理核心ßàcacheß--àFIFO(writebuffer)ß--àSDRAM主存CPU核可利用内部的存储器(TCM)直接访问SDRAM,但是如果是大块代码区的访问一定要通过cache来实现,如果只是字节、字等的读取,CPU也可以向SDRAM直接获取,影响不是很大,因为单条ARM指令的处理长度就是32位长,不会影响到流水线。
MMU和Cache的文章
一篇介绍MMU和Cache的文章,比较浅显MMU简介嵌入式系统中,存储系统差别很大,可包含多种类型的存储器件,如FLASH,SRAM,SDRAM,ROM等,这些不同类型的存储器件速度和宽度等各不相同;在访问存储单元时,可能采取平板式的地址映射机制对其操作,或需要使用虚拟地址对其进行读写;系统中,需引入存储保护机制,增强系统的安全性。
为适应如此复杂的存储体系要求,ARM处理器中引入了存储管理单元来管理存储系统。
§1.3.1内存管理单元(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映射到其它不相冲突的存储空间位置。
例如,FLASH的地址从 0x0000_0000-0x00ff_ffff,而SDRAM的地址范围是0x3000_0000-0x31ff_ffff,则可把SDRAM地址映射为0x0000_0000-0x1fff_ffff而FLASH 的地址可以映射到0x9000_0000-0x90ff_ffff(此处地址空间为空闲,未被占用)。
ARM·MMU
ARM·MMU【MMU】MMU 的主要功能:1)设置权限2)地址映射(这里我们主要讲的是地址映射)【虚拟地址到物理地址的映射】问题一:为什么要虚拟地址?原因1:我们先来看一个问题,A 程序需要10MB 的内存,B 程序需要110MB 的内存,A 和B 同时运行就需要20M 的内存,这时如果只剩下10M 的内存,如果C 程序需要20M 的内存又该如何呢?所以这样对我们的物理内存的容量要求就十分的大。
原因2:如果这时候因为某些程序的退出,有了20M 的内存,但这些内存不是连续的,是随机分配的,但是总共加起来有20M,可以让c 程序运行,可是c 程序没有确定的运行地址;原因3:这里使用物理地址的内存分配,试想一下如果B 程序出错了,访问到了A 程序的地址,修改了A 程序的内存,那么A 程序也就出错了。
也就是说一个程序的崩溃引发多个程序的崩溃,这样导致系统十分不稳定。
结合上面2 个原因,我们就可以看出来,虚拟地址的发明的必要性。
【虚拟地址的改进】(1)分段方式映射内存这样虽然解决了问题2,问题3,但是物理地址和虚拟地址是一一对应的关系,物理地址并没有得到扩大,容量依然十分小(2)分页的方法(ARM 中页的大小1MB)分段的方法中,每次程序运行总是把程序全部装入内存;分页则是程序运行到哪页就为哪页分配内存我们用一个例子来说明一下:假设一个A 文件在内存中被执行的时候,操作系统会先为改程序创建一个4GB 的进程虚拟地址空间(并不是真实的空间,只是一种数据结构,就是页目和页表)分页方法的核心思想就是当可执行文件执行到第x 页时,就为第x 页分配一个内存页y,然后再讲这个内存页添加到进程虚拟地址空间的映射表中,这个映射表就相当于一个y=f(x)的函数tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)。
在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写。
而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到内存管理单元——MMU(主角终于出现了:])。
他由一个或一组芯片组成,一般存在与协处理器中,其功能是把虚拟地址映射为物理地址。
大多数使用虚拟存储器的系统都使用一种称为分页(paging)。
虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame).页和页框的大小必须相同。
接下来配合图片我以一个例子说明页与页框之间在MMU的调度下是如何进行映射的在这个例子中我们有一台可以生成16位地址的机器,它的虚拟地址范围从0x0000~0xFFFF(64K),而这台机器只有32K的物理地址,因此他可以运行64K的程序,但该程序不能一次性调入内存运行。
这台机器必须有一个达到可以存放64K程序的外部存储器(例如磁盘或是FLASH),以保证程序片段在需要时可以被调用。
在这个例子中,页的大小为4K,页框大小与页相同(这点是必须保证的,内存和外围存储器之间的传输总是以页为单位的),对应64K的虚拟地址和32K的物理存储器,他们分别包含了16个页和8个页框。
我们先根据上图解释一下分页后要用到的几个术语,在上面我们已经接触了页和页框,上图中绿色部分是物理空间,其中每一格表示一个物理页框。
橘黄色部分是虚拟空间,每一格表示一个页,它由两部分组成,分别是Frame Index(页框索引)和位p(present存在位),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),于是被映射到物理地址12288+20=12308。
通过适当的设置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的页号为0,4~8K的页号为1,8~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^12=4096,这样才能访问到一个页中的所有地址),8196的二进制码如下图所示:该地址的页号索引为0010(二进制码),既索引的页为页2,第二部分为000000000100(二进制),偏移量为4。
页2中的页框号为6(页2映射在页框6,见上图),我们看到页框6的物理地址是24~28K。
于是MMU计算出虚拟地址8196应该被映射成物理地址24580(页框首地址+偏移量=24576+4=24580)。
同样的,若我们对虚拟地址1026进行读取,1026的二进制码为0000010000000010,pageindex="0000"=0,offset=010*********=1026。
页号为0,该页映射的页框号为2,页框2的物理地址范围是8192~12287,故MMU将虚拟地址1026映射为物理地址9218(页框首地址+偏移量=8192+1026=9218)以上就是MMU的工作过程。
下面我们针对S3C2410的MMU(注1)进行讲解。
S3C2410总共有4种内存映射方式,分别是:1.Fault(无映射)2.Coarse Page(粗表)3.Section(段)4.Fine Page(细表)我们以Section(段)进行说明。
ARM920T是一个32bit的CPU,它的虚拟地址空间为2^32=4G。
而在Section模式,这4G的虚拟空间被分成一个一个称为段(Section)的单位(与我们上面讲的页在本质上其实是一致的),每个段的长度是1M(而我们之前所使用的页的长度是4K)。
4G的虚拟内存总共可以被分成4096个段(1M*4096=4G),因此我们必须用4096个描述符来对这组段进行描述,每个描述符占用4个Byte,故这组描述符的大小为16KB(4K*4096),这4096个描述符构为一个表格,我们称其为Tralaton Table.上图是描述符的结构Section base address:段基地址(相当于页框号首地址)AP:访问控制位Access PermissionDomain:访问控制寄存器的索引。
Domain与AP配合使用,对访问权限进行检查C:当C被置1时为write-through(WT)模式B:当B被置1时为write-back(WB)模式(C,B两个位在同一时刻只能有一个被置1)下面是S3C2410内存映射后的一个示意图:我的S3C2410上配置的SDRSAM大小为64M,该SDRAM的物理地址范围是0x30000000~0x33FF FFFF(属于Bank 6),由于1个Section的大小是1M,所以该物理空间可以被分成64个物理段(页框).在Section模式下,送进MMU的虚拟地址(注1)被分为两部分(这点和我们上面举的例子是一样的),这两部分为Descriptor Index(相当于上面例子的Page Index)和Offset,descriptor index长度为12bit(2^12=4096,从这个关系式你能看出什么?:)),Offset长度为20bit(2^20=1M,你又能看出什么?:)).观察一下一个描述符(Descriptor)中的Section Base Address部分,它长度为12bit,里面的值是该虚拟段(页)映射成的物理段(页框)的物理地址前12bit,由于每一个物理段的长度都是1M,所以物理段首地址的后20bit总是为0x00000(每个Section都是以1M对齐),确定一个物理地址的方法是物理页框基地址+虚拟地址中的偏移部分=Section Base Address<<20+Offset,呵呵,可能你有点糊涂了,还是举一个实际例子说明吧。