http://bbs.21ic.com/icview-127516-1-1.htmlphp
许多年之前,当人们还在使用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的调度下是如何进行映射的
mmu1.gif (5.3 KB)
2007-3-23 21:19
在这个例子中咱们有一台能够生成16位地址的机器,它的虚拟地址范围从0x0000~0xFFFF(64K),而这台机器只有32K的物理地址,所以他能够运行64K的程序,但该程序不能一次性调入内存运行。这台机器必须有一个达到能够存放64K程序的外部存储器(例如磁盘或是FLASH),以保证程序片断在须要时能够被调用。在这个例子中,页的大小为4K,页框大小与页相同(这点是必须保证的,内存和外围存储器之间的传输老是以页为单位的),对应64K的虚拟地址和32K的物理存储器,他们分别包含了16个页和8个页框。
咱们先根据上图解释一下分页后要用到的几个术语,在上面咱们已经接触了页和页框,上图中绿色部分是物理空间,其中每一格表示一个物理页框。橘本人html
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,以下图所示: ![]() ![]() 2007-3-23 21:19 例1: Discriptor 中的domain=4,AP=10(这种状况下S bit ,A bit 被忽略) 假设如今我要对该描述符描述的内存区域进行访问: 因为domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系统会对该访问进行访问权限的检查。 假设当前CPU处于Supervisor模式下,则程序能够对该描述符描述的内存区域进行读写操做。 假设当前CPU处于User模式下,则程序能够对该描述符描述的内存进行读访问,若对其进行写操做则引发一个permission fault. 例2: Discriptor 中的domain=0,AP=10(这种状况下S bit ,A bit 被忽略) domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是11,系统对任何内存区域的访问都不进行访问权限的检查。 因为统对任何内存区域的访问都不进行访问权限的检查,因此不管CPU处于合种模式下(Supervisor模式或是User模式),程序对该描述符描述的内存均可以顺利地进行读写操做 例3:Discriptor 中的domain=4,AP=11(这种状况下S bit ,A bit 被忽略) 因为domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系统会对该访问进行访问权限的检查。 因为AP=11,因此不管CPU处于合种模式下(Supervisor模式或是User模式),程序对该描述符描述的内存均可以顺利地进行读写操做 例4: Discriptor 中的domain=4,AP=00, S bit=0,A bit=0 因为domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系统会对该访问进行访问权限的检查。 因为AP=00,S bit=0,A bit=0,因此不管CPU处于合种模式下(Supervisor模式或是User模式),程序对该描述符描述的内存都只能进行读操做,不然引发permission fault. 经过以上4个例子咱们得出两个结论: 1.对某个内存区域的访问是否须要进行权限检查是由该内存区域的描述符中的Domain域决定的。 2.某个内存区域的访问权限是由该内存区域的描述符中的AP位和协处理器CP15中Control Register1(控制寄存器1)中的S bit和R bit所决定的。 关于访问控制机制咱们就讲到这里. 注1:对于s3c2410来讲,MMU是以Modify Visual Address(MVA)进行寻址的,这个地址是Virtual Address的一个变换,我将在之后谈论到进程切换的时候中向你们介绍MVA |
|
|
|
|
专家等级: |
|