大数据搜索挖掘实验室 (wSMS@BIT) 第二章 微处理器管理模式 张华平 副教授 博士 Email: kevinzhang@bit.edu.cn Website: http://www.nlpir.org/ @ICTCLAS张华平博士 大数据搜索挖掘实验室 (wSMS@BIT)
2.1 微处理器基本结构 Intel 80x86系列,从4位计算机发展到32位计算机,微处理器内部结构虽然有些变化,但是大同小异。
80386微处理器基本结构
1、总线接口部件(Bus Interface Unit,BIU):与外部环境联系,包括从存储器中预取指令、读写数据,从I/O端口读写数据,以及其他的控制功能。 2、中央处理部件(Central Process Unit,CPU): 指令部件:完成指令预取和指令译码。 执行部件:执行从已译码指令队列中取出的指令。 3、存储管理部件(MMU): 分段部件:实现段式存储管理。 分页部件:实现保护模式下的分页模型。
2.2 CPU工作模式 从80386开始,Intel的32位CPU具有三种运行模式: 实模式 保护模式 虚拟8086模式 通常所说的保护模式是指80386处理器及以后的处理器所实现的运行模式。
实模式(Real mode) 特点: 1、兼容8086,寻址机制、中断处理机制均和8086相同。 2、只使用低20位地址线,寻址空间为220 = 1MB地址空间。 3、采用分段式内存管理,物理地址形成为16位“段首址:偏移”。段最大为216 = 64KB。 4、32位CPU加电或者复位后处于实模式。 中断处理机制见第七章 系统初始化和引导程序都在实模式下运行,是进入保护模式的准备模式。 32位地址总线中只有低20位有效,地址范围00000H~0FFFFFH,使用1MB的内存储器;采用8086的寻址方式来寻址。 故一般称1MB以内的内存称为常规内存(兼容8086的),以上的称为扩展内存。
1、初始化程序区:FFFF0H~FFFFFH,存放进入ROM引导程序的一条跳转指令。 5、不支持硬件上的多任务切换。 6、不支持特权级。 实模式下,存储器保留两个专用区: 1、初始化程序区:FFFF0H~FFFFFH,存放进入ROM引导程序的一条跳转指令。 2、中断向量表区:00000H~003FFH,在这1K字节的存储空间中存放256个中断服务程序的入口地址,每个入口地址占4个字节,这与8086的情形相同。 1MB寻址空间都是用户可访问。 在实模式下对一系列的寄存器进行设置,就可以进入保护模式。 不支持硬件上的多任务切换. 不支持特权级,可以执行所有特权指令。 DOS操作系统运行于实模式下,而Windows/Linux操作系统运行于保护模式下。
保护模式 特点: 1、支持多任务和特权级 。 2、支持内存分页机制,提供段式和页式内存管理功能。 重点 特点: 1、支持多任务和特权级 。 2、支持内存分页机制,提供段式和页式内存管理功能。 3、物理寻址空间高达232 = 4GB(80386/80486)或236 = 64GB(Pentium及以上CPU)。 从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。 保护实现任务之间和任务内的保护。
4、引入虚拟存储器的概念,以扩充编程者所使用的地址空间,段内偏移地址32位,每个段最大232B=4GB,每个程序最多可以使用16K个段,理论上的虚拟地址空间为4GB×16K=64TB。 5、提供了一系列的保护机制,如任务地址空间的隔离,设置特权级,设置特权指令,进行访问权限(如只读、只执行)及段限检查等。
虚拟8086模式 特点: 1、兼容8086程序,又称“V86模式”。 2、V86模式以任务的形式在保护模式上执行。操作系统中有专门的V86管理程序。 3、采用模拟的方法实现特权指令。 既有保护功能又能执行8086代码的工作模式。
CPU的3种运行模式以及切换 Reset复位 实模式 中断或异常 保护模式 V86模式 CPU的3种运行模式及其切换 IRETD指令、 修改CR0 LMSW指令、 中断或异常 IRETD指令、 任务转换 LMSW: Load Machine Status Word 置处理器状态字。但是只有操作数的低4位被存入CR0,只有PE,MP,EM和TS被改写,CR0其他位不受影响。 从实模式切换到保护模式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。 设置CR0的PE位和PG位为0可使系统进入实模式。CR0寄存器PE位置1,可以进入保护模式。P257 PE:指定是保护模式or实模式:0实模式 PG:指定是否允许分页,0:不分页。 CPU的3种运行模式及其切换
64位CPU的工作模式 Intel的EM64T技术中包含: 1、IA-32 传统的模式(Legacy Mode),本质上的32位x86时代的IA-32模式。 2、IA-32e 兼容模式 允许64位操作系统运行基于32位和16位代码的程序。 64位模式 EM64T技术中最为高效的模式。要求纯64位环境的支持,包括64位操作系统和64位应用程序。
2.3 寄存器 对于编程人员来说,微处理器内部的寄存器可以分为两大类:程序可见的寄存器和程序不可见的寄存器。 本课程主要介绍Intel 8086~Core2微处理器内部寄存器的功能和用途。
Intel 8086~Core2(包括64位扩展)的程序设计模型 EBX:extended base index。 RBX:I think it's just R for "register", since there are additional registers R8 - R15 on x86-64, and R is a common prefix on many CPU architectures where registers are numbered. Intel 8086~Core2(包括64位扩展)的程序设计模型
Intel 8086~Core2的程序设计模型 8086,8088和80286使用16位寄存器模型。 其中AX、BX、CX和DX包含两个8位寄存器。 80386~Core2使用6个16位的寄存器(CS,DS,SS,ES,FS和GS)和其他32位的寄存器。 Pentium 4和Core2使用16位的段寄存器以及其他64位寄存器,并且在64位扩展允许的情况下,新增R8~R15寄存器。 EBX:extended base index。 RBX:I think it's just R for "register", since there are additional registers R8 - R15 on x86-64, and R is a common prefix on many CPU architectures where registers are numbered.
寄存器 8位寄存器 16位寄存器AX,BX,CX和DX包含两个8位寄存器,可以通过命名访问,赋值时只影响部分值。 AH AL BX BH BL CX CH CL DX DH DL 例如:假定初始AX = 2016H,则AH=20H,AL=16H。 若执行指令MOV AL, 0 执行指令后AX= 2000H
寄存器 16位寄存器 AX,BX,CX,DX,BP,SI,DI,SP IP,FLAGS CS,DS,ES,SS,FS,GS
寄存器 32位寄存器 EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP EIP,EFLAGS 注意:EAX,EBX,ECX和EDX的低16位分别对应AX,BX,CX和DX。32位寄存器只用于80386以上微处理器。
寄存器 64位寄存器 RAX,RBX,RCX,RDX,SRI,RDI,RBP,RSP RIP,RFLAGS R8,R9,R10,R11,R12,R13,R14,R15 注意:R8~R15只用于64位扩展允许情况下,可以按照字节(8位)、字(16位)、双字(32位)或者四字(64位)方式寻址。
表3-2 R8~R15寄存器访问控制字 注意:8位部分是寄存器最右边的8位。 第8位~第15位不能按照一个字节直接寻址。 寄存器大小 控制字 访问位数 示例 8位 B 7~0 MOV R9B, R10B 16位 W 15~0 MOV R10W, AX 32位 D 31~0 MOV R14D, R15D 64位 —— 63~0 MOV R13, R12
表 3‑1 通用寄存器功能 寄存器 常用功能 64位 32位 16位 8位 RAX 累加器,乘法、除法运算等指令的专用寄存器。 EAX AX AH,AL RBX 保存数据,可用作基址寄存器。 EBX BX BH,BL RCX 保存数据,计数值,80386以上CPU也可用于访问存储器的偏移地址。 ECX CX CH,CL
保存数据,乘法、除法运算指令的专用寄存器,80386以上CPU也可用于访问存储器的偏移地址。 表 3‑1 通用寄存器功能(续) RDX 保存数据,乘法、除法运算指令的专用寄存器,80386以上CPU也可用于访问存储器的偏移地址。 EDX DX DH,DL RBP 保存访问存储单元时的偏移地址。 EBP BP 无 RDI 用于寻址串指令的目的操作数。 EDI DI RSI 用于寻址串指令的源的操作数。 ESI SI
专用寄存器 RIP(指令指针) 指令指针,指向程序的下一条指令。当微处理器为8086/8088,80286或者工作在实模式下时,这个寄存器取16位IP;80386以及更高型号的微处理,工作于保护模式下时这个寄存器取32位EIP。 RSP(堆栈指针) 堆栈指针,指向栈顶满单元。这个寄存器作为16位寄存器时使用SP;作为32位寄存器时,使用ESP。 注意:程序员不能对RIP/EIP/IP进行直接存取操作。程序中的转移指令、返回指令以及中断处理能对RIP/EIP /IP进行操作。
RFlags(标志寄存器) RFlags:用于指示微处理器的状态并控制它的操作。向上兼容,8086~80286使用16位Flags;80386以及以上32位微处理器使用EFlags;64位微处理器使用RFlags。
标志寄存器中有效位含义 D0: 进位标志CF(Carry Flag):当结果的最高位(字节操作时的第7位或字操作时的第15位)产生一个进位或借位,CF=1,否则CF=0。在移位或循环移位指令中,会把操作数的最高位(左移时)或最低位(右移时)移入CF中。 D2:奇偶标志PF(Parity Flags):Intel微处理器中采用奇校验,当执行结果的低8位中二进制形式1的个数为奇数时,PF为0;否则为1。
D4:辅助进位标志AF(Auxiliary Carry Flag):在字节操作时若低半字节(一个字节的低4位)向高半字节有进位或借位;在字操作时若低位字节向高位字节有进位或借位,则AF=1,否则AF=0。这个标志用于十进制算术运算指令中,即通过二进制数运算调整为十进制数表示的结果。 D6:零标志(Zero Flag):当运算结果为零时,ZF为1;否则为0。
D7:符号标志SF(Sign Flag):它与运算结果的最高位相同。对字节操作(8位运算)来说,是结果的第7位;对字操作(16位运算)来说,是结果的第15位。当SF=0时,结果为正数或0;当SF=1时,结果为负数。 D8:单步标志TF(Trap Enable Flag):当TF=1时,CPU进入单步方式,在每条指令执行以后产生一个内部中断(单步中断)。当TF=0时,CPU执行指令后不产生单步中断。
D9:中断允许标志(Interrupt Enable Flag):当IF=1时,允许CPU接收外部中断请求,否则屏蔽外部中断请求。 D10:方向标志DF(Direction Flag):在字符串操作指令中,当DF=0时,串操作为自动增址;当DF=1时,串操作为自动减址。STD指令置位DF,CLD指令清除DF。 D11:溢出标志OF(Overflow Flag):有符号数运算时,当其运算结果超出了表达的范围时,OF=1,否则OF=0。
状态标志寄存器举例: 0101 0100 0011 1001 + 0100 0101 0110 1010 运算后 CF PF OF AF ZF SF 1001 1001 1010 0011 CF=0 PF=1 OF=1 AF=1 ZF=0 SF=1
80386新增的四个标志 D13 D12:I/O特权级IOPL占2位,取值为0、1、2、3对应四个特权级。只有特权级高于IOPL的程序才能够执行I/O指令,否则会产生异常13,并将任务挂起。 D14:NT(Nest Task):嵌套任务位,此位只用于保护模式,如果保护模式下当前的任务嵌套在其他任务中,此位为1,否则为0。
D15:RF(Resume Flag):与程序调试有关的一个控制位,在程序调试时使用。 D17:VM(Virtual 8086 Mode Flag):V86模式位,=1时,表示当前CPU正工作在V86模式下;=0,表示当前CPU工作在实模式或保护模式下。VM位只能在保护方式中由IRET指令置位(如果当前特权级为0),以及在任意特权级上通过任务切换而置位。
Pentium新增的四个标志 D18:AC(Alignment Check):地址对齐检查位,当寻址一个字或者双字时,当地址不在字或者双字的边界上,此时AC=1,否则AC=0。80486以上微处理器支持这个标志。 D19:VIF(Virtual Interrupt):虚拟中断标志,与VIP一起使用,在虚拟方式下提供中断允许标志位IF的副本(copy)。只有Pentium~Pentium 4处理器才有。
D21:ID(Identification)微处理器标识标志,用来指示Pentium~Pentium 4处理器,支持CPUID指令。 D20:VIP(Virtual Interrupt Pending):虚拟中断挂起标志,为Pentium~Pentium 4处理器提供有关虚拟模式中断的信息,它用于多任务环境下,为操作系统提供虚拟中断标志和中断挂起信息。 D21:ID(Identification)微处理器标识标志,用来指示Pentium~Pentium 4处理器,支持CPUID指令。 CPUID指令是Intel IA32架构下获得CPU信息的汇编指令,可以得到CPU类型,型号,制造商信息,商标信息,序列号,缓存等一系列CPU相关的东西。
段寄存器 16位微处理器4个16位段寄存器: CS, DS, SS, ES 32位和64位微处理器6个16位段寄存器:CS, DS, SS, ES, FS, GS 段寄存器用来和微处理器中的其他寄存器组合生成存储器地址,其功能在不同模式下不同。
不同模式下的段寄存器含义 在实模式和V86模式下,兼容16位CPU,段寄存器内保存的是20位段首址的高16位,段首址的低4位为0。 在保护模式下,段寄存器中的16位内容是一个段选择符(selector),用于在段描述符表(GDT或LDT)中选择段描述符。每个段描述符含8个字节。通过这个描述符中的段基址再加上偏移地址,就组成了线性地址。
CS:Code Segment,代码段寄存器 代码段是存放代码(程序,包括过程)的一段存储区。 在实地址方式下,定义了一段64KB存储区的起始地址。 在保护方式下,用来检索一个描述符,该描述符用来描述一个代码段的若干特性——起始地址、段限以及访问权等。 最大段限在8086及80286中为216=64KB,而在80386及其以上的32位微处理器中则为232=4GB。64位模式下,代码段寄存器仍用于平展模式,但用法不同。
DS:Data Segment,数据段寄存器 数据段存放供程序使用的数据的一段存储区 数据段中的数据按其给定的偏移地址值offset(或称有效地址EA,Effective Address)来访问。 数据段的长度规定同代码段。 64位平展模式中不用。
SS:Stack Segment,堆栈段寄存器 堆栈段是一段用作堆栈的存储区。 堆栈段现行的入口地址由堆栈指针RSP(或ESP、SP)决定。 RBP(或EBP、SP)也可寻址堆栈段中的数据。 ES:Extra Segment,附加段寄存器 附加段是一段附加的数据段,通常供串操作类指令用于存放目的串数据。 FS、GS 80386以上的微处理器(含80386)有两个新增的附加的段存储区。Windows将这些段寄存器用于内部操作没有说明其使用方法。
80386以后新增的寄存器 1、控制寄存器 2、调试和测试寄存器 3、全局描述符表寄存器 4、中断描述符表寄存器 5、局部描述符表寄存器 6、任务寄存器 注:其他更高级的处理器与80386微处理器本质上相同。
80386微处理器的控制寄存器结构 CRx 31 30 ~12 11~5 CR0 PG CR1 保留未用 CR2 页故障线性地址 CR3 4 3 2 1 CR0 PG 0000000000000000000 0000000 ET TS EM MP PE CR1 保留未用 CR2 页故障线性地址 CR3 页目录基址 000000000000
CR0内容机器状态字的含义 PE(Protection Mode Enable):保护模式允许标志。=0为实模式,CPU复位(启动)时自动进入实模式;=1为保护模式。可以通过软件设置PE进入或退出保护模式。 MP(Monitor Coprocessor Extension):运算协处理器存在位。=1表示系统中有协处理器。
EM(Emulate Processor Extension):仿真位。=1时,可以利用7号中断,用软件来仿真协处理器的功能;=0时用硬件控制浮点指令。 TS(Task Switched):任务切换标志。=1时表明任务已经切换,在保护模式下,TR的内容改变将自动设置此位为1。 ET(Extension Type):协处理器选择标志;80386以后的系统中ET位被置为1表示系统中存在协处理器。 PG(Paging Enable):分页标志。=1时,存储器管理单元允许分页。=0时,分页功能被关闭,此时CR2和CR3寄存器无效。
CR2:页面故障线性地址寄存器(Page Fault Linear Address Register),用于发生页异常时报告出错信息。 CR3:页目录基址寄存器PDBR(Page Descriptor Base Register),它的高20位用于保存页目录表的起始物理地址的高20位。
调试和测试寄存器 80386提供8个32位的调试寄存器和8个32位的测试寄存器。 调试寄存器在为调试软件错误提供硬件支持。 测试寄存器用户可见的只有TR6、TR7。它们用来测试转换后备缓冲区(Translation Look-aside Buffer,TLB)。
全局描述符表寄存器GDTR GDTR (Global Descriptor Table Register)为48位寄存器。 低16位限长+1=全局描述符表的字节大小。 47 16 15 0 GDTR 基址 限长 GDTR是48位的寄存器。低16位是限长,给出全局描述符表(GDT)的字节大小(其值比GDT的长度少1); 80286没有FS和GS,以及相应的Cache。 80286的基地址为24位,界限为16位,访问权限8位。 80386~Pentium Pro的基地址32位、界限20位、访问权限12位。
GDTR指出GDT在存储器中的位置 1 全局描 述符表 GDT 最大: 64k bytes 8K项 基址 限长 47 16 15 8190 1 全局描 述符表 GDT 最大: 64k bytes 8K项 基址 限长 47 16 15 8190 全局描述符表寄存器) 8191 GDTR中的32位基址是线性 地址,经过分页部件转换为物理地址。
全局描述符表GDT 全局描述符表是一种共享系统资源,通常包含操作系统所使用的代码段、数据段和堆栈段的描述符,也包含多种特殊描述符,如LDT描述符。该存储区域可以被所有任务访问,在任务切换时,并不切换GDT。 每个GDT最多含有8192个描述符(8192×8=64KB)。GDT可以在内存的任意位置,用LGDT把描述符表的起始位置装入GDTR。 GDT可以在内存的任意位置,用LGDT把描述符表的起始位置装入GDTR。
例3-1 已知GDTR=0E003F0003FFH,则全局描述符表的基址是多少?这个全局描述符表有多大,里面有多少个描述符? 解答: GDT的地址为0E003F00H, 长度为3FFH+1=400H。 可容纳400H/8=80H个段描述符。
中断描述符表寄存器IDTR IDTR (Interrupt Descriptor Table Register),是48位的寄存器。其最低16位是限长,给出中断描述符表IDT的字节大小(即限长+1);其高32位是基址,指出IDT在物理存储器中存放的基地址。 基址 限长 47 16 15 0 IDTR 同GDTR一样,中断描述符表寄存器IDTR也在存储器中定义了一个表,该表称为中断描述符表IDT。IDT中保存的不是段描述符,而是中断门描述符。每个门描述符也包含8字节,IDT最多包含256个门描述符,因为CPU最多支持256个中断。中断门指出的是中断服务程序的入口。
中断描述符表IDT IDT中保存的是中断门描述符。每个门描述符包含8字节,IDT最多包含256个门描述符,因为CPU最多支持256个中断。 保护模式下的中断描述符表的功能,类似于实模式下的中断向量表。但IDT的位置可变,由相应的描述符说明,而实模式下的中断向量表的地址是固定的,必须在物理地址00000H处。 IDT最大长度是2KB. IDT功能类似于实模式下的中断向量表,不过IDT位置可变由IDTR给出,实模式下固定在00000H 1k空间处。 IDT和GDT必须在进入保护模式之前装入
例题3-2 已知IDTR=0E003F40007FFH,求IDT的地址和长度。这个IDT中有多少个中断门描述符? 则IDT的地址为0E003F400H, 长度为7FFH+1=800H。 其中可容纳800H/8=100H个中断门描述符。 注意:GDTR和IDTR的值必须在进入保护模式之前装入。在实模式下,可以执行LGDT和LIDT指令设置GDTR和IDTR。
局部描述符表LDT LDT(Local Descriptor Table Register)定义的是某项任务用到的局部存储器地址空间。 多任务环境下由于每项任务都有自己的LDT(且每项任务最多只能有一个LDT),因此保护模式下可以有多个LDT。 LDT由LDTR(局部描述符表寄存器)确定。LDTR为16位的选择符。 多任务环境下每个任务都有一个LDTR。。
LDTR寄存器确定LDT的位置和限长的过程 ① ② ③ ④ ⑤ LDTR GDTR LDT GDT ①和②步由GDTR确定了GDT表在存储器中的位置和限长。LDTR中是一个选择符,它包含了LDT描述符在GDT中的索引。③步是依据LDTR在GDT中取出LDT描述符的过程。在LDT描述符中,包含由LDT的位置和限长,即④和⑤步。
假定LDT的基址为00120000H,GDT基址为00100000H。如果装入CS寄存器的选择符为1007H,那么请求特权级是多少?段描述符地址是多少?描述符在GDT还是LDT里面获得?
(CS)=0001000000000111b 最右边两位为1则RPL=3 TI=1表示段描述符在LDT中。 偏移量为高13位乘以8得到相对于表基址的偏移量。 偏移量=0001000000000b × 8=512 × 8=4096=1000H 段描述符地址为00120000H+1000H=00121000H
任务寄存器TR 任务寄存器TR (Task Register),在保护模式的任务切换机制中使用,TR中内容为16位选择符。 TR的作用是选中TSS描述符。每一个任务都有一个任务状态段TSS,由TSS描述符描述。从GDT中检索出TSS描述符后,微处理器自动将TSS描述符装入TSS Cache中。 TR的初值由软件装入,当执行任务切换指令时TR的内容自动修改。 TSS一定在GDT中
例题 3‑3 假定全局描述符表的基址为00011000H,TR为2108H,问TSS描述符的起始范围是多少? 解答:TSS起始地址=00011000H+2108H=00013108H 由于描述符为8字节,故TSS终止位置为00013108H+7H=0001310FH
由TR取得TSS的过程
选择符格式 Index TI RPL 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 选择符 RPL(Requestor Privilege Level): 请求特权级,2位二进制数字,范围为0~3。00代表特权级0,01代表特权级1,10代表特权级2,11代表特权级3。 请求特权级是将要访问的段的特权级。 TI(Table Indicator):表指示符。为0时,从GDT中选择描述符;为1时,从LDT中选择描述符。 Index:索引。指出要访问描述符在段描述符表中的顺序号,Index占13位。因此,顺序号的范围是0~8191。每个段描述符表(GDT或LDT)中最多有8192=213个描述符。 LDT面向任务,因此不需要直接指出位置和大小。
由选择符确定一个描述符
已知DS=0023H,问该数据段的请求特权级和索引值。 解答 DS =0000 0000 0010 0011b, 故:Index=0 0000 0000 0100b=4,TI=0,RPL=11b=3。 因此请求特权级为3,索引值为4。
2.4 内存管理---存储器分段管理 IBM PC机的存储器采用分段管理的方法。存储器采用分段管理后,一个内存单元地址要用段基地址和偏移量两个逻辑地址来描述,表示为段基址:偏移量,其段基址和偏移量的限定、物理地址的形成视CPU工作模式决定。 63
内存管理---实模式存储器寻址[1] 3种工作模式 实模式:微处理器只可以寻址最低的1M字节。 保护模式:寻址4GB 虚拟86模式:寻址类似于8086 64
2.4.1 实模式分段管理 对段基址的限定: 只要工作在实模式,段基址必须定位在地址为16的整数倍上,这种段起始边界通常称做节或小段。 对段长的限定: 在实模式下段长不能超过64K。 65
2.4.1 实模式分段管理 存储器采用分段管理后,其物理地址的计算方法为: 10H×段基址+偏移量 简便的计算方法:因为段基址和偏移量一般用十六进制数表示,直接在段基址的最低位补以0H,再加上偏移量。 66
例.某内存单元的地址用十六进制数表示为1234:5678,则其物理地址为 12340H+5678H=179B8H。 实模式存储器寻址示例 例.某内存单元的地址用十六进制数表示为1234:5678,则其物理地址为 12340H+5678H=179B8H。 67
1 2 3 4 0 (16H×段基址) + 5 6 7 8 (偏移量) 1 7 9 B 8 (物理地址) 图2-5 物理地址的形成 68
程序执行时,其当前段的段基址放在相应的段寄存器中,偏移量视访问内存的操作类型决定,其规律如下页表所示。 实模式寻址约定规则 程序执行时,其当前段的段基址放在相应的段寄存器中,偏移量视访问内存的操作类型决定,其规律如下页表所示。 69
操作类型 约定段 寄存器 偏移量 CS 无 IP SS SP DS ES、SS、CS EA SI ES DI DS、ES、CS 约定段 寄存器 允许指定的段寄存器 偏移量 1. 指令 CS 无 IP 2. 堆栈操作 SS SP 3. 普通变量 DS ES、SS、CS EA 4. 字符串指令 的源串地址 SI 5. 字符串指令 的目标串地址 ES DI 6.BP用作基址 寄存器 DS、ES、CS 70
2.4.2 保护模式下分段管理 在保护模式下,其内存管理既可以使用分段机制访问多达4 GB(386/486)或64 GB(Pentium)的内存空间,也可以使用分页机制访问多达16 TB的虚拟存储器。总之,保护模式打破了实模式只允许访问装在内存第一个1 MB之内的程序和数据的限制。 71
描述符 描述符是用以管理64TB虚拟存储地址空间分段的基本元素。一个描述符对应虚拟地址空间中的一个存储段。 描述符包括段描述符、系统段描述符、局部描述符、调用门描述符、任务状态段描述符,以及任务门描述符等。
段描述符 段描述符用于描述代码段、数据段和堆栈段。 段描述符位于GDT或LDT中,占8字节,由以下几个部分组成:段基址(32位)、限长(20位)、访问权限(8位)和属性(4位)。
段描述符 D7 D0 段界限 7~0 段界限 15~8 基址 7~0 基址 15~8 基址 23~16 基址 31~24 TYPE S AVL DPL P G D/B 段界限 19~16 1 2 3 4 5 6 7
非系统段(代码段、数据段、堆栈段)的格式: 段描述符第5字节访问权限, 非系统段(代码段、数据段、堆栈段)的格式: A W R ED C E=0 E=1 S=1 DPL P D7 D0 存在位 1:装入内存 0:不在内存 特权位 S=1是非系统段:数据段或者代码段 S=0是系统段描述符 代码段标志 数据段或者堆栈段标志 一致位 0:非一致 1:一致 可读位 访问位 扩展方向位 1:向下扩展 0:向上扩展 可写位 P=1时表示装入内存,=0表示,不在内存,访问不在内存的段时会引起异常。OS将某个段从内存交换到磁盘时,设置此位为0。当启用页功能的情况下,即使P=1,所描述的段也不一定在物理存储中。P=1,a=0表示在存储器中,没有被访问,可以被替换。 S=1 E=0时为数据段,S=1,E=1时为代码段 扩展方向位:1:高地址向低地址扩展,偏移量大于段长。0:低地址向高地址扩展,偏移量小于段长,段长指上限。 根据段类型中的段扩展方向标志E,处理器以两种不同方式使用段限长Limit。对于向上扩展的段(简称上扩段),逻辑地址中的偏移值范围可以从0到段限长 值Limit。大于段限长Limit的偏移值将产生一般保护性异常。对于向下扩展的段(简称下扩段),段限长Limit的含义相反。根据默认栈指针大小标 志B的设置,偏移值范围可从段限长Limit到0xFFFFFFFF或0xFFFF。而小于段限长Limit的偏移值将产生一般保护性异常。对于下扩段, 减小段限长字段中的值会在该段地址空间底部分配新的内存,而不是在顶部分配。80x86的栈总是向下扩展的,因此这种实现方式很适合扩展堆栈。 一致与非一致代码段的设置原则 系统要保证安全,所以内核要和用户程序分开,内核一定要安全,不能被用户程序干涉,有时用户程序需要访问内核数据,于是OS将内核程序开辟一些可以供用户程序访问的段,但是不允许用户程序写入数据。 1、内核不用知道用户程序的数据,内核不用调用用户程序的数据,内核不用转移到用户程序中来 2、用户程序只能访问到内核的某些共享的段,我们称这些段为一致代码段 3、用户程序不能访问内核不共享的段 一致与非一致代码段的访问原则 对于一致代码段: 1、特权级高的程序不允许访问特权级低的数据(CPL>=DPL),即,核心态不允许调用用户态的数据 2、特权级低的程序可以访问到特权级高的数据(如访问内核某些共享的数据段),但特权级CPL不会改变,即,用户态还是用户态 对于非一致代码段: 1、只允许同级访问(CPL=DPL) 2、绝对禁止不同级访问:核心态不使用用户态,用户态也不使用核心态 一致与非一致代码段的判断 一致位:在描述符属性中TYPE(包含4个二进制位)字段的第2位。 当 S=1 时TYPE中的4个二进制位情况: 3 2 1 0 执行位 一致位 读写位 访问位 执行位:置1时表示可执行,置0时表示不可执行; 一致位:置1时表示一致码段,置0时表示非一致码段; 读写位:置1时表示可读可写,置0时表示只读; 访问位:置1时表示已访问,置0时表示未访问。 所以一致代码段和非一致代码段的意思就是指这个一致位是否置1,置1就是一致代码段,置0就为非一致代码段。
段描述符中的第6字节:四位属性 AVL G D/B 段界限 19~16 用户/操作系统可用位 D/B位,系统段不用这位 D7 D0 AVL G D/B 段界限 19~16 用户/操作系统可用位 D/B位,系统段不用这位 粒度位 ,=1以页为单位,=0以字节为单位 D/B位 代码段(D位) D=1 使用32位操作系统和32位寻址方式 D=0 使用16位操作系统和16位寻址方式 数据段(B位) B=1 堆栈使用ESP寄存器,上限为FFFFFFFFH B=0 堆栈使用SP寄存器,上限为FFFFH 以页为单位,限长为20位。1页=4KB,1个段最长为1M*4KB=4GB。以字节为单位,1个段最长为1MB字节。
已知Windows XP中各段寄存器及段描述符的值如下,分析CS对应的段描述符属性。 CS=001B DS=0023 ES=0023 SS=0023 FS=0030 GS=0000 GDTbase=E003F000 Limit=03FF E003F000 00 00 00 00 00 00 00 00-FF FF 00 00 00 9B CF 00 E003F010 FF FF 00 00 00 93 CF 00-FF FF 00 00 00 FB CF 00 E003F020 FF FF 00 00 00 F3 CF 00-AB 20 00 20 04 8B 00 80 E003F030 01 00 00 F0 DF 93 C0 FF-FF 0F 00 00 00 F3 40 00 E003F040 FF FF 00 04 00 F2 00 00-00 00 00 00 00 00 00 00
选择符 类型 段基址 结束地址 DPL 0008 Code32 00000000 FFFFFFFF 0 P RE 0010 Data32 00000000 FFFFFFFF 0 P RW 001B Code32 00000000 FFFFFFFF 3 P RE 0023 Data32 00000000 FFFFFFFF 3 P RW 0028 TSS32 80042000 000020AB 0 P B 0030 Data32 FFDFF000 00001FFF 0 P RW 003B Data32 00000000 00000FFF 3 P RW 0043 Data16 00000400 0000FFFF 3 P RW 0048 Reserved 00000000 00000000 0 NP
FF 11111111B +0 限长(位7-0) FF 11111111B +1 限长(位15-8) 内容 二进制 7 0 FF 11111111B +0 限长(位7-0) FF 11111111B +1 限长(位15-8) 00 00000000B +2 段基址(位7-0) 00 00000000B +3 段基址(位15-8) 00 00000000B +4 段基址(位23-16) FB 11111011B +5 P DPL S TYPE A CF 11001111B +6 G D 0 AVL 限长(位19-16) 00 00000000B +7 段基址(位31-24)
分析CS段描述符得: 段基址(位31~0)=00000000H 限长(位19~0)=FFFFFH G=1,限长是以页为单位的,段的大小为(FFFFFH+1)×212=100000H×212=232=4GB。段的基址为00000000H,长度为4GB,其线性地址范围为00000000H~FFFFFFFFH。
其他的各个位解释如下: D=1,因此这是一个32位的段。 AVL=0。 P=1,这个段在内存中。 DPL=112=316,段的特权级为3。 S=1,这不是一个系统段,而是一个代码、数据段或堆栈段。 E=1,这是一个代码段(可执行)。 C=0,这不是一个一致代码段。因为E=1,这一位是C;若E=0,这一位代表ED。 R=1,可以对这个段进行读操作。因为E=1,这一位是R;若E=0,这一位代表W。
段描述符高速缓存 为了提高CPU的运行效率在CPU内部设置了段描述高速缓存,这些缓存不可见,自动装入段描述符。段描述符高速缓冲的内容和6个段描述符寄存器索引的描述符当前值保持一致。用户不可见。 在内存读写操作中,CPU首先要计算线性地址,这就需要取得段描述符中的基地址,再加上偏移量。接下来,CPU还需要根据段描述符中的属性来确定操作的合法性。 例如,程序要向一个只读段写入数据,CPU不能执行这个写入操作,而且要产生一个异常。另外,如果指定的内存操作数偏移量超过了段限长所规定的范围,也要产生一个异常。因此,在读写内存单元时,CPU需要检查段描述符的内容是否和当前操作相一致。如果每一次都需要到内存中去读取段描述符,那么CPU的运行效率就会极大地降低。为解决这个问题,CPU在内部设置了段描述符高速缓存。
32位CPU系统中三者的转换 CPU的分段部件将虚拟地址转换为线性地址。
2.4.3 页式内存管理 保护模式下的CPU支持分页机制,并且分页管理是在分段管理机制的基础上工作,它将分段管理机制得到的线性地址转换为物理地址。 使用分页机制的好处在于,它可以把每个活动任务当前所必需的少量页面放在内存中,而不必将整个段调入内存,从而提高了内存的使用效率。 CR0控制寄存器中的pg位=1,CR3页目录基址,CR2页故障线性地址
分页 每一个任务都有它自己的线性地址空间。分页管理时所有页的长度固定,页与页之间也没有重叠。 假定页面大小为4KB,则32位CPU将4GB的线性地址空间划分成220页。固定长度的页可能会产生碎片,会浪费一些内存空间。
分页机制下线性地址转换为物理地址的过程 分页机制就是一种将线性地址的页面映射到物理地址页面的手段,也就是从线性地址到物理地址的转换过程。分页机制中用到了两个表:页表目录表和页表。
其中第1项是对页目录(Page Directory)的索引,第2项是对页表(Page Tables)的索引,第3项是线性地址在页面内的偏移。 32位线性地址被划分为3个部分: 页目录索引 页表索引 字节索引 其中第1项是对页目录(Page Directory)的索引,第2项是对页表(Page Tables)的索引,第3项是线性地址在页面内的偏移。 10位 10位 12位
线性地址转换为物理地址的过程 Linear Address从何而来? ①页目录的地址由CR3的最高20位决定,CR3又被称做页目录基址寄存器PDBR(Page Descriptor Base Register),CR3的低12位=000H。页目录的大小为4KB,由1024个页表描述符组成,每个页表描述符占4个字节。 ②线性地址中高10位为页目录索引,页目录基地址加上页目录索引乘以4获得的地址指向页目录表中一个页表描述符。 ③页表描述符的高20位给出了页表的基地址。页表同样占4KB,由1024个页描述符组成,每个页描述符占4字节。 ④线性地址中的页表索引(10位),指示了被访问的页在页表中的序号。根据页表基地址加上10位页表索引乘以4指向页表中的一个页描述符。 ⑤页描述符的高20位给出了物理页面的基地址的高位20位。 ⑥物理页面的基地址再加上线性地址中12位字节的页内偏移量,便得到物理地址。 Linear Address从何而来?
页表项 页表项就是在分页转换时用到的页表描述符和页描述符,都是32位,页表项格式如图。 针对应用程序 0:读 1:可读写 存在位. 1:存在 0:不存在 高20位基地址 AVL D A R/W U/S P 31 12 11 10 9 8 7 6 5 4 3 2 1 0 访问p=0的页产生缺页异常,线性地址被保存在CR2中. 3位,由操作系统使用 访问标志 1:访问过 0:没有访问过 0:管理员模式 1:用户模式 1:有写操作 0:没有写操作 只用于页描述符
页目录、页表和物理页的基地址的低12位全部为0,定位在页的边界上。 页表项的低12位提供保护功能和统计信息。U/S位、R/W位、P位实现页保护机制,p32。 一个物理页存在两级保护,页表描述符和页描述符属性。当二者不一致的时候取严格属性。 页表描述符的高20位就是页表基地址的高20位;页描述符的高20位就是物理页基地址的高20位。也就是说,对于页表项中的20位基址,如果页表项在页表描述符中,那么指出的是页表的高20位基地址,页表的低12位基地址始终为0;如果页表项在页描述符中,那么指出的就或是物理页的高20位基地址,物理页的低12位基地址始终为0。 举例p33
片内转换检测缓冲器TLB 每次内存操作都需要将线性地址转换为物理地址,转换过程中需要访问页目录表和页表来取得页表描述符和页描述符。为了提高转换效率,CPU内部设置了片内转换检测缓冲器TLB(Translation Lookaside Buffer),其中保存了32个页描述符,它们都是最近使用过的。 程序时间局部性.98%以上操作都靠它完成.
线性地址转换为物理地址示例P55
2.5任务 完成某项功能的多个程序的集合称为任务,系统中至少存在一个任务。 当运行一个应用程序后,操作系统就为这个程序创建一个任务。每个任务都由两个部分组成: 任务执行环境(Task Executation Space) 任务状态段TSS(Task State Segment)。
任务执行环境 任务执行环境包括一个代码段、堆栈段和数据段等,任务在每一个特权级上执行时都有一个堆栈段。
任务状态段TSS 在多任务环境下,每个任务都有属于自己的任务状态段TSS,TSS中包含启动任务所必需的信息,如用户可访问的寄存器等 。 任务状态段TSS在存储器的基地址和限长由TSS描述符指出。 TSS描述符必须放在全局描述符表GDT中,TR内容为选择符,它指出TSS描述符在GDT中的位置。TSS描述符说明各TSS的位置和限长。
TSS描述符格式 7 +0 限长(位7~0) +1 限长(位15~8) +2 段基址(位7~0) +3 段基址(位15~8) +4 +0 限长(位7~0) +1 限长(位15~8) +2 段基址(位7~0) +3 段基址(位15~8) +4 段基址(位23~16) +5 P DPL S=0 1 B +6 G AVL 限长(位19~16) +7 段基址(位31~24) B=0表示386的可用的任务状态段 B=1表示386的忙碌任务状态段
TSS基本格式 链接字段 内层堆栈指针区域 寄存器保存区域 TSS的作用,以及各段分析。 地址映射寄存器区域 I/O许可位图
门 门(Gate)可以看做是一种转换机构,可以实现不同特权级别之间的控制传送。 门的类型有4种: 调用门:用于控制传送,来改变任务或程序的特权级别。 任务门:执行任务切换。 中断门和陷阱门:用来指出中断服务程序的入口地址。 除存储段描述符和系统段描述符外,还有一类门描述符。门描述符并不描述某种内存段,而是描述控制转移的入口点。这种描述符好比一个同向另一代码段的门。通过这种门,可实现任务内特权级的变换和任务间的切换。所以,这种门描述符也称为控制门。 中断门和陷阱门放到中断系统章节讲,本章只讨论前两种。
门描述符 门描述符描述控制转移的入口点,属于系统描述符。 系统描述符中,S位设置为0,而段描述符中S位为1,以此来区分系统描述符和段描述符。
调用门 1、系统描述符类型为4或者C时表示调用门。 2、调用门描述某个子程序的入口。调用门内的选择符必须实现代码段描述符,调用门内的偏移是对应代码段内的偏移。 3、利用段间调用指令CALL,通过调用门可实现任务内从低特权级变换到高特权级。 4、如果在利用调用门调用子程序时引起特权级的转换和堆栈的改变,那么就需要将低特权级堆栈中的参数复制到高特权级堆栈。复制的参数个数由调用门描述符中的参数计数值给出。
通过调用门进行段间调用 这里Y值没有用到。 调用指令“CALL X:Y”指令中虚拟地址X:Y,其中X是一个选择符,由它指向了一个调用门描述符(第①步),而Y的值不起作用。调用门描述符中的选择符指向了一个段描述符(第②步),段描述符指出了被调用段的段基址(第③步),而入口点的偏移量就是门描述符中的偏移量(第④步),决定了调用哪一个代码段以及子程序在代码段中的偏移。这种形式的CALL指令可以通过调用门转移到更高的特权级,在更高的特权级下执行所调用的子程序,子程序执行完毕后,由RET指令返回CALL指令所在的较低级别的程序。 这里Y值没有用到。
任务门 任务门指示任务。任务门内的选择子必须指示GDT中的任务状态段TSS描述符,门中的偏移无意义。任务的入口点保存在TSS中。 通过任务门可实现任务切换。
中断门和陷阱门 1、中断门和陷阱门描述中断/异常处理程序的入口点。 2、中断门和陷阱门内的选择符必须指向代码段描述符,门内的偏移就是对应代码段的入口点的偏移。 3、中断门和陷阱门只有在中断描述符表IDT中才有效。 中断门和陷阱门的详细内容将在第7章7.3.1中介绍。
门描述符与段选择符关系 EIP 说明:利用段选择符的bit2确定查询GDT或LDT。 段选择符指向一个段描述符。 偏移 属性 选择符 IDTR IDT 边界 基地址 GDT/LDT 线性地址 中断服务子程序 代码段 EIP 门描述符 段选择符 或TSS选择符 段描述符 说明:利用段选择符的bit2确定查询GDT或LDT。 段选择符指向一个段描述符。 对任务门而言,选择符为TSS选择符。 任务的切换:通过直接改变TR方式, 或通过任务门间接方式实现。
任务切换的四种情况 1、执行远程JMP或者CALL指令,选择了GDT中的TSS描述符。 2、执行远程JMP或者CALL指令,从GDT或者LDT中选择了任务门。 3、发生了中断或异常,中断向量选择了IDT中的任务门。 4、当FLAGs中的NT=1时,执行IRET指令,目的任务选择符在执行IRET任务的TSS链接域中。
任务切换的两种方式 1、直接任务切换 在JMP/CALL X:Y指令中,X是一个段选择符,指向一个可用的TSS描述符。 2、间接任务切换
任务切换过程 如果转移或调用指令将任务状态选择符作为操作数,那么任务进行直接切换。间接切换使用任务门,这是一种将控制传给RPL比CPL高的任务切换方法。 1.直接任务切换 段间跳转指令JMP X:Y或段间调用指令CALL X:Y可以用来执行任务切换。在中断/异常或者执行IRET指令时也可能发生任务切换。 X为16位段选择符,y为32位偏移。 任务切换过程分为直接切换和间接切换两种。直接切换在JMP、Call指令中直接引用TSS选择符,而间接切换则需要使用任务门。 如图8.38下面所示。指令执行时,选择符被装入TR,之后TR指向的TSS描述符被装入缓存。装入前需进行检查:P=1,B=0,DPL<=CPL。由TSS描述符指出新任务的任务状态段TSS,而旧的任务被挂起。这导致EFLAGS中的NT=1(任务嵌套),旧任务的寄存器和状态被保存到旧的TSS中,新任务描述符中B位置1。旧TSS的选择符被保存在新的TSS中,作为任务返回的链接信息。任务切换结束后,MPU将新TSS中提供的CS:EIP作为入口,执行任务。 新任务结束时,执行返回指令,那么返回链接选择符被自动装入TR,从而激活了旧的TSS,实现任务返回。
直接任务切换 先由指令中的X段描述符查全局描述符表,获得TSS描述符;TSS描述符提供新任务状态段的基地址和限长等参数。
访问TSS的规则 TSS段描述符的DPL(DPLTSS)规定了访问该描述符的最低特权级,只有在相同级别或更高级别的程序中才可以访问它,即:DPLTSS≥MAX(CPL, RPL),RPL是X的最后2位。
间接任务切换 当CPL>DPLTSS时,就不能采用任务的直接切换,必须通过任务门进行任务的切换。 JMP和CALL指令中包含的是任务门选择符。选择符指向的是任务门描述符,门中的TSS选择符指向新任务的TSS描述符,激活新的TSS,启动新的任务。 低特权级访问高特权级
间接任务切换
访问任务门规则 任务门的DPL(DPLGATE)规定了访问该任务门的最低特权级,只有在同级或更高级别的程序中才可以访问它。即DPLGATE≥MAX(CPL, RPL),RPL是任务门选择符X的最后2位。
任务A切换到任务B的步骤 把寄存器现场保存到当前任务的TSS(任务A的TSS)。 把指示目标任务(任务B)TSS的选择符装入TR寄存器中,同时把对应TSS的描述符装入TR的高速缓冲寄存器中。 恢复当前任务(任务B)的寄存器现场。只装入选择符,P位为0。 进行链接处理。JMP指令引起的切换不需要链接处理,CALL指令需要。 任务切换前进行特权级检查;是否存在内存和限长检查;更新TR,并保存旧的TSS动态部分;加载TR,使新任务B=1,加载任务中各种寄存器内容,当CR0中TS被置位时表示任务切换完毕。
把CR0中的TS标志置为1,这表示已发生过任务切换。 把TSS中的CS选择符的RPL作为当前任务特权级,设置为CPL。 装载LDTR寄存器。 装载代码段寄存器CS、堆栈段寄存器SS和各数据段寄存器及其高速缓冲寄存器。 注意:任务切换不能递归。
TSS中堆栈指针的使用 只有特权级别发生变化时才切换堆栈。 TSS中包含有指向0级、1级和2级堆栈的指针。 使用CALL指令通过调用门向高特权级转移。 使用RET指令实现向低特权级转移。
在特权级提升时,根据新的特权级使用TSS中相应的堆栈指针对SS及ESP寄存器进行初始化,建立起一个空栈。再把低特权级程序的SS及ESP寄存器的值压入堆栈,以使得相应的返回指令可恢复原来的堆栈。然后,从低特权级堆栈复制以双字为单位的调用参数到高特权级堆栈中,调用门中的CNT字段值决定了参数的个数。这些被复制的参数是主程序通过堆栈传递给子程序的。通过复制栈中的参数,使高特权级的子程序可以访问主程序传递过来的参数。最后,调用的返回地址(低特权级程序的CS及EIP寄存器)被压入堆栈,以便在调用结束时返回。
2.6 保护 主要包含以下三个方面: 数据访问的保护 对程序的保护 对输入输出的保护
数据访问的保护 为段寄存器赋值时的检查 保护模式下程序要访问某一个段时,都要完成类型、限长和特权级三种形式的检查。 1、类型检查:检查段描述符的段类型是否与目标一致,例如装入CS时,段描述符中的E位必须为1,标记为可执行的段;装入DS、SS等寄存器时,E位必须为0;只有可写的数据段选择符才能够被加载到SS寄存器中等。 即对存储器的保护
2、限长、类型和属性检查 除此之外,CPU还进行其他属性检查,如数据访问时,当前段描述符P=1表示在物理存储器中,能正常操作;如果P=0,表示数据不在物理存储器中,CPU会引发一个异常,由操作系统程序进行处理。
CPL是当前正在运行的程序的特权级(CS)。 DPL是描述符特权级,它表明了什么样的特权级程序可以使用这个段。 3、特权级检查 CPU在给段寄存器赋值时,要根据CPL、DPL、RPL来检查特权级是否满足要求:DPL ≥ MAX(CPL, RPL),即程序只能访问特权级相同或者较低的数据。 其中: CPL是当前正在运行的程序的特权级(CS)。 DPL是描述符特权级,它表明了什么样的特权级程序可以使用这个段。 RPL是请求特权级。表明程序将以什么样的特权级来访问这个段。 P45举例
特权级检查示意图 特权级检查,通过特权级检查,处理器能决定是否允许当前程序访问这个段。CPU在加载段选择符入寄存器时检查特权级,主要包括CPL、DPL、RPL。它们的含义如下: CPL(Current Privilege Level)是当前正在运行程序的特权级。CPL是CS段寄存器的最低2位。如CS=001BH,则CPL等于3;CS=0000H,则CPL等于0。在任何时候,CPU总在某一个特权级上运行。 DPL(Descriptor Privilege Level)是描述符特权级,位于段描述符中。它规定了可以访问此段的最低特权级,只有相同级别或更高级别的程序中才可以访问它。 RPL(Requestor Privilege Level)是请求特权级,是要赋给段寄存器的16位数字的最低2位。它表明了程序“要求”以什么样的特权级来访问这个段,RPL一般用来指出一个选择符创建者的特权。如在“MOV DS, AX”的例子中,AX的最低2位就是RPL。如果RPL>CPL,那么当前程序就降级来与RPL匹配。 在给段寄存器赋值时,CPU要根据CPL、DPL、RPL来检查特权级是否满足要求:DPL ≥ MAX(CPL, RPL),即程序只能访问特权级相同或者较低的数据。这里≥和MAX操作都是按照数字的大小来进行的。数字越大,表示特权级越低。
数据段保护示例3-11 如图:数据段D的段描述符中,DPL=2。在特权级3下运行的代码段A中的程序,要想访问数据段D,使用段选择符D1,D1对应数据段D的描述符。D1的RPL=3(程序也可设置其RPL为0、1或2),由于DPL≥MAX(CPL, RPL)的条件不能满足,所以代码段A中的程序不能访问数据段D。而特权级1和2上的代码段B和C则可以访问这个数据段。这里,如果设置段选择符D3的RPL=3,则代码段C也不能访问数据段E。
对程序的保护 CPU还利用特权级实现对程序执行的控制。 根据控制转移方式的不同分为: 直接转移的保护 间接转移的保护
直接转移的保护 1)同一代码段内转移时,只需要检查限长。 2)段间调用或跳转,需要检查限长,特权级CPL和DPL。 CPL>DPL,此时要检查段描述符的C位。如果C位为1,表示这是一致代码段,允许跳转和调用。
代码段D不是一致代码段(C=0),只能由特权级相同的程序来调用或跳转。特权级较高的代码段C和特权级较低的代码段A都不能调用代码段D。C=0时,还要求RPL ≤ CPL。
代码段E是一致代码段(C=1),可以由特权级相同或更低的程序来调用或跳转。特权级较高的代码段C不能调用代码段E。而特权级相同的代码段B和特权级更低的代码段A可以转移到代码段E上,转移后特权级CPL不变。
间接转移的保护 特权检查时要检查以下几个要素: 当前特权级CPL,即JMP或CALL指令所在的程序的特权级; 请求特权级RPL,即选择符X的最低2位; DPLGATE,即门描述符的DPL; DPLCODE,即目标代码段描述符的DPL; CCODE,即目标代码段描述符的C位(目标代码段是否为一致代码段)。
特权检查 CALL指令 满足以下两个条件时,才允许使用调用门: (1) DPLGATE≥MAX(CPL, RPL) (2) DPLCODE≤CPL 如果CCODE为1,则当前特权级不变; 如果CCODE为0,则当前特权级提升为DPLCODE (DPLCODE<CPL)或者维持不变(DPLCODE=CPL)。 DPLCODE≤CPL的条件是防止执行调用门后,当前特权级降低。
特权检查 JMP指令 满足以下两个条件时,才允许使用调用门: (1) DPLGATE≥MAX(CPL, RPL) (2) CCODE为1且DPLCODE≤CPL 或 CCODE为0且DPLCODE=CPL 如果CCODE为1,则当前特权级不变; 如果CCODE为0,则当前特权级也不变(DPLCODE=CPL)。 结论:JMP指令使用调用门不能提升特权级。
间接转移的保护示例 如图3-48CPL=3的代码段A,通过门描述符A的选择符A1转移到代码段E,代码段E的描述符中C位=0,CPL从3提升为0。门描述符B的DPL=2,因此它只允许CPL=2的代码段B和CPL=1的代码段C来使用,CPL=3的代码段A则不能使用门描述符B。可以把门描述符B看做是代码段D的“哨兵”。在进入到代码段D后,由于代码段D的描述符中C位=1,CPL维持不变。
输入输出保护 CPU采用I/O特权级IOPL(I/O Privilege Level)和TSS段中I/O许可位图的方法来控制输入/输出,实现输入/输出保护。 只要满足一下条件之一就可以进行输入输出: CPL≤IOPL时,可以执行I/O敏感指令。 CPL > IOPL时,TSS中IO位图等于0时,也可以执行I/O敏感指令。
基于IOPL的保护 在EFLAGS寄存器中,有2位是输入输出特权级IOPL。CPL≤IOPL时,可以执行I/O敏感指令。
I/O敏感指令 IOPL的敏感指令在实模式下总是可以执行 ;保护模式下CPL=0也可以执行,即限制是针对应用程序的。 操作系统可以为每个任务设置EFLAGS值和独立的TSS,所以每个任务的IOPL和I/O许可位图都可以不同。
I/O许可位图 I/O许可位图中每一位对应一个I/O地址。如果位串中的第n位取值为0,表示I/O地址n就可以由任何特权级的程序访问;取值为1,表示I/O地址n只能由在IOPL特权级或更高特权级运行的程序访问,如果低于IOPL特权级的程序访问许可位为1的I/O地址,那么将引起通用保护异常。
I/O许可位图要点 Intel 80x86系列计算机的I/O地址空间范围是0000H~0FFFFH,所以I/O许可位图的二进制位串最大为8KB。 TSS内偏移66H的字确定I/O许可位图在TSS段中的位置,叫做I/O位图的基址。I/O位图大小=TSS段长度-I/O位图基址。由于I/O许可位图最长可达8KB,所以开始偏移应小于56KB,但必须大于等于104B。 未在I/O位图中说明的I/O地址许可位默认为1,禁止低于IOPL特权级的程序访问这些I/O地址。故 I/O位图的大小设置为0,就表示不允许应用程序访问任何I/O端口。 一个任务实际需要使用的I/O许可位图大小通常要远小于这个数目。 I/O许可位图的大小s等于TSS段的长度减去I/O位图基址,它定义了I/O地址空间0~s×8–1的许可位。
涉及多个I/O地址的处理 例如指令:IN EAX, DX 涉及4个I/O地址,则CPU在检查许可位时,这条指令用到的所有I/O地址的许可位都必须为0,才允许访问;如果其中的任何一个许可位为1,则引起保护异常。
对IOPL位的保护 1、只有在特权级0下执行的程序才可以修改IOPL位及VM位; 2、只有IOPL级或更高的特权级的程序才可以修改IF位。 应用程序能够访问的I/O地址空间受操作系统限制。当CPL≤IOPL的条件不能满足,应用程序能够访问的I/O端口就取决于I/O位图。
感谢关注聆听! http://www.nlpir.org 张华平 Email: kevinzhang@bit.edu.cn 微博:@ICTCLAS张华平博士 实验室官网: http://www.nlpir.org 大数据千人会