1、微机接口技术,第二章 保护模式,提纲,2.1 保护模式基础 2.2 内存管理 2.3 任务 2.4 特权级保护,2.1 保护模式基础,通常所说的保护模式是指80386处理器及以后的处理器所实现的运行模式。,2.1.1 CPU的3种运行模式,从80386开始,Intel的CPU具有3种运行模式:实模式保护模式虚拟8086模式,实模式,在实模式下,80X86等同于一个16位的8086微处理器。 采用类似于8086的体系结构,其寻址机制、中断处理机制均和8086相同. 只使用低20位地址线,只能寻址1M字节的物理地址空间.,实模式,不支持硬件上的多任务切换. 不支持特权级,可以执行所有特权指令。 D
2、OS操作系统运行于实模式下,而Windows/Linux操作系统运行于保护模式下。,保护模式,CPU提供了段式和页式内存管理功能,支持多任务和特权级。 物理寻址空间高达4GB(80386/80486)或64GB(Pentium及以上CPU)。,虚拟8086模式,虚拟8086模式又称“V86模式”。 32位80X86处理器给每个以“虚拟8086模式”运行的任务“创造”了一个与真实的8086处理器十分相似的运行环境,以便运行DOS程序。 既有保护功能又能执行8086代码的工作模式。,2.1.1 CPU的3种运行模式,CPU的3种运行模式及其切换,特权级,在保护模式下,CPU有4个特权级,分别为特权
3、级0、1、2、3。,操作系统运行在高的特权级(Ring 0)上,而应用程序运行在低的特权级(Ring 3)上,应用程序不能直接修改(破坏)操作系统的程序和数据.,2.1.2 保护模式下的特殊寄存器,通用32位寄存器,EAX EBX ECX EDX ESI EDI EBP ESP,31 16 15 0,GDTR : global descriptor table LDTR : local descriptor table IDTR : interrupt descriptor table TR : task register EIP : 32 bits in length EFLAGS CR0,
4、 CR1, CR2, CR3 DR0-DR7(Debug registers) TR6-TR7(Test registers),EIP,CS DS SS ES FS GS,AX BX CX DX,SP BP SI DI,EFLAGS,GDTR IDTR LDTR,CR0 CR1 CR2 CR3,DR0 DR1 DR2 DR3 DR4 DR5 DR6 DR7,TR6 TR7,Limit,Limit,Base,Base,0,15,16,47,MSW,2.1.2 保护模式下的特殊寄存器,标志寄存器 标志寄存器EFLAGS也扩展为32位,2.1.2 保护模式下的特殊寄存器,EFLAGS中的位11到位0
5、和8086完全相同。这里主要扩展了4个标志位: VM:v86模式位,=1 工作在v86模式,=0 工作在实模式或保护模式 RF:恢复位,与程序调试有关的一个控制位。 NT: 嵌套任务位,=1当前任务嵌套在其他任务中 IOPL:占2位,规定了哪些特权级的程序可以执行I/O指令,2.1.2 保护模式下的特殊寄存器,指令指针寄存器EIP和堆栈指针寄存器ESPEIP和ESP都是32位寄存器,它们的低16位分别是IP和SP。,IP,SP,31 16 15 0,EIP ESP,2.1.2 保护模式下的特殊寄存器,保护模式增加了四个寄存器: 全局描述符表寄存器 中断描述符表寄存器 局部描述符表寄存器 任务寄
6、存器,2.1.2 保护模式下的特殊寄存器,保护模式下存贮器的虚拟地址须先由分段部件转换为线性地址,再由分页部件转换为物理地址。 线性地址由段基址和段内偏移量相加得到。段内偏移量位(段最大4GB),段基地址仍然由位的段寄存器选择。,2.1.2 保护模式下的特殊寄存器,段寄存器的内容,是个被称为段描述符的索引值,所检索到的表项叫做段描述符,每个段描述符含个字节,其中包括了位的段基址。,2.1.2 保护模式下的特殊寄存器,全局描述符表寄存器GDTRGDTR是48位的寄存器。其最低16位是限长,给出全局描述符表(GDT)的字节大小(其值比GDT的长度少1);其高32位是基址,指出GDT在物理存储器中存
7、放的基地址。,GDT,全局存储器是一种共享系统资源,该存储器可以被所有任务访问。全局描述符表GDT是用来定义全局存储器空间的一种机制,它用段描述符说明一个全局存储器中的段,每个GDT最多含有8192个描述符(8192864KB)。 全局描述符表只能有一个。,GDT,GDT是位于存贮器中,用全局描述符表寄存器GDTR指出它的位置和大小,可软件编程改变。,2.1.2 保护模式下的特殊寄存器,BASE,LIMIT,0,47,16,15,8191,0,8190,全局描 述符表 GDT,全局描述符表寄存器(GDTR ),MAX: 64k bytes 8K entries,1,2.1.2 保护模式下的特殊
8、寄存器,中断描述符表寄存器IDTR IDTR是48位的寄存器。其最低16位是限长,给出中断描述符表IDT的字节大小(其值比IDT的长度少1);其高32位是基址,指出IDT在物理存储器中存放的基地址。,IDT,中断描述符表。 IDT中保存的是中断门描述符。每个门描述符包含8字节,IDT最多包含256个门描述符,因为CPU最多支持256个中断。中断门指出的是中断服务程序的入口。,2.1.2 保护模式下的特殊寄存器,保护模式下的中断描述符表的功能,类似于实模式下的中断向量表,区别为IDT的位置可变,由相应的描述符说明,而实模式下的中断向量表的地址是固定的,必须在物理地址00000H处。 GDTR和I
9、DTR的值必须在进入保护模式之前装入。,2.1.2 保护模式下的特殊寄存器,局部描述符表寄存器LDTR 保护模式下多任务的环境中每个任务都有一个局部描述符表LDT。LDT只含有与系统中某一个任务相关的各个段的描述符。和所有任务有关的公用段的描述符放在全局描述符表中。这样,就可以使每一任务的代码段、数据段、堆栈段与系统其他部分隔离开,达到保护的目的。,LDT,由于每项任务都有自己的(且每项任务只能有一个),因此保护模式的软件系统可能有多个。但GDT只有一个。,多LDT的示例,LDTR,LDTR是一个16位的选择符,包含LDT描述符在GDT中的索引,不直接指出LDT的位置和大小。,LDTR寄存器确
10、定LDT的位置和限长的过程,GDT,和步由GDTR确定了GDT表在存储器中的位置和限长。LDTR中是一个选择符,它包含了LDT描述符在GDT中的索引。步是依据LDTR在GDT中取出LDT描述符的过程。在LDT描述符中,包含由LDT的位置和限长,即和步。,TR,任务寄存器TR 任务寄存器TR在保护模式的任务切换机制中使用。TR是16位的选择符,其内容为索引值,它选中的是TSS描述符。TR的初值由软件装入,当执行任务切换指令时TR的内容自动修改。,TSS,在多任务环境下,每个任务都有属于自己的任务状态段TSS,TSS中包含启动任务所必需的信息。 任务状态段TSS在存储器的基地址和限长(大小)由TS
11、S描述符指出。 TSS描述符放在全局描述符表GDT中,TR内容为选择符,它指出TSS描述符在GDT中的顺序号。由描述符说明各TSS的位置和限长。,由任务寄存器TR取得TSS的过程,和步由GDTR确定了GDT表在存储器中的位置和限长。TR是一个选择符,这个选择符中包含了TSS描述符在GDT中的索引。步依据TR在GDT中取出TSS描述符。在第和步中,在TSS描述符中取得TSS的基址和限长。,Physical Memory,GDT,TSS,TSS descriptor,TR,BASE,LIMIT,0,15,16,47,2.1.2 保护模式下的特殊寄存器,控制寄存器 有四个系统控制寄存器CR0CR3。
12、CR0的低5位是系统控制标志,被称为机器状态字MSW;分页机制中用到CR3、CR2和CR0的其他位。,2.1.2 保护模式下的特殊寄存器,机器状态字MSW中各位的含义如下: PE(Protection mode Enable):保护模式允许标志。0为实模式,CPU复位(启动)时自动进入实模式;1为保护模式。可以通过软件设置PE位,进入或退出保护模式。 MP(Monitor coprocessor extension):运算协处理器存在位。1表示系统中有运算协处理器。,EM(Emulate processor extension):1时系统用软件模拟器执行数学运算。 TS(Task Switch
13、ed):任务切换标志。当任务间切换时,自动设置此位为1。 PG(Paging enable):1时,存储器管理单元允许分页。0时,分页功能被关闭,线性地址等于物理地址。,2.1.2 保护模式下的特殊寄存器,段寄存器 32位CPU有6个段寄存器: CS代码段寄存器,其值为代码段的段值; DS数据段寄存器,其值为数据段的段值; ES附加段寄存器,其值为附加数据段的段值; SS堆栈段寄存器,其值为堆栈段的段值; FS附加段寄存器,其值为附加数据段的段值; GS附加段寄存器,其值为附加数据段的段值。,2.1.2 保护模式下的特殊寄存器,在实模式和V86模式下,段寄存器的16位内容是20位段首址的高16
14、位,段首址的低4位为0。 在保护模式下,段寄存器中的16位内容是一个选择符(selector),用于在段描述符表(GDT或LDT)中选择(确定)段描述符。,2.1.2 保护模式下的特殊寄存器,CS:EIP=0008:804F1266 SS:ESP=0010:8053CED8 DS=0023 ES=0023 FS=0030 GS=0000,2.1.2 保护模式下的特殊寄存器,RPL(Requestor Privilege Level):请求特权级,2位二进制数字,范围为03。 00代表特权级0,01代表特权级1,10代表特权级2,11代表特权级3。 请求特权级是将要访问的段的特权级。,TI(Ta
15、ble Indicator):表指示符。为0时,从GDT中选择描述符;为1时,从LDT中选择描述符。 Index:索引。指出要访问描述符在段描述符表中的顺序号,Index占13位。因此,顺序号的范围是08191。每个段描述符表(GDT或LDT)中最多有8192=213个描述符。,小结,GDTR (GDT) IDTR (IDT) LDTR (LDT) TR EFLAGS (IOPL, VM) CR0(PE, PG) CR1,CR2,CR3 CS,DS,ES,FS,GS,SS (selector),2.2 内存管理,80368以上的CPU允许使用虚拟存储器,除了有一个速度较快地、容量较小的主存储器
16、(内存),还有一个速度较慢,但容量很大的外部存储器。二者通过存贮器管理机制,有机地、灵活地结合在一起。,2.2.1 分段内存管理,虚拟地址、线性地址、物理地址虚拟地址就是程序指令中使用的地址(也称逻辑地址),它由段和偏移两个部分组成。段选择符的Index和TI占14位,偏移量为32位。如DS:EBX就是一个虚拟地址。,TI,selector,offset,INDEX,RPL,CPU的分段部件将虚拟地址转换为线性地址。,对于一个虚拟地址,线性地址是段的基地址再加上偏移量。段的基地址保存在段描述符中。 段基址和偏移量都是32位的,所以线性地址是32位。线性地址空间的范围是232=4GB,即0000
17、000016FFFFFFFF16。,2.2.1 分段内存管理,虚拟地址和线性地址都是任务相关的。同一个虚拟地址可能得到不同的线形地址。 任务1和任务2对同一个虚拟地址0047H:00002000H得到的线性地址可能是不同的。对于同一个局部段选择符,LDT可对不同的任务设置不同的段基址。 线性地址为什么也是任务相关的?,物理地址,物理地址是微处理器引脚输出的地址信号。 同一个线性地址得到的物理地址可以不同。 CPU的分页部件将线性地址转换为物理地址。如果禁止CPU的分页功能,线性地址就直接作为物理地址。,2.2.1 分段内存管理,虚拟地址 线性地址 物理地址的转换过程,2.2.1 分段内存管理,
18、段式地址转换 转换过程如图2-13。根据段选择符在GDT或LDT中确定对应的段描述符,在段描述符中包括这个段的段基址、限长和权限等信息。取出段的基址后,再加上偏移部分,就得到了线性地址。,2.2.1 分段内存管理,全局段与局部段,2.2.1 分段内存管理,段描述符段描述符用于描述代码段、数据段和堆栈段。段限长指出了一个段的最后一个字节的偏移地址。段描述符位于GDT或LDT中,占8字节(64位),由以下几个部分组成:段基址(32位)、限长(20位)、访问权限(8位)和属性(4位)。段描述符的格式如图2-14,图2-15。,段描述符格式,2.2.1 分段内存管理,P(Present)存在位。1时表
19、示该段己装入内存;0时表示该段没有在内存中,访问这个段会产生段异常。操作系统将某个段从物理内存中交换到磁盘时,设置此位为0。 DPL(Descriptor Privilege Level)描述符特权级。说明这个段的特权级,取值为03。 S(System)描述符类型位。=1时,这个段为代码段、数据段或堆栈段;=0时,为系统段描述符。 E(Executable)可执行位,用来区分代码段和数据段。S=1且E=1时,这是一个代码段,可执行。S=1且E=0时,这是一个数据段或堆栈段,不可执行。E=0时,后面的两位为ED和W;若E=1时,后面的两位为C和R。,2.2.1 分段内存管理,ED(Expansi
20、on Direction)扩展方向位(对数据段或堆栈段)。=0时,段向上扩展(从低地址向高地址扩展),偏移量小于等于限长。=1时,段向下扩展(从高地址向低地址扩展),偏移量必须大于限长。 W(Writeable)写允许位(对数据段或堆栈段)。=0时,不允许对这个数据段写入;=1时,允许对这个数据段写入。对数据段进行读操作总是被允许的。 C(Conforming)一致位(对代码段)。=0时,这个段不是一致代码段;=1时,这个段是一致代码段。 R(Readable)读允许位(对代码段)。=0时,不允许读这个段的内容;=1时,允许读这个段的内容。对于代码段进行写操作总是被禁止的。,2.2.1 分段内
21、存管理,A(Accessed)访问位。1表示段己被访问(使用)过;0表示段未被访问过。 G(Granularity)粒度位。G1时,限长以页为单位;G0时,限长以字节为单位。 D(Default Operation Size)默认操作数宽度。D1时,为32位数据操作段;D1时,为16位数据操作段。 AVL(Available field)可用位。这一位保留给操作系统或应用程序来使用。,2.2.1 分段内存管理,段的属性 Windows操作系统中,DS段的线性地址范围为0000000016-FFFFFFFF16,与CS段完全相同。 段的属性是由段选择符来决定的,对于同样一个线性地址范围,不同的选
22、择符有不同的属性。如0000000016-FFFFFFFF16可能是代码段,也可能是数据段。,2.2.1 分段内存管理,段描述符高速缓存为了提高CPU的运行效率在CPU内部设置了段描述高速缓存,这些缓存不可见,自动装入段描述符。段描述符高速缓冲的内容和6个段描述符寄存器索引的描述符当前值保持一致。,GDTbase=0003F000 Limit=03FF 0003F000 00 00 00 00 00 00 00 00-FF FF 00 00 00 9B CF 00 0003F010 FF FF 00 00 00 93 CF 00-FF FF 00 00 00 FB CF 00 0003F020
23、 FF FF 00 00 00 F3 CF 00-AB 20 00 20 04 8B 00 80 . . 0003F030 01 00 00 F0 DF 93 C0 FF-FF 0F 00 00 00 F3 40 00 . 0003F040 FF FF 00 04 00 F2 00 00-00 00 00 00 00 00 00 00 0008 Code32 00000000 FFFFFFFF 0 P RE 0010 Data32 00000000 FFFFFFFF 0 P RW 001B Code32 00000000 FFFFFFFF 3 P RE 0023 Data32 00000000
24、 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,段描述符的例子,Loading Descriptor from Descriptor Table,LDTR descriptor,CS descriptor,00A00000H,FFFFH,GDTR,
25、00A00000H,00A0FFFFH,2000H,LDTR,00A02007H,00A02000H,00,0,0,82,90,00,0000,FFFF,0,F,FE,60,FFFF,0000,00900000H,FFFFH,00900000H,0090FFFFH,1005H,CS,00600000H,FFFFFH,00901007H,00901000H,006FFFFFH,00600000H,GDT (64KB),LDT (64KB),CODE SEGMENT (1 MB),SYSTEM MEMORY,USER MEMORY,CS=1003H, 如何?,2.2.2 分页内存管理,保护模式下的
26、CPU支持分页机制,并且分页管理是在分段管理机制的基础上工作,它将分段管理机制得到的线性地址转换为物理地址。 使用分页机制的好处在于,它可以把每个活动任务当前所必需的少量页面放在内存中,而不必将整个段调入内存,从而提高了内存的使用效率。,2.2.2 分页内存管理,分页 所有页的长度固定为4KB,页与页之间也没有重叠。CPU将4GB的线性地址空间划分成220页。 在Windows/Linux操作系统中,将段式内存管理和页式内存管理结合起来,主要是依赖页式内存管理来调度内存。,2.2.2 分页内存管理,线性地址到物理地址的映射 线性地址按页(4KB)为单位映射到物理地址。每一个线性页面都映射到一个
27、物理页面上。,任务A,任务B,线性地址到物理地址的映射,2.2.2 分页内存管理,线性地址转换为物理地址的过程 分页机制,就是一种将线性地址的页面映射到物理地址页面的手段,也就是从线性地址到物理地址的转换过程。分页机制中用到了两个表:页表目录表和页表。,2.2.2 分页内存管理,32位线性地址被划分为3个部分: 页目录索引 页表索引 字节索引其中第1项是对页目录(Page Directory)的索引,第2项是对页表(Page Tables)的索引,第3项是线性地址在页面内的偏移。,10位,12位,10位,2.2.2 分页内存管理,线性地址转换为物理地址的过程,Linear Address从何而
28、来? 黑色方框的边界代表什么意思?,2.2.2 分页内存管理,片内转换检测缓冲器TLB 每次内存操作都需要将线性地址转换为物理地址,转换过程中需要访问页目录表和页表来取得页表描述符和页描述符。为了提高转换效率,CPU内部设置了片内转换检测缓冲器TLB(Translation Lookaside Buffer),其中保存了32个页描述符,它们都是最近使用过的。,2.2.2 分页内存管理,页表项 页表项就是在分页转换时用到的页表描述符和页描述符,都是32位,页表项格式如图2-21。,2.2.2 分页内存管理,页目录、页表和物理页的基地址的低12位全部为0,定位在页的边界上。 页表项的低12位提供保
29、护功能和统计信息。U/S位、R/W位、P位实现页保护机制,p32。,2.2.2 分页内存管理,页面映射的例子 经过页目录索引和页表索引的两级查找,就将一个线性地址的页面对应到一个物理页面上。线性地址的最低12位就是物理地址的最低12位。线性地址在转换为物理地址时,物理地址的高20位为页表描述符的高20位,而取得页表描述符需要线性地址的页目录索引和页表索引在页目录表和页表中。,2.2.2 分页内存管理,不同任务中的线性地址被映射到不同的物理页面上 不同任务中的线性地址被映射到相同的物理页面上 线性地址转换为物理地址的过程,Page Directory Physical=0E9640000e964
30、000 67 20 53 0E 67 B0 F9 0D-67 A0 87 0E 67 50 34 0B g S.g.g.gP4. 0e964100 67 10 4E 0E 00 00 00 00-00 00 00 00 00 00 00 00 g.N.0e4e1000 25 E0 D6 0E 25 40 FC 00-00 00 00 00 25 60 FC 00 %.% 0e4e1010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0e4e1020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
31、 0e4e1030 00 00 00 00 00 00 00 00-00 00 00 00 25 20 EA 0E % 0e4e1040 00 00 00 00 67 40 27 0F-67 E0 7A 00 00 00 00 00 g.g.z. 0e4e1050 67 30 E8 0E 25 00 DB 0E-00 00 00 00 00 00 00 00 g0%.Linear Addr: 10000000 Phys Addr: 0ed6e000 Linear Addr: ? Phys Addr: 00fc6000 Linear Addr: 10014000 Phys Addr: ? Lin
32、ear Addr: 10015000 Phys Addr: 0edb0000,10015000H=0001 0000 0000 0001 0101 0000 0000 0000bBit31-22 = 0001000000b = 040H (offset is 040H x 4 = 0100H)Bit21-12 = 0000010101b = 015H (offset is 015H x 4 = 0054H),2.3 任务,多任务环境,是指其硬件允许软件系统中存在多个任务,并能够以分时的方式使各程序轮流执行。 当运行一个应用程序后,操作系统就为这个程序创建一个任务。,TR,在保护模式下,在任何时
33、刻都有一个当前任务,当前任务由TR寄存器指定,CPU在这个任务的环境下执行。因此,系统中至少存在一个任务。,2.3.1 任务状态段,任务状态段是一种特殊的段,有一个段描述符来描述它的限长、段基址等属性,这个描述符放在GDT中。,任务执行环境,每个任务都由两个部分组成:任务执行环境TES(Task Executation Space)和任务状态段TSS(Task State Segment)。任务执行环境包括一个代码段、堆栈段和数据段等,任务在每一个特权级上执行时都有一个堆栈段。 图2-26,2.3.1 任务状态段,任务状态段 TSS中保存了任务的各种状态信息。任务状态段描述符(即TSS描述符)
34、描述某个任务状态段,规定了任务状态段的基地址和任务状态段的大小等信息。 描述符格式如图2-27,2-28。,2.3.2 任务切换过程,1.直接任务切换 段间跳转指令JMP X:Y或段间调用指令CALL X:Y可以用来执行任务切换。在中断/异常或者执行IRET指令时也可能发生任务切换。,利用JMP/CALL/IRET进行任务直接切换示意图,2.3.2 任务切换过程,2.间接任务切换 当CPLDPLTSS时,就不能采用任务的直接切换,必须通过任务门进行任务的切换。 此时,指令中包含的是任务门选择符。选择符指向的是任务门描述符,门中的选择符选中新任务的描述符,激活新的,启动新的任务。,利用JMP/C
35、ALL或中断进行任务间接切换示意图,2.3.2 任务切换过程,任务切换的步骤 把寄存器现场保存到当前任务的TSS(任务A的TSS)。 把指示目标任务(任务B)TSS的选择符装入TR寄存器中,同时把对应TSS的描述符装入TR的高速缓冲寄存器中。 恢复当前任务(任务B)的寄存器现场。 进行链接处理。,2.3.2 任务切换过程,把CR0中的TS标志置为1,这表示已发生过任务切换,在当前任务使用协处理器指令时,产生故障(向量号为7)。 把TSS中的CS选择符的RPL作为当前任务特权级,设置为CPL。 装载LDTR寄存器。 装载代码段寄存器CS、堆栈段寄存器SS和各数据段寄存器及其高速缓冲寄存器。,2.
36、3.2 任务切换过程,任务内特权级变化时TSS中堆栈指针的使用 使用CALL指令通过调用门向高特权级转移 使用RET指令实现向低特权级转移。,2.4 特权级保护,保护模式下设置了0、1、2、3共4个特权级,以区分操作系统程序和应用程序。这种特权级机制阻止了用户程序对操作系统的非法访问,保证高特权级的代码或数据不被低特权级的程序所破坏。,2.4.1 对数据访问的保护,为段寄存器赋值时的检查 程序要访问某一个段时,在将选择符赋给DS之前,CPU依据选择符的TI位在GDT或LDT中读入段描述符,并验证: 1)P位,如果P位为0,CPU会引发一个异常,由操作系统程序进行处理 2)段类型是否与目标段选择
37、符类型(CS、DS、SS等)一致,即类型检查,为段寄存器赋值时的检查(续),3)依据CPL、DPL、RPL来判断特权级是否满足要求:DPL MAX(CPL, RPL). CPL是当前正在运行的程序的特权级. DPL是描述符特权级,位于段描述符中,它表明了什么样的特权级程序可以使用这个段。 RPL是请求特权级。,Privilege check,SEGMENT BASE 15 0,BASE 2316,BASE 3124,G,X,0,P,DPL,S,TYPE,A,0,3,4,7,AVL,0,23,16,15,8,7,24,32,SEGMENT LIMIT 15 0,DPL,1,0,E,W,A,LIM
38、IT 1916,1,R,C,CS,RPL,CPL,INDEX,Target Segment Selector,Data Segment Descriptor,16-bit visible selector,Invisible Descriptor,Privilege check by CPU,Privilege - check,The procedure in code segment C is not able to access data segment E using segment selector E3 (dotted line), because the CPL of code s
39、egment C and the RPL of segment selector E3 are both numerically greater than (less privileged) than the DPL of data segment E. Even if a code segment C procedure were to use segment selector E1 or E2, such that the RPL would be acceptable, it still could not access data segment E because its CPL is
40、 not privileged enough.,CPL=0: 操作系统内核, DPL=2, RPL=2, 应用程序的数据段. MOV AX,0042h MOV DS,AX (DPL=2在段描述符中) 操作系统可以读取应用程序的数据段,CPL=3, RPL=0, DPL=0, 是否可以?,Privilege - check,基于段的内存保护,访问内存时的检查 1)操作数的偏移量是否超出段的边界 2)操作是否与段的保护属性匹配,基于段的内存保护,Base,Limit,Access rights,Selector,Type and limit check,Base,Limit,LDT/ GDT,Da
41、ta,Limit,Base,Memory,LDTR/GDTR,Base,Limit,2.4.2 对程序转移的保护,直接转移的保护 1)同一代码段内转移时,只需要检查限长。 2)段间调用或跳转,需要检查限长,特权级CPL和DPL。 CPL=DPL,允许跳转和调用。 CPLDPL,此时要检查段描述符的C位。如果C位为1,表示这是一致代码段,允许跳转和调用。,Privilege check by CPU,Restricting Control Transfers,SEGMENT BASE 15 0,BASE 2316,BASE 3124,G,X,0,P,DPL,S,TYPE,A,0,3,4,7,AV
42、L,0,23,16,15,8,7,24,32,SEGMENT LIMIT 15 0,DPL,1,0,E,W,A,LIMIT 1916,1,R,C,CS,CPL,Code Segment Descriptor,16-bit visible selector,Invisible Descriptor,Restricting Control Transfers,CPL = DPL (在同一优先级内转移) or CPL = DPL if the selected code segment is confirming segment (在低优先级中执行高优先级代码, 段描述符中的C位必须为1),Conf
43、orming Code segments are accessible by privilege levels which are the same or less privileged than the conforming-code segments DPL.,CPL DPL, 可以转移吗?,Restricting Control Transfers,间接转移的保护,间接转移采用JMP/CALL X:Y指令,其中X不再是16位段选择符,而是一个门选择符。 使用门选择符的转移是间接转移。 在直接转移中,X是16位段选择符。,2.4.3 门,门(Gate),可以看做是一种转换机构。门的类型有4
44、种:调用门、任务门、中断门、陷阱门。 调用门用来改变任务或者程序的特权级别; 任务门像个开关一样,用来执行任务切换; 中断门和陷阱门用来指出中断服务程序的入口地址。,2.4.3 门,系统描述符 门描述符属于系统描述符,门描述符的格式如图2-34。 系统描述符中,S位设置为0,而段描述符中S位为1,以此来区分系统描述符和段描述符。,2.4.3 门,调用门 调用门实现任务从级到更高特权级的间接控制转移,它在更高级特权级的段中定义了一个有效的入口点。 调用门指出了入口点的虚地址:目标选择符和偏移量。 程序从低特权级向高特权级的转换,必须通过调用门。保证了高特权级程序执行过程(操作)的完整性。,通过调
45、用门的转移和检查,图2-35,通过调用门转移到更高的特权级。 图2-36,调用门的特权级检查。,Call-gate operation,Privilege check by CPU,Call-gate operation,CS,RPL,CPL,INDEX,Target Segment Selector,SEGMENT BASE 15 0,BASE 2316,BASE 3124,G,X,0,P,DPL,S,TYPE,0,3,4,7,AVL,0,23,16,15,8,7,24,31,SEGMENT LIMIT 15 0,DPL,1,0,E,W,A,LIMIT 1916,1,R,C,Executab
46、le Segment Descriptor,16-bit visible selector,Invisible Descriptor,GATE DESCRIPTOR,Privilege Check for Control Transfer with Call Gate,特权级检查,CALL指令 满足以下两个条件时,才允许使用调用门: (1) DPLGATEMAX(CPL, RPL) (2) DPLCODECPL 如果CCODE为1,则当前特权级不变; 如果CCODE为0,则当前特权级提升为DPLCODE (DPLCODECPL)或者维持不变(DPLCODECPL)。 DPLCODECPL的条件
47、是防止执行调用门后,当前特权级降低。,特权级检查,JMP指令 满足以下两个条件时,才允许使用调用门: (1) DPLGATEMAX(CPL, RPL) (2) CCODE为1且DPLCODECPL 或 CCODE为0且DPLCODECPL 如果CCODE为1,则当前特权级不变; 如果CCODE为0,则当前特权级也不变(DPLCODECPL)。 结论:JMP指令使用调用门不能提升特权级。,2.4.4 输入输出保护,CPU采用I/O特权级IOPL(I/O Privilege Level)和TSS段中I/O许可位图的方法来控制输入/输出,实现输入/输出保护。,2.4.4 输入输出保护,I/O敏感指令
48、在EFLAGS寄存器中,有2位是输入输出特权级IOPL。CPLIOPL时,可以执行I/O敏感指令。IOPL位于如图237所示的标志寄存器中。,2.4.4 输入输出保护,I/O许可位图任务状态段中设置了I/O许可位图。每个任务的I/O许可位图都可以由操作系统来设置。I/O许可位图就是一个二进制位串。 I/O许可位图的格式如图 238 所示。,Input/Output,I/O permission bit map of a TSS,IO指令执行条件,(1) CPLIOPL时,可以执行I/O敏感指令。 (2) CPL IOPL时,TSS中IO位图等于0时,也可以执行I/O敏感指令。C:jiekouchap02cmosram C:jiekouchap02allowio -load giveio.sys C:jiekouchap02cmosram 2009/03/01 23:46:27,2.4.4 输入输出保护,对IOPL的保护 只有在特权级0下执行的程序才可以修改IOPL位及VM位; 只有IOPL级或更高的特权级的程序才可以修改IF位。,