内存管理:算法及其c/c++实现 翻译五

来源:互联网 发布:全国网络教育排名 编辑:程序博客网 时间:2024/05/21 22:35
Intel Pentium 架构
 
你已经明白了处理器是怎样从内存中读取和存入数据的。然而,大多数处理器也支持两个高级的内存管理机制:分段和分页。
 
分段是通过把计算机的地址空间分为一些特定的称为段的区域来构造的。分段机制也是一种把内存区域分隔开来的方法,此方法使程序之间不会相互干扰。分段机制提供了所谓的内存保护的功能。也可以构造没有保护功能的内存分段机制,但这样的方案的确没有任何优势。
 
在具有内存保护的分段方案中,每一个应用程序被分配了至少一个段的空间。大的应用程序经常有几个段空间。另外,操作系统本身也要使用特定的一些段空间。段被分配了一些特定的访问属性,以便能够制定一些策略决定访问者对每一段的访问权限。一般来说,操作系统的代码段有最高的执行权限,而应用程序加载到较低权限的段中。
 
Figure1-5
 
分页机制是实现虚拟内存的一种方法。由DRAM提供的物理内存和用来模拟DRAM的磁盘存储空间组成了一个大的字节集合。当使用分页机制时,处理器能够访问的整个地址空间称为虚拟地址空间。
 
要理解这一点必须明确:虚拟地址空间的字节地址不再与处理器放在地址线上的地址一样了。如果操作系统认为运行时物理内存不够用了,它将调出一些位于物理内存中的页,并把它们写入到磁盘上。如果使用分段机制,为了把内存页与拥有这个页的段匹配起来,必须做一些薄记工作。所有的薄记工作是用操作系统与处理器紧密配合来完成的,这样做使得与磁盘I/O相关联的性能开销保持在最低状态。
 
Figure 1.6
 
注释:当数据页被存储在物理内存时(例如:DRAM),它们被放在一个页尺寸大小的内存块中,这个内存块就叫做页框(Page Frame)。除了跟踪单个页面使用情况外,大多数操作系统也跟踪页框的使用情况。页框的数目通常远小于页的数目,所以,操作系统必须小心翼翼地管理这些珍贵的资源。
 
 注释:可以不用磁盘空间而使用分页机制,但在这种情况下,分页转变成了处理4KB内存区域的分段的模式。
 
因为Intel Pentium类的处理器很容易获得,我决定用Pentium处理器来阐明分段和分页。我很喜欢使用MIPS64作为演示理论的处理器,但我买不起SGI服务器(唉!L),生产廉价的处理器是Intel能够不断成功的主要原因之一。在1980年的那个时代,像我这样的计算机爱好者买不起Apple IIe,只有到处搜寻二手的Intel处理器。成千上万的人不得不做我这样资金上的取舍。所以,在某种意义上来说,Intel处理器无处不在的现象多少与基层群众的推动作用有关。
 
 
 
注释:当1981年IBM出品了IBM PC时,它配置的是主频为4.77Mhz的8088。毫无疑问,大型机的开发者乐翻了天。这是因为PC给他们每个人属于自己的一方天地,在他们的那些时代,标准的哑终端除了与大型机交换缓存里的数据外什么事情也不能做。另外,工程师几乎不能控制他们提交的代码何时和怎样运行,等待大型机运行自己的程序是让人懊恼的一件事情。如果拥有一台IBM PC,工程师将拥有一台总是对自己开放的计算机,不用有等待的烦劳。
 
旁白:
我认识一个CDC的工程师,就是因为PC的好处,他于1982年把FORTRAN 77编译器移植到了PC上。他的头儿走到他身边问他:“为什么你想在那种小的像三轮车一样的机器上运行程序,而不在功能强大的大型机上运行?”他的答案是:“因为那个小家伙是我自己的东西”。这句话可能是对PC为什么能够成功的一种总结。
 
为了保留住老的顾客,Intel竭尽全力使他们的32位处理器与以前16位的处理器兼容。Intel的确做到了这一点,我可以使用DOS6.22的启动盘来启动我的台式机,并且能够运行绝大多数的DOS应用程序(包括Doom和Duke Nukem)就很好地证明了这一点。
 
向后兼容的要求导致了Pentium处理器芯片可以运行于一些不同的运行模式下。每一种运行模式决定了处理器怎样翻译机器指令,怎样访问内存。Pentium处理器可以运行于以下四种模式:
 
实模式 ( Real mode )
保护模式 ( Protected mode)
系统管理模式 ( System management mode, SMM )
虚拟8086模式 (Virtual 8086 mode)
 
系统管理模式和虚拟8086模式都是特殊目的操作模式,它们仅仅运行于特殊的环境。我将主要讨论前两种基本模式:实模式和保护模式。另外,我将研究这两个模式怎样支持分段和分页。
 
使处理器运行于不同的模式不是Intel平台独有的特征。例如,MPIS64型号的处理器也运行于四种模式,他们是:内核模式、用户模式、调试模式、监管模式。
 
 
实模式操作
 
第一台IBM PC机严格地运行实模式下。而且,所有32位Intel处理器的计算机启动时也运行于实模式下,这是向后兼容必须满足的最小条件。
 
处于实模式的操作系统一般使用的内存都很小(例如,不到128KB),因为它们依赖于BIOS提供的硬件接口,这允许它们容易地使用1.44MB的软盘。病毒保护急救盘也利用这种情况,这就像系统修复盘一样。我已经买过能从启动盘运行的磁盘分区软件。
 
在实模式下,我们以前看到的通用目的寄存器被截为16位的寄存器,错误标志和指令指针寄存器也如此。在实模式下寄存器的情况如图Figure1.7
 
 
Figure1.7
 
正如你所见,字母‘E’前缀已经从寄存器名字前移走了。另外,每一个16位的通用寄存器AX、CX、DX、EX都能以两个8位的寄存器的形式被操作。例如,AX寄存器能被看作AH和AL这两个8位寄存器的组合。AH寄存器指AX的高字节,AL寄存器指AX的低字节。
 
注释:Figure1-2中的内存和模式寄存器在实模式中还是可见的,对于32位的CPU来说,在实模式下它们还是存在,但是它们没有什么意义,也不会被使用。
 
   在实模式下的机器可以访问1MB的DRAM地址空间。这暗示了在实模式下只有20根地址线被使用。对于实模式的处理器来说,内存中的字节地址是通过段地址加上一个偏移量获得的,这个加法的和总是20位的值(记住这个事实很重要),这就证实了我刚才说的只有20根地址线的猜测。
 
通过段和偏移量形成的地址直接对应于处理器放置在地址线上的值。现在,我们可能对为什么称为“实”模式有一个更好的理解,因为实模式下一个字节的地址直接映射到“实”的物理内存的字节。
 
在Intel汇编语言中,一个地址由段(segment)和偏移量(offset)对来指定。例如,如果一个字节位于0x8200段,偏移量为0x0100,那么此字节的地址由下式指定:
 
0x8200:0x0100
有时,也写作
0x8200[0]:0x0100
 
为什么可以写成这个样子,以后我再解释。
实模式的地址解析过程如下图(figure1-8)
    
     figure1-8
    
    段地址指明了特定的内存段,它总是存储在一个16位的段寄存器中。更明白地说,一个段寄存器指定了内存段的基地址,也就是最低的地址,也可以说段开始的地址。每一个段寄存器用作不同的目的,具体情况如下:
 
CS    正在被执行的代码的段地址
SS    堆栈段地址
DS    数据段地址
ES    额外的段地址(通常用作数据段)
FS    额外的段地址(通常用作数据段)
GS    额外的段地址(通常用作数据段)
 
注释:从上面我们可以看出一个事实:有6个段地址意味着任何时候只有6个内存段可以被操作。一个程序可能拥有多于6个段的空间,但在任何时候只有6个段可以被访问。
 
偏移地址也是16位长,可能存储在通用寄存器中。如果每一个偏移地址是16位,那么每一个段的大小为64KB。
 
如果段地址和偏移地址都存储在16位的存储器中,那么两个16位的和怎么形成一个20位的值呢?
 
是这样做的,处理器在计算地址时,它会在段地址的后面默认添加一个零。例如,假设段地址是0x0c00,那么处理器加了一个零后成为0x0c000。我们在实际的书写中,通常把由处理器默认加上的零写在中括弧里(例如,0x0c00[0])。处理器就是使用这种方法计算出20位宽度的地址值的。
 
你已经看到,实模式下的段/偏移量的方法形成了一种很简单的分段机制。然而,它决没有实现我提到过的保护段与段之间的边界的功能。事实是在实模式下没有提供内存保护。当你的程序运行于实模式的,它可以随心所欲的运行。
 
应用程序运行于实模式就像很多难以安静下来的小孩跑到了你的家,它们年轻、精力充沛、不停的跳来跳去。如果你不留心提防着一点,它们将把你的家搞垮。在实模式下要使程序崩溃是很简单的事,你对这种危险几乎是爱莫能助(除了不断地备份你地工作之外J)。
 
你可能还比较疑惑,那么,我给出一个在实模式下可以使计算机崩溃的C程序的例子:
 
program
 
看一看,是不是不费吹灰之力?的确,没有什么特别的或神秘的手段就可以实现这种攻击。此程序只是覆盖了位于内存底端的中断向量表,仅此而已。如果你想把你的这类代码隐藏在一个大的可执行文件中,那么你可以把此程序缩减为不到5行的汇编代码。
 
如果你真的想做坏事,你可以使键盘不能使用,然后开始重新格式化硬盘。对此,你可能唯一能做的防御措施就是赶快关掉电源,到那时你就会意识到到底发生了什么J!但那时就太迟了。
 
然而,我不是想告诉你怎样摆弄DOS,现在几乎没有人使用它了,我的目的是向你演示实模式没有任何安全措施可言。
 
更糟糕的是实模式不支持分页机制。你能操作的就只有1MB的DRAM。实际操作中,你还没有1MB的内存,因为BIOS和视频硬件消耗了一定的内存区域。还记得Bill Gates的明言吗?J
 
注释:没有内存保护?没有分页?现在你理解了为什么PC-DOS的第一个版本只有不到5000行的汇编代码了吧!也许,所谓的“实”模式也就因为它的确是最小的模式吧!
 
如果使用这种内存管理,Intel处理器不可能发展到现在。为了支持更健壮的操作系统和更大的地址空间,Intel设计并生产了80386处理器,80386处理器有4GB的物理地址空间,并且它支持一个新的操作模式:保护模式。
原创粉丝点击