欢迎来到天天文库
浏览记录
ID:13612843
大小:412.66 KB
页数:12页
时间:2018-07-23
《操作系统内存管理原理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、内存分段和请求式分页在深入i386架构的技术细节之前,让我们先返回1978年,那一年Intel发布了PC处理器之母:8086。我想将讨论限制到这个有重大意义的里程碑上。如果你打算知道更多,阅读RobertL.的80486程序员参考(Hummel1992)将是一个很棒的开始。现在看来这有些过时了,因为它没有涵盖Pentium处理器家族的新特性;不过,该参考手册中仍保留了大量i386架构的基本信息。尽管8086能够访问1MBRAM的地址空间,但应用程序还是无法“看到”整个的物理地址空间,这是因为CPU寄存器的地址仅有16位。这就意味着应用程序可访问的
2、连续线性地址空间仅有64KB,但是通过16位段寄存器的帮助,这个64KB大小的内存窗口就可以在整个物理空间中上下移动,64KB逻辑空间中的线性地址作为偏移量和基地址(由16位的段寄存器给处)相加,从而构成有效的20位地址。这种古老的内存模型仍然被最新的PentiumCPU支持,它被称为:实地址模式,通常叫做:实模式。80286CPU引入了另一种模式,称为:受保护的虚拟地址模式,或者简单的称之为:保护模式。该模式提供的内存模型中使用的物理地址不再是简单的将线性地址和段基址相加。为了保持与8086和80186的向后兼容,80286仍然使用段寄存器,但
3、是在切换到保护模式后,它们将不再包含物理段的地址。替代的是,它们提供了一个选择器(selector),该选择器由一个描述符表的索引构成。描述符表中的每一项都定义了一个24位的物理基址,允许访问16MBRAM,在当时这是一个很不可思议的数量。不过,80286仍然是16位CPU,因此线性地址空间仍然被限制在64KB。1985年的80386CPU突破了这一限制。该芯片最终砍断了16位寻址的锁链,将线性地址空间推到了4GB,并在引入32位线性地址的同时保留了基本的选择器/描述符架构。幸运的是,80286的描述符结构中还有一些剩余的位可以拿来使用。从16位
4、迁移到32位地址后,CPU的数据寄存器的大小也相应的增加了两倍,并同时增加了一个新的强大的寻址模型。真正的32位的数据和地址为程序员带了实际的便利。事实上,在微软的Windows平台真正完全支持32位模型是在好几年之后。WindowsNT的第一个版本在1993年7月26日发布,实现了真正意义上的Win32API。但是Windows3.x程序员仍然要处理由独立的代码和数据段构成的64KB内存片,WindowsNT提供了平坦的4GB地址空间,在那儿可以使用简单的32位指针来寻址所有的代码和数据,而不需要分段。在内部,当然,分段仍然在起作用,就像我在前
5、面提及的那样。不过管理段的所有责任都被移给了操作系统。80386的另一个新特性是在硬件上支持分页,确切的来说是:请求式分页的虚拟内存。这种技术允许一个不同于RAM的存储介质----硬盘来为内存提供支持,例如,在允许分页时,CPU通过将最近最少访问的内存数据置换到备份存储器中,从而为新的数据腾出空间,这样就能访问比可用物理内存更大的内存空间。理论上来说,可以使用此种方式访问4GB的连续线性地址空间,提供的备份介质必须足够的大---即使只安装了非常少的物理内存。当然,分页并不是访问内存的最快方式,最好还是能提供尽可能多的物理内存。但是,这是处理大量数
6、据的最好办法,即使这些数据超过了可用物理内存。例如,图形和数据库程序都需要一大块工作内存,如果没有分页机制的话,其中的某些程序就无法在低档的PC系统中运行。80386分页的模式是将内存划分为4KB或4MB大小的页。操作系统的设计者可以在二者之间自由的选择,也可混合使用这两个大小的页面。稍后,我会介绍Windows2000采用的混合大小方案:由操作系统使用4MB的页面,而4KB页面由剩余的代码和数据使用。这些页面由分层结构的页表树管理,该页表树记录当前位于物理内存中的页,同时还记录了每个页是否实际的位于物理内存中。如果指定页已被置换到了硬盘上,而某
7、些模块触及了位于这些页中的地址,CPU就会产生一个缺页中断(这与外围硬件产生的中断类似)。接下来,位于操作系统内核中的缺页中断处理例程会试图将该页再次调入物理内存,这可能需要将另一块内存中的数据写入硬盘以腾出空间。通常,系统采用最近最少(LRU)算法来确定哪个页可以被置换出去。现在可以很清楚地看到为什么有时将这个过程称为----请求式分页(demandpaging):即,由软件提出请求,然后根据操作系统和应用程序使用的内存的统计数据,将物理内存中的数据移动到后备存储设备中。由页表提供的间接寻址方式蕴含着很有趣的两件事。第一,程序所使用的地址和CP
8、U使用的物理地址总线上的地址之间并没有预设的关系。如果你知道你的程序所使用的数据结构位于某一地址,如,0x00140000,你可能仍然不
此文档下载收益归作者所有