350 likes | 469 Views
保护虚拟模式与存储管理补充知识. 内容提要 : 1.32 位 X86 的内部结构,原理及基本工作方式。 2. 虚拟存储系统原理, Windows 与 LINUX 存储管理与多任务机制. 基本结构寄存器. 系统级寄存器. 浮点寄存器. 调试测试寄存器. 1. 基本结构寄存器. 31. 16. 15. 8. 7. 0. AH A. X AL. EAX. BH B. X BL. EBX. CH C. X CL. CS. 代码段. ECX.
E N D
内容提要: • 1.32位X86的内部结构,原理及基本工作方式。 • 2.虚拟存储系统原理,Windows与LINUX存储管理与多任务机制
基本结构寄存器 系统级寄存器 浮点寄存器 调试测试寄存器 1.基本结构寄存器 31 16 15 8 7 0 AH A X AL EAX BH B X BL EBX CH C X CL CS 代码段 ECX DH D X DL SS 堆栈段 EDX SI DS 寄存器组 ESI DI ES EDI 数据段 BP FS EBP SP GS ESP 通用寄存器 段寄存器 IP FLAGS 指令指针IP 标志寄存器EFLAGS
系统级寄存器 4个控制寄存器 4个系统地址寄存器 31 24,23 18 16 15 8 7 0 CRO P G C D N W …... A M W P …... N E 1 T S E M M P P E 控 制 寄 存 器 CR1 Intel保留 页故障线性地址寄存器 CR2 页目录值 P C D P W T CR3 CR0: PE:保护虚拟地址方式的允许位。PE=1,保护方式;PE=0,实方式. PG:分页允许位。PG=1,允许分页部件工作(PE=1);反之禁止。 CD:片内CACHE无效位。若CD=1,片内CACHE不命中时,则不需将所 需信息读入CACHE. NW:片内CACHE非写直达位。NW=0,数据写入CAHCE的同时也写入主存,否则只写入CACHE. WP:页写保护位。WP=1,禁止任何特权级的程序对只读页面进行写入操作。 AM:对界检查控制位。 NE:数据异常位。TS:任务切换位;EM:仿真协处理器位;MP:监视协处理器位 CR2:保留所检测到的上一个页面故障的32位线性地址。 CR3:12-31位保留着一级页表(页目录)的物理基址。PWT,PCD可对CACHE进行控制。
界限 47 线性基地址 16 15 0 系 统 地 址 寄 存 器 GDTR IDTR 15 0 32位基地址 20位界限 属性 TR LDTR 选择符 描述符寄存器(不可见) 系统地址寄存器又称作保护方式寄存器,仅能在保护方式下使用。 GDTR:全局描述符表寄存器,48位,高32位是全局描述符表的线性基地址,低16位是界限。 如:(GDTR)=0800,0000,0FFFH,则全局描述符表的第一个地址为0800,0000H,末地址为0800,0FFFH,表大小为1000H. IDTR:中断描述符表寄存器,48位,高32位是中断描述符表的线性基地址,低16位是界限。 LDTR:局部描述符表寄存器,用于存放LDT的线性基地址、界限、属性和16位的选择符。 只有16位的选择符是可见的,其它的由硬件自动装入内容。 TR:任务状态寄存器,存放当前正在执行的任务的线性基地址、界限、属性和16位的选择符。只有16位的选择符是可被访问。
3.调试与测试寄存器 5个测试寄存器 8个调试寄存器 31 0 31 0 DR0 断点0线性地址 TR3 Cache测试控制 断点1线性地址 Cache测试数据 断点2线性地址 Cache测试状态 断点3线性地址 TLB测试控制 保留 TR7 TLB测试状态 保留 调试状态寄存器 DR7 调试控制寄存器 DR0-DR3用于设置数据存取和代码执行断点; DR7是调试控制寄存器,用于选择调试功能和设置断点; DR6用于指明断点的当前状态。 测试寄存器用于测试自身的片内CACHE和转换用旁视缓冲区(TLB)。
存储器 虚拟地址 物理地址 分段部件 分页部件 线性地址 微处理器的地址空间 1.存储地址空间 虚拟空间 线性空间 物理空间 虚拟空间又称逻辑空间,是应用程序员编写程序的空间。246(64TB) 物理空间又称主存空间,是存储器的实际空间。232(4GB) 80486采用段页式虚拟存储器。将程序按逻辑结构分段,每段再分为若干大小相同的页;主存空间也划分为若干同样大小的页。建立相应的段表和页表,分两级查表实现虚实地址转换。以页为单位调进或调出主存,按段共享与保护程序与数据。80486 段号为16位,段内地址为32位,因此最多可将整个虚拟空间分为64K段,每段4GB。
2.输入输出(I/O)空间 80486有两个独立的物理空间:储存空间、I/O空间 FFFFFFFFH 4GB 不可访问 0000FFFFH 64K 可访问 00000000H 00000000H 物理存储空间 物理I/O空间I/O
工作模式简介 两种工作模式: 实地址模式 保护虚拟模式 2.3.1.实地址模式 1.存储空间及实地址模式下的编址 实地址模式下的存储空间为220,及1M字节。 物理地址的形成方式:段寄存器内容左移4位加上有效地址。 如:CS内容为1000H,IP为8888H,则实地址模式下的物理地址为: 1000H×16+8888H=18888H 2.保留的地址空间 在实地址模式下,有两个物理存储空间是需要保留的: 地址0000,0000H--0000,03FFH是中断向量区,每个中断向量占用4个字节; 地址FFFF,FFF0H-FFFF,FFFFH为系统初始化区,当加电或复位时,物理地址 自动置为FFFF,FFF0H。
保护虚拟地址模式 80486工作在保护虚拟地址模式时,充分发挥了80486所具有的存储管理功能和硬件支撑的保护机制,为多用户操作系统的设计提供有力的支持。同时在保护方式下,80486也允许运行已有的8086、80286、80386的软件。 1.保护概念 在程序运行过程中,应防止应用程序破坏系统程序、某一应用程序破坏其它应用程序、错误地把数据当作程序运行等情况的出现。为避免出现这些情形所采取的措施称作“保护”。 操作系统内核 系统服务及接口 80486 4级特权保护 0 应用程序 1 2 3 特权规则:特权级P存储在某段上的数据,只能由不低于P的特权级访问;具有特权级P的的程序或过程只能由不高于P级上执行的任务调用。
2.存储空间 在保护方式下,80486可为每个任务提供232(4GB)字节的物理空间,并允许程序在246(64TB)的逻辑空间中运行。 3.虚拟86环境 80486允许在实方式下和保护方式下执行8086的应用程序。有了虚拟86方式,486允许同时执行8086操作系统和8086应用程序以及486操作系统和486应用程序。 在虚拟86方式下,还可以与实方式相同的形式使用段寄存器,以形成线性基地址。通过使用分页功能,就可以将虚拟86方式下的1M地址空间映象到486的4GB的物理空间的任何位置。
CPU M1 M2 … Mi Mn 存储系统 存储系统的基本概念 为了解决速度、容量、价格之间的矛盾,人们提出存储系统的概念,如图, M1速度最快,容量最小,每位价格最高; Mi速度大于Mi+1, Mi容量小于Mi+1, Mi每位价格高于Mi+1;整个存储系统访问速度近似于M1,每位价格近似于Mn,容量不小于Mn. 虚拟存储器是为了增加存储系统的存储容量; CACHE是为了提高存储器的速度。
虚拟存储器 • 基本概念 • 由主存储器和辅助存储器共同组成。速度接近于主存,每位价格与辅存相近。 1.地址空间与地址 虚拟存储器有3种地址空间及对应3种地址。 虚拟地址空间是应用程序员编写程序的地址空间。其地址称为虚地址。 主存空间称为实存地址空间,是存储、运行程序的空间,其地址称为主存物理地址。 辅助地址空间也就是磁盘存储器的地址空间,是用来存放程序的空间,其地址称辅存地址。
工作原理 ③ 外地址变换 逻辑地址 辅存地址 ① ③ 地址变换 替换算法 ② 物理地址 ④ ⑤ I/O机构 主存储器 辅助存储器
段式存储器 • 一个程序由多个模块组成,特别是在结构化程序设计思想提出后,程序的模块性就更强了。组成程序的模块大小可以各不相同,但每个模块都是一个特定功能的独立程序段。当某程序段从辅存调入主存,只要由系统赋予该段一个基址,就可以把基址和每个单元在段内的相对位移量组合在一起,形成这些单元在主存中各自的实际地址。 1.地址映像与变换 在段式存储器中,每个程序都有一个段描述符表(段表),段表的一行称作段描述符,段描述符用来描述模块的基本状况,其基本内容包括基址、界限和访问控制等。基址是装入模块的首地址,界限指该段的长度。 8K 模块3 3K 3K 1K 0.5K 6K 模块2 6K 2K 0K 1K 3K 模块1 基址 界限 访问控制 1.5K 1K 模块0 段表 0 主存空间 程序空间 地址映射
二维的虚拟地址必须转换成一维的物理地址,主存中的程序才能执行。二维的虚拟地址必须转换成一维的物理地址,主存中的程序才能执行。 每个任务都有一个虚拟空间。为了避免多个并行任务的多个虚拟地址空间直接映射到同一个物理地址空间,采用线性地址空间隔离虚拟地址空间和物理地址空间。线性空间由一维的线性地址构成,线性地址空间和物理地址空间对等。线性地址空间32位长,4GB。 虚拟地址到物理地址的映射函数在每个任务任务中进行定义,随着任务的切换,映射函数也切换。两个不同的任务,尽管虚拟地址相同,但实际物理地址可以不同。 80486的虚地址空间为246即64TB,此空间编程的逻辑地址有46个二进制位,其中低32位是偏移量,高14位是段寄存器中的2-15位的内容。 45 32 31 0 段寄存器15-2位 偏移量 逻辑地址 …. 描述符 …. 段表 32位线性地址 物理地址
段描述符与段描述符表 • (1)段描述符格式 • 一个段描述符格式由8个字节组成,是位于主存中的一种数据结构,由系统程序创建。 D7 D0 段界限 7-0 0 段界限 15-8 基址 7-0 基址15-8 基址23-16 P DPL S TYPE G D/B 0 AVL 段界限19-16 基址31-24 7 G:为粒度位,用来确定段界限所使用的长度单位。G=0,以字节为单位;G=1,以4KB(212)为单位。 P:是存在位,P=1表示该段在主存中。AVL:是用户的操作系统可用位。 D/B:在代码段,为D位,D=1,采用32位操作数和寻址方式,反之16位 在数据段,B=1时,PUSH,POP,CALL都使用ESP,反之用SP
S:80486的段可被设置为系统段(S=0)和非系统段。系统段描述有关操作系统的表格、任务和选通门等信息,非系统段又细分为代码段和数据段。S:80486的段可被设置为系统段(S=0)和非系统段。系统段描述有关操作系统的表格、任务和选通门等信息,非系统段又细分为代码段和数据段。 DPL:特权级别 S=1时,第5字节又称访问权字节,该字节中的TYPE字段中的各位定义如下: P DPL S=1 E=0 ED W A E=1 C R E:可执行位。E=0,数据段;E=1,代码段。 ED:扩展方向位。ED=0,向上扩展,即偏移量必须小于等于界限;ED=1,向下扩展。 W:可写位。W=0,不允许写。 R:可读位。R=0,不允许读 A:访问位。A=0,该段尚未被访问 C:相容位。C=1,遵循描述符特权级;C=0,忽略描述符特权级 E位将段分为代码段及数据段,代码段决不允许写。
(2)段描述符表 段描述符表也是位于主存中的一种数据结构,由系统程序创建。分为全局描述符表(GDT)和局局描述符表(LDT). LDT存放给定任务有关的描述符,所以每个任务都有一个独立的LDT,其中含有自己的代码段、数据段和堆栈段等,任务切换时LDT也切换;通过LDT可使各任务的私有段与其它任务项隔离,达到保护的目的。 GDT存放系统所有任务的描述符,如操作系统使用的代码段和数据段、任务状态段以及各个LDT的描述符。整个系统中GDT只有一张。任务切换时,不切换GDT.通过GDT可使各任务需要使用的端能被共享。
(3)选择符 LDTR中的16位选择符不直接给定LDT的位置,而是指向GDT中的某个描述符。 保护模式下,段寄存器中的内容也称为选择符。选择符不直接确定存储器地址,而是指向一个段描述符。选择符由请求特权字段(RPL)、表指示(T)和索引组成。索引乘8就是相对GDT或LDT首地址的偏移量。 选择符(段寄存器) 索引 T R PL T=1 T=0 LDT LDT LDT GDT 选择符 界限 界限 基址 基址 GDTR LDTR
CPU内部还设置了一个段描述符高速缓冲寄存器堆,对程序员是透明的。当选择符值装入寄存器时,处理器会将响应的描述符中的内容自动装入其中,以供地址变换时使用,避免在地址变换时需要不断地访问主存中的段描述符。CPU内部还设置了一个段描述符高速缓冲寄存器堆,对程序员是透明的。当选择符值装入寄存器时,处理器会将响应的描述符中的内容自动装入其中,以供地址变换时使用,避免在地址变换时需要不断地访问主存中的段描述符。 段描述符高速缓冲寄存器堆(不可见) 段寄存器 选择符 CS SS DS ES FS GS 基址 段界限 段属性
FS ES LDTB DS LDTA 模块1 模块3 SS 模块2 模块C 模块1 模块B CS 模块0 模块A 模块B LDTA GDT LDTB 模块2 GS 模块3 选择符 选择符 界限 界限 模块A 界限 基址 基址 基址 模块0,C LDTR GDTR LDTR 模块位置 程序A 程序B
页式存储器 • 页式存储器把主存空间和辅存空间都划分为多个相同尺寸的定长块,每块称作一页,并按顺序编号。80486的页面尺寸定为4K(212) • 虚拟空间中的页称虚页;主存空间中的页称实页。 1.虚拟空间与实存空间 地址变换就是如何将虚页号转化为实页号 虚存空间4G 32 12 11 0 主存空间 虚页号 页内偏移 虚地址 实地址 实页号 页内偏移 1.地址映象与地址变换 段式存储器将虚地址转化为32位线性地址,页式存储器通过页转换逻辑将线性地址转化为物理地址。在80486的页式存储器中,虚拟地址就是线性地址,由20位虚页号和12位页内偏移地址组成,物理地址由20位实页号和12位页内偏移地址组成,但实页号仅在实际存在的主存储器的地址范围内选取。
地址映象与地址变换 在页式存储器中,每个任务都有页表作为虚拟空间映象到物理空间的中介 3页 3 2页 2 1 1页 0 0页 虚页号 主页号 控制信息位 程序空间 页表 主存空间 组成页表的行称作页表项,页表项主要由页面基址和控制信息位组成,主页号指明页面的基址,由于页面号是顺序编制,虚页号可省略。页式存储器通过页表项对页面进行管理。页表本身也是一页。存储在主存中。 80486的页表项由4字节组成,页表尺寸为212,一个页表只有1024个页表项,只能管理1024个页面。80486页式存储器的4GB的虚拟空间被分为220个页面,需要220个页表项对其进行管理。一张页表无法容纳这么多的页表项。
X86采用二级页表方法进行管理,第一级页表称为页表目录,页表目录的页表项指明第二级页表中各项的基址。这样,虚页号分为页表目录和页表。X86采用二级页表方法进行管理,第一级页表称为页表目录,页表目录的页表项指明第二级页表中各项的基址。这样,虚页号分为页表目录和页表。 线性地址 虚页号 页目录索引 页表索引 页内偏移 虚地址 实页号 页内偏移 页表0 实地址 CR3 页表1 页表目录表 页表目录和页表都存放在主存中,页表目录表的基址由控制寄存器CR3的高20位*212指定。
3.页表项及其控制作用 页表项格式如图 页面基址 AV AI L 0 0 A P C D P W T U/S R/S P 页表项由32位组成,高20位是页面基址,页表中该字段就是实页号,在页目录表中,页面基址× 212=相应页表的首址;低12位用来说明页(页表)的控制状态信息。 P:存在位,P=1,表示该页在主存中。在地址变换过程中,若发现P=0,则表示需立即访问的页不在主存,这种情形称作页面失效(页面故障),此时系统会作如下处理: 1)若主存还有空间,操作系统将要访问的页调入主存,且将P置1 2)如果主存没有空间,就根据一定的替换算法将主存中的某页调入辅存,再将要访问的页调入主存。 D:修改位,该位只在页表中起作用,D=1,表示内容被修改。 A:访问位,若该页被访问过,A=1。D和A为替换算法和多机系统的实现提供了方便。 U/S,R/W分别是“用户/系统”位和“读/写”位。这两位与标志寄存器中的WP位配合使用,实行页面级保护。 PCD和PWT是对CACHE的控制方式位。 AV,AI,L允许系统程序任意使用。
2.转换用旁视缓冲区(TLB) 80486设置了一个TLB,可容纳32个页表项的高速缓存,自动将最近被访问的页面所对应的页表项保存起来。又称快表,存于主存中的页表称慢表。
X86的段页式存储器 段式存储器的特点是模块性好,但主存利用率不高,且对辅存的管理比较困难; 页式存储器的特点是主存利用率高,且对辅存的管理容易,但模块性差。 段页式存储器把主存空间分成固定尺寸的页面,程序按模块分段,每个段按主存的页面尺寸分成若干页面。 段页式存储器对多用户系统非常有用,逻辑结构特别清楚。每个用户都有一个逻辑名(用户号),程序可按程序段编写,每个程序段又可分为页而存入内存。
用户号 段号 页目录索引 页表索引 页内偏移 段描述符表 实页号 页内偏移 实地址 页表目录 页表
WINDOWS95 及WINNT进程地址空间的划分 0FFFFFFFFH VXD;内存管理器,文件系统使用的1GB, WIN32所有进程共享,可读写 0C0000000H 0BFFFFFFFH 内存映射文件使用的1GB,有WIN32 DLL, 16位应用程序和内存分配使用,可读写 080000000H 07FFFFFFFH WIN32 进程私有空间 00400000H 003FFFFFH DOS和16位WINDOWS使用 00001000H 000000FFH DOS和16位WINDOWS使用 00000000H
0FFFFFFFFH 操作系统使用2GB,不可存取 08000000H 07FFFFFFFH 非法指针指向的64KB,不可存取 07FFF0000H 07FFEFFFFH WIN32进程私有 000010000H 0000FFFFH NULL指针使用的64KB 00000000H
3.4 Linux在X86上的虚拟内存管理 Linux支持很多硬件运行平台,常用的有:Intel X86,Alpha,Sparc等。对于不能够通用的一些功能,Linux必须依据硬件平台的特点来具体实现。 LINUX的分段策略 Linux在X86上采用最低限度的分段机制,其目的是为了避开复杂的分段机制,提高 Linux在其他不支持分段机制的硬件平台的可移植性,同时又充分利用X86的分段机制来隔离用户代码和内核代码。因此,在Linux上,逻辑地址和线性地址具有相同的值。由于X86的GDT最大表长为64KB,每个段描述符为8Byte,所以GDT最多能够容纳8192个段描述符。每产生一个进程,Linux为该进程在GDT中创建两个描述符:LDT段描述符和TSS描述符,除去Linux在GDT中保留的前12项,GDT实际最多能容纳4090个进程。 Linux的内核自身有独立的代码段和数据段,其对应的段描述符分别存储在GDT中的第2项和第3项。每个进程也有独立的代码段和数据段,对应的段描述符存储在它自己的LDT中。 在Linux中,每个用户进程都可以访问4GB的线性地址空间。其中0x0~0xBFFFFFFF的3GB空间为用户态空间,用户态进程可以直接访问。从0xC0000000~0x3FFFFFFF的1GB空间为内核态空间,存放内核访问的代码和数据,用户态进程不能直接访问。当用户进程通过中断或系统调用访问内核态空间时,会触发X86的特权级转换(从特权级3切换到特权级0),即从用户态切换到内核态。
LINUX的分页策略 标准Linux的分页是三级页表结构,除了X86支持的页目录和页,还有一级被称 为中间页目录。因此,线性地址在转换为物理地址的过程中,线性地址就被解释为 四个部分(不是X86所认识的三个部分),增加了页中间目录中的索引。当运行在 X86平台上时,Linux通过将中间页目录最大的页目录项个数定义为1,并提供一组 相关的宏(这些宏将中间页目录用页目录来替换)将三级页面结构分解过程完美的 转换为X86使用的二级页面分解。
Linux的LDT表项分布 在Linux中,每个用户进程都可以访问4GB的线性地址空间。其中0x0~0xBFFFFFFF的 3GB空间为用户态空间,用户态进程可以直接访问。从0xC0000000~0x3FFFFFFF的1GB空 间为内核态空间,存放内核访问的代码和数据,用户态进程不能直接访问。当用户进程通 过中断或系统调用访问内核态空间时,会触发X86的特权级转换(从特权级3切换到特权级 0),即从用户态切换到内核态。