第五章存储器管理基础

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第五章:存储器管理基础一:概述在保护模式下,存储器管理包括哪些方面呢?1、一个如何存储分段:存储段:代码和数据系统段:局部段描述表,任务状态段分页:2、如何访问通过一个访问描述符来访问我们存储在内存中的东西。描述符的分类:1)全局描述符2)局部描述符描述本身存储在哪里呢?1)全局描述符存储在全局段描述表2)局部描述符存储在局部段描述表中根据描述符描述内容描述又可以分为:描述符:包含什么内容?描述符有三种:存储段描述符:存储段包括,段基址、段长、段属性。系统段描述符:段基址、段长、段属性系统段描述符有:LDT局部段描述表描述符。TSS任务状态段描述符。IDT中断描述表描述符。门描述符:门的分类:调用门、中断门、陷进门。描述符与内存块的关系如下图:这些描述符存放在哪里呢?GDT全局段描述表。CPU如何感知GDT在哪里呢?GDT的首地址必须存储到GDTR,GDTR是一个48位寄存器,其中高32存储了GDT的基地址。低16位存储了GDT长度。CPU通过GDTR中的32位基地址就能找到GDT.LDT局部段描述表CPU怎么找到LDT局部段描述表呢?CPU有一个LDTR,必须注意的是,LDTR并不是一个48位的寄存器,而是一个16位寄存器。因此意味着不可直接通过LDTR来找到LDT。实际上LDTR是一个16位寄存器,它里面存储的是一个选择子,是一个全局段描述表的选择子。什么叫选择子呢?全局段描述表、局部段描述表、中断描述表,这些描述表中都存储着64位的描述符。因此描述表就相当于一个数组,数组的每个元素是64位,也就是8个字节。这个选择子就相当于数组下标。选择子是一个16位数据,其中高13位是描述表数组的下标,第三位分成两个部分,低两位是特权级。第三位是表式该选择子是全局段描述表的选择子还是局部段描述表的选择子。如何通过LDTR找到描述符呢?1、根据LDTR中的内容,在GDT中找到局部段描述表的描述符,找到后,就可以得到局部段描述表的基地址。2、根据第一步得到的基地址,加上局部段描述符选择子(低三位清0),就可以得到局部段描述符。3、从局部段描述符中就可以得到局部短的基地址、长度、段属性。局部段选择子:151413121110987654321000000000000100111、首先,D2=0表示这个选择子是一个局部段选择子。2、必须找到该局部段,找的过程如上图所示5.2段的类型5.2.1存储段5.2.2系统段LDT局部段描述表(进程私有)。TSS任务状态段。IDT中断描述表。LDT中存储的是存储段描述符。IDT中存储的是门描述符,也就是描述的中断服务程序的入口地址。TSS任务状态段注意:在操作系统中TSS任务状态段涉及到线程的切换。线程可以执行,也可挂起。线程切换时,需要切换线程现场,在保护模式下,现场的内容是非常多的,而且还有特权级的问题。因此,在硬件设计的时候就考虑到了任务的切换的问题。TSS任务状态段是用来保存现场数据的。1、CPU如何知道当前正执行的是哪个任务(线程,函数)。CPU内部有个寄存器TR(16位),TR叫任务状态段选择子。通过TR就可得到TSS的描述符,这个描述符中的段基址就是TSS的首地址。2、TSS任务状态段的格式TSS由5个部分构成的:1)链接字段2)内层堆栈指针字段在保护模式下,不同的特权级的函数,使用不同数据,局部变量存储在堆栈中,因此不同不同的特权级的函数使用堆栈也应该不同。有4中特权级,一次在保护模式下,对于一个进程来说,有4个不同堆栈。对CPU来说,当前使用的堆栈是谁呢?有CPU的SS:ESP来决定。在TSS中保存着0,1,2三级堆栈的48全地址。其作用是,为了从低级向高级跃迁时找到高特权级的堆栈指针。从3级跃迁到1级的过程:首先将3级ss保存到一个通用寄存器中一般式EAX的低16位。再将第3级的ESP保存到一个通用寄存器中,一般式ECX。然后将第1级的SS:ESP从TSS中的相应位置取出,然后修改到CPU的SS:ESP中。然后,将第三级SS:ESP也就是AX:ECX中内容入栈。也就是在第一级堆栈中保存第3级的堆栈指针。同时将断点的地址CS:EIP保存到TSS的相应位置。此时,将执行第1级的代码。从地级再回到第3级执行时。实际上第1级的代码将执行一条RETD。是从第1中恢复第3级的SS:ESP,同时从TSS中取出CS:EIP的相应值恢复到CPU的CS:EIP中。3)地址映射寄存器字段CR3也表基址寄存器LDTR局部段描述表选择子。局部段描述表是任务私有的。4)寄存器保存字段EAX,EBX。。。。。5)IO许可位图基地址字段6)调试陷进位3、5.2.3门门:调用门、中断门、陷进门、任务门门:怎么理解门?门就是入口。调用门、中断门、陷进门是一个程序的入口,也就是程序的入口地址,也就是程序的第一条指令的地址。任务门:就是任务状态段的首地址。当我们CPU进行任务切换。比如、挂起一个线程,调用另一个线程。所有的门都是去调用一个程序。调用门、中断门、陷进门,这个门中都包含了程序段选择子和偏移地址。也就是说,每次调用这个程序是都是从第一条指令开始执行的。但是任务门就不一定是从函数第一条指令开始执行的。任务门对应一个任务状态段,任务门的程序应该从哪里执行是由任务状态段的CS:EIP决定的。比如,一个任务开始执行后,由于某种原因被阻塞了,这个被阻塞断点的CS:EIP都会被保存到任务状态段中,下一次调用他将从断点开始执行。所有的门,都对应一个门描述符,这个描述符是一个64位的内存结构。调用门,中断门、陷进门的描述符中都包含了段选择子、偏移地址。而任务门只有段选择子。5.3段描述符5.3.1存储段描述符1、存储段描述符的格式CSSSDSESFSGS这些段寄存器中存储了,段选择子。我们通过段选择子找到段描述符,如果是存储段段描述符,那么就有这个段的段基址、段长、段属性。存储段的格式:M7M6M5M4M3M2M1M0段基址(31~24)段属性段基址(23~0)段长(15~0)M6M57654321076543210GD/B0AVL段长(19~16)PDPLDTTYPEG段长的粒度,G=0粒度为字节,为字节意味着内存的寻址范围是1MB,这意味着CPU工作于实模式。G=1粒度为4KB,意味着内存的寻址范围是4GB,这意味着CPU工作于保护模式。D/B段数据宽度指示:代码段:D=0表示宽度是16位,当CPU工作于实模式。需要将宽度设置为16位D=1表示宽度是32位。当CPU工作于实模式。需要将宽度设置为32位数据段、堆栈段B=0表式数据宽度16位。当CPU工作于实模式。需要将宽度设置为16位B=1表示数据宽度32位。当CPU工作于实模式。需要将宽度设置为16位CPU有三种:实模式、保护模式、V8086M6.D5保留M6.D4AVL给用户,给程序员。M6.D3~D0段长的高4位。M5.D7P站位表示,存在标志位。P=1表示该段已经从硬盘调入到内存中了。表示这个描述符正在被使用了。P=0表示该描述符没有被使用,也就是该描述符空闲状态。DPLD6、D5段描述符描述的段的特权级,000级011级102级113级0最高3最低对代码或数据进行分级的目的是为了保护操作系统,保证操作系统的独立性、稳定性。3级可以访问0级的数据。比如,内核对象在用户代码中可以通过内核对象的句柄来访问。0级不可以访问3级的数据。M5.D4DT段描述符描述的是存储段还是系统段。DT=1描述的是存储段DT=0描述的是系统段或门M5.D3E描述的段是否可以执行E=1可执行段,表示该描述符描述的是一个代码段E=0不可执行段,表示该描述符描述的是一个数据段M5.D2ED/C方向指示位或一致性指示位如果是数据段,即:E=0。ED=0向上扩展,意味着该段的存储范围是从基地址开始,向上扩展。也就是基地址是该段中地址最小的那个内存单元。ED=0向下扩展,意味着该段的存储范围是从基地址开始,向下扩展。也就是基地址是该段中地址最大的那个内存单元。如果该描述符描述的是代码段,E=1:C=0表示该描述符描述的是非一致性代码段。C=1表示该描述符描述的是一致性代码段。什么叫一致性代码段,一致性代码段是一个共享的代码段。M5.D1W/R数据段W/R=0该段不可写只读W/R=1该段可写代码段W/R=0该段不可读W/R=1该段可读M5.D0AA=0表示该描述符描述的段没有被访问A=1表式该描述符描述的段有被访问EED/CW/RATYPE类型EED/CWRA类型值说明00000数据段、向上扩展、只读、没有被访问过00011数据段、向上扩展、只读、有被访问过00102数据段、向上扩展、可读可写、没有被访问过00113数据段、向上扩展、可读可写、有被访问过01004数据段、向下扩展、只读、没有被访问过01015数据段、向下扩展、只读、有被访问过01106数据段、向下扩展、可读可写、没有有被访问过01117数据段、向下扩展、可读可写、有被访问过10008代码段、非一致性代码段(非共享代码段)、不可读、没有被访问过。10019代码段、非一致性代码段(非共享代码段)、不可读、有被访问过。1010A代码段、非一致性代码段(非共享代码段)、可读、没有被访问过。1011B代码段、非一致性代码段(非共享代码段)、可读、有被访问过。1100C代码段、一致性代码段(共享代码段)、不可读、没有被访问过。1101D代码段、、一致性代码段(共享代码段)、不可读、没有被访问过。1110E代码段、一致性代码段(共享代码段)、可读、没有被访问过。1111F代码段、一致性代码段(共享代码段)、不可读、有被访问过。注意:P表示是这个描述符是否已经分配给某个段用于描述该段的特性。存储段描述符分配的过程:1)操作系统为一个存储段分配内存。内存特性段基址段长段属性SBSLSS2)操作系统需要在GDTLDT中分配一个空闲描述符。假设在GDT中找一个空闲的描术符。操作系统就会以GDTR为首址,扫描GDT,判断每个描述符的占位位P是否等于0。如果等于0那么该描述符就是一个空闲的描述符,就可以分配给当前的存储段。注意:在扫描时,操作系统还会保存一个扫描的当前位置,也就是当前描述符在GDT中的位置。即当前描述符在GDT中的下标N。3)填写分配给当前存储段的描述,也就是将第一步得到的段基址SB段长SL段属性SS填写到GDT的相应的描述符中。4)填写存储段的段选择子将从第2步得到的当前描述符在GDT中的位置N,作为给存储段的段选择子。一个程序,一个进程是不是只有一个段?一个程序或一个进程是不是只有一个代码段?一个程序或一个进程是不是只有一个数据段?一个程序或一个进程是可以有多个代码段、多个数据段、多个堆栈段。从程序员的角度来讲,程序员看到的是多给不同的名字。比如在汇编语言中,我们可以定义多个不同名字的数据段。在高级语言中,加载不同动态链接库。在语言中名字代表的含义是什么?地址段属性偏移属性值每一个进程都有一个段表对于程序员来说:是一些标识符。段表中就登记了段的段选择子。5.2段描述符的访问权限字节为FE,它描述的是哪种类型的段描述符?并说明其属性。11111110P=1该段已经调入内存DPL=11特权级为3DT=1该段位存储段E:代码段、一致性代码段(共享代码段)、可读、没有被访问过。2、存储段描述符的结构类型定义描述符存储在哪里?GDT全局段描述表段选择子LDT局部段描述表段选择子IDT中断描述表中断向量号(中断类型号)如何给一个存储段描述符赋值?比如在GDT中的第2个描述项,描述一个数据段,数据段、向上扩展、可读可写、有被访问过5.3.2系统段描述符系统描述符:描述的是谁?LDT(局部段描述表)任务状态段IDT中断描述表系统描述符的格式:基本与存储段描述符。但是在属性字段中有两个地方根存储段有区别:DT存储段描述符DT=1而系统段描述符DT=0TYPE其定义根存储段完全不相同。类型值说明类型值说明0未定义8未定义1可用的286TSS9可用的386TSS2LDTA未定义3忙的286TSSB忙的386TSS4286调用门C未定义5任务门D未定义

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功