版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.3.2Windows的内存管理机制在这一节中,我们需要通过学习解决两大疑问:Win32汇编中,每个程序都可以用4GB的内存吗?Win32汇编源代码中为什么看不到CS,DS,ES和SS等段寄存器的使用?DOS操作系统的内存安排Win32编程相对于DOS编程最大的区别之一就是内存的使用问题。1.DOS操作系统的内存安排先来回顾一下DOS操作系统的内存使用,DOS操作系统运行于实模式中,内存安排如图:1.DOS操作系统的内存安排我们看到,由于8086处理器的寻址范围只有可怜的1MB大小,当时系统硬件使用的存储器地址被安排在高端。地址是从A0000h(即640KB)开始的384KB中,其中有用于显示的视频缓冲区和BIOS的地址空间。而在内存低端,安排了中断向量表和BIOS数据区;剩下从500h开始到A0000h总共不到640KB的内存是操作系统和应用程序所能够使用的;应用程序不可能使用这640KB以外的内存。这就是著名的“640KB限制”。1.DOS操作系统的内存安排而即使在这640KB中,DOS操作系统又占领了低端的一部分内存,最后剩下600KB左右的内存才是应用程序真正可以用的。如果系统中有内存驻留程序存在,那么应用程序还要和这些TSR程序共同分享这段内存空间。注释:TSR即(TerminateandStayResident)原意是停止并驻留,指的是内存驻留程序。2.80386的内存寻址机制Windows的内存管理和DOS的内存管理有很大的不同,在了解Windows的内存管理模式之前,需要对80386保护模式下内存分页机制有所了解。为了做个对比,先来看实模式下的内存寻址方式:在实模式下,一个完整的地址由段地址和偏移地址两部分组成。处理器换算时先将段地址乘以10h,得到段在物理内存中的起始地址,然后加上16位的偏移地址得到实际的物理地址。2.80386的内存寻址机制现在我们谈回到80386处理器的工作模式:当80386处理器工作在保护模式和虚拟8086模式的时候,可以使用全部32根地址线访问4GB大的内存。段地址加偏移地址的计算方法显然无法覆盖这么大的范围。但计算一下就可以发现,实际上和8086同样的限制已经不复存在,因为80386所有的通用寄存器都是32位的,2^32==4G,所以用任何一个通用寄存器来间接寻址,不必分段就已经可以访问到所有的内存地址。2.80386的内存寻址机制这是不是说,在保护模式下,段寄存器就不再有用了呢?答案是否定的!实际上段寄存器更有用了,虽然在寻址上不再有分段的限制问题,但在保护模式下,一个地址空间是否可以被写入,可以被多少优先级的代码写入,是不是允许执行等涉及保护的问题就出来了。要解决这些问题,必须对一个地址空间定义一些安全上的属性。段寄存器这时就派上了用途,不妨将这些属性存放在段寄存器中!2.80386的内存寻址机制但是问题来了,涉及属性和保护模式下段的其他参数,要表示的信息太多了,要用64位长的数据才能表示。我们把这64位的属性数据叫做段描述符(SegmentDescriptor)。80386的段寄存器仍然是16位的,无法放下保护模式下64位的段描述符。如何解决这个新的问题呢?解决办法是把所有段的段描述符顺序放在内存中的指定位置,组成一个段描述符表(DescriptorTable)2.80386的内存寻址机制而段寄存器中的16位用来做索引信息,指定这个段的属性用段描述符表中的第几个描述符来表示。这时,段寄存器中的信息不再是段地址了,而是段选择器(SegmentSelector)。可以通过它在段描述符表中“选择”一个项目以得到段的全部信息。既然这样,段描述符表放在哪里呢?80386中引入了两个新的寄存器来管理段描述符表。一个是48位的全局描述符表寄存器GDTR,一个是16位的局部描述符表寄存器LDTR。那么,为什么有两个描述符表寄存器呢?2.80386的内存寻址机制GDTR指向的描述符表为全局描述符表GDT(GlobalDescriptorTable)。它包含系统中所有任务都可用的段描述符,通常包含描述操作系统所使用的代码段、数据段和堆栈段的描述符及各任务的LDT段等;全局描述符表只有一个。LDTR则指向局部描述符表LDT(LocalDescriptorTable)。80386处理器设计成每个任务都有一个独立的LDT。它包含有每个任务私有的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符,如任务门和调用门描述符等。2.80386的内存寻址机制不同任务的局部描述符表分别组成不同的内存段,描述这些内存段的描述符当做系统描述符放在全局描述符表中。和GDTR直接指向内存地址不同,LDTR和CS,DS等段选择器一样只存放索引值,指向局部描述符表内存段对应的描述符在全局描述符表中的位置。随着任务的切换,只要改变LDTR的值,系统当前的局部描述符表LDT也随之切换,这样便于各任务之间数据的隔离。但GDT并不随着任务的切换而切换。2.80386的内存寻址机制看到这里,读者可能会提出一个问题,既然有全局描述符表和局部描述符表两个表,那么段选择器中的索引值对应哪个表中的描述符呢?实际上,16位的段选择器中只有高13位表示索引值。剩下的3个数据位中,第0,1位表示程序的当前优先级RPL;第2位TI位用来表示在段描述符的位置;TI=0表示在GDT中,TI=1表示在LDT中。2.80386的内存寻址机制图说寻址路线:在保护模式下,同样以xxxx:yyyyyyyy格式表示一个虚拟地址。注意,xxxx(16位,相当于8086时代的段地址)保存在段寄存器,yyyyyyyy(32位,相当于8086时代的偏移地址)保存在通用寄存器。2.80386的内存寻址机制3.80386的内存分页机制在实模式下寻址的时候,“段寄存器+偏移地址”经过转换计算以后得到的地址是“物理地址”,也就是在物理内存中的实际地址。而保护模式下,“段选择器+偏移地址”转换后的地址被称为“线性地址”而不是“物理地址”。那么,线性地址就是物理地址吗?答案可能是“是”,也可能是“不是”,这取决于3.80386的内存分页机制是否被使用。3.80386的内存分页机制为什么会有内存分页机制?!我们来回顾一下:在单任务的DOS系统中,一个应用程序可以使用所有的空闲内存。程序退出后,操作系统回收所有的碎片内存并且合并成一个大块内存继续供下一个程序使用。内存合并过程中的一个极端情况是当系统中有多个TSR程序时,早装入内存的TSR被卸载后,后装入的TSR会留在内存的中间部位,把空闲内存隔成两个区域。3.80386的内存分页机制这时应用程序使用的最大内存块只能是这两块内存中较大的一块,无法将它们合并使用。对于一个多任务的操作系统,内存的碎片化是不能容忍的。否则,经过一段时间后,即使空闲内存的总和很大,也可能出现任何一片内存都小到无法装入执行程序的地步。所以多任务操作系统中碎片内存的合并是个很重要的问题。3.80386的内存分页机制80386处理器的分页机制可以很好地解决这个问题。80386处理器把4KB大小的一块内存当做一“页”内存,每页物理内存可以根据“页目录”和“页表”,随意映射到不同的线性地址上。这样,就可以将物理地址不连续的内存的映射连到一起,在线性地址上视为连续。3.80386的内存分页机制在80386处理器中,除了和CR3寄存器(指定当前页目录的地址)相关的指令使用的是物理地址外,其他所有指令都是用线性地址寻址的。名词扫盲:CR3用于保存页目录表页面的物理地址,因此被称为PDBR。由于目录是页对齐的,所以仅高20位有效,低12位保留供更加高级的处理器使用。向CR3中装入一个新值时,低12位必须为0,从CR3中取值时,低12位被忽略。3.80386的内存分页机制还有,是否启用内存分页机制是由80386处理器新增的CR0寄存器中的位31(PG位)决定的。如果PG=0,则分页机制不启用,这时所有指令寻址的地址(线性地址)就是系统中实际的物理地址;当PG=1的时候,80386处理器进入内存分页管理模式,所有的线性地址要经过页表的映射才得到最后的物理地址。废话不多说,先上美图!!3.80386的内存分页机制3.80386的内存分页机制一个xxxx:yyyyyyyy格式的虚拟地址,经过上节课所示的段地址转换步骤后得到32位的线性地址zzzzzzzz(步骤①)。当禁用分页机制时,线性地址就是物理地址,处理器直接从物理内存存取数据(步骤②);当启用分页机制时,得到线性地址的方法还是一样(步骤1'),但是还要根据页目录和页表指定的映射关系把地址映射到物理内存的真正位置上(步骤3')。然后,CPU以映射后的物理地址在物理内存中存取数据。这个过程对于指令来说是透明的。3.80386的内存分页机制内存分页管理只能在保护模式下才可以实现,实模式不支持分页机制。但不管在哪种模式下,所有寻址指令使用的都是线性地址,程序不用关心数据最后究竟存放在物理内存的哪个地方。页表规定的不仅是地址的映射,同时还规定了页的访问属性,如是否可写、可读和可执行等。比如把代码所在的内存页设置为可读与可执行,那么权限不够的代码向它写数据就会引发保护异常。利用这个机制可以在硬件层次上支持虚拟内存的实现。3.80386的内存分页机制页表可以指定一个页面并不真正映射到物理内存中。这样,访问这个页的指令会引发页异常错误。这时,处理器会自动转移到页异常处理程序中去。操作系统可以在异常处理程序中将硬盘上的虚拟内存读到内存中并修改页表重新映射,然后重新执行引发异常的指令。这样指令可以正常执行下去。请看图!3.80386的内存分页机制4.Windows的内存安排这节课我们需要理解三个概念:每个应用程序都有自己的4GB的寻址空间,就算这个程序只暂1KB的内存;不同应用程序的线性地址空间是隔离的,尽管他们在内存中是搞在一起;时刻要记住,DLL程序是“小三”,因此它们没有自己“私有”的空间。本节课我们将图文并茂地来进行原理层面的分析!4.Windows的内存安排虚拟内存安排:Windows系统一般在硬盘上建立大小为物理内存两倍左右的交换文件用作虚拟内存。利用80386处理器的内存分页机制,交换文件的寻址上可以很方便地作为物理内存使用。(只需要在真正调用的时候将其读入物理内存并同时修改线性地址映射到这块内存即可)。同样道理,反正是映射一个地址而已,所以被执行的程序也可以不必装入内存,只需要在页表中建立映射关系,真正运行到这段代码才调入内存。4.Windows的内存安排众所周知,Windows是一个分时的多任务操作系统,CPU时间(就是CPU运行的过程)被分成一个个的时间片后分配给不同程序轮流使用。在A程序的时间片中,和这个程序执行无关的部分(B和C等其他程序的代码和数据)并不需要映射到线性地址中。附加解析:内存中,所有的程序都搞在一起,关系十分混乱;CPU只能看到线性地址(假的),每个程序拥有自己的线性地址(小三除外)。总结:WIN32编程中几个很重要的概念第一点:每个应用程序都有自己的4GB的寻址空间。该空间可存放操作系统、系统DLL和用户DLL的代码,它们之中有各种函数供应用程序调用。再除去其他的一些空间,余下的是应用程序的代码、数据和可以分配的地址空间。总结:WIN32编程中几个很重要的概念第二点:不同应用程序的线性地址空间是隔离的。虽然它们在物理内存中同时存在,但在某个程序所属的时间片中,其他应用程序的代码和数据没有被映射到可寻址的线性地址中,所以是不可访问的。从编程的角度看,程序可以使用4GB的寻址空间,而且这个空间是“私有”的。总结:WIN32编程中几个很重要的概念第三点:DLL程序没有自己“私有”的空间。它们总是被映射到其他应用程序的地址空间中,当做其他应用程序的一部分运行。原因很简单,如果它不和其他程序同属一个地址空间,应用程序该如何调用它呢?5.从WIN32汇编的角度看内存寻址如果坚持不到这句话出现的同学就因为前边Windows原理太复杂而放弃的童鞋,小甲鱼觉得很可惜……Win32汇编中的内存访问远比DOS下的分段寻址方式简单,这是为什么呢?因为Windows是一个多任务的操作系统,最首要的宗旨就是“稳定压倒一切”。如果把描述符表以及页表等内容交给用户程序管理是很不安全的。5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026内蒙古锡林郭勒盟言信人力资源服务有限公司招聘6人备考题库附答案详解ab卷
- 2026浙江温州外国语高级中学(温州中学国际部)招聘经济教师1人备考题库及答案详解参考
- 2026北京航标时代检测认证有限公司浙江分公司非事业编制人员招聘3人备考题库(浙江)及完整答案详解一套
- 无人机行业应用(航测)电子教案 1.26 定位设备的选择
- 2026广河志成中医院招聘10人备考题库及一套答案详解
- 攀枝花钒钛高新技术产业开发区管理委员会 乡村规划建筑师招聘备考题库及参考答案详解1套
- 2026年度南平松溪县“校园行”紧缺急需学科专业教师招聘备考题库(福建师范大学专场)及答案详解(名师系列)
- 2026山东日照市卫生健康委员会所属事业单位招聘49人备考题库及答案详解(名师系列)
- 2026广东中山市黄圃镇水务事务中心招聘水闸、泵站管理员6人备考题库及参考答案详解1套
- 2026内蒙古自治区民航机场集团有限责任公司乌兰浩特分公司招聘6人备考题库附答案详解(研优卷)
- 2026 春季人教版八年级下册历史全册教案
- 病案编码考试题及答案
- 小数的乘法教学课件
- 结肠癌和直肠癌中西医结合诊疗指南
- 化妆品玻璃瓶
- CJ/T 94-2005饮用净水水质标准
- 面部筋膜培训课件
- SPC地板项目可行性研究报告-范文
- 《研学旅行课程设计》课件-1研学课程学生手册设计
- ISO27001最新版信息风险评估表
- 写字楼物业各项应急预案
评论
0/150
提交评论