大数据搜索挖掘实验室 (wSMS@BIT) 第二章 微处理器管理模式 张华平 副教授 博士 Email: kevinzhang@bit.edu.cn Website: http://www.nlpir.org/ @ICTCLAS张华平博士 大数据搜索挖掘实验室 (wSMS@BIT)

Slides:



Advertisements
Similar presentations
微机原理与接口技术 第二章: ARM微处理器硬件结构
Advertisements

2017年3月5日 单片机原理与应用 背景知识调查.
第2章 微处理器 2.1 概述 /8086微处理器 微处理器 X86/Pentium微处理器
第3章 奔腾系列微处理器.
实验四 利用中规模芯片设计时序电路(二).
第2章 微处理器及其体系结构 罗文坚 中国科大 计算机学院
第一章 计算机基础知识 第一节 计算机概述 一、计算机的基本组成和工作原理 二、有关术语 三、计算机发展简史 四、微型计算机概述
汇编语言与接口技术 教师:范新民.
第2章 Intel IA-32/Intel 64处理器 结构与原理
第8章 现代微型计算机 x86系列微处理器 8.2 微型计算机体系结构 8.3 存储管理技术 8.4 多任务管理与I/O管理
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
第7章 中断与异常.
汇编语言程序设计 Assembly Language Programming
微机原理与接口技术 第2章 8086系统结构 朱华贵 2015年09月17日.
第四章 典型CPU及指令系统举例.
第2章 汇编语言与汇编程序 ——8086/8088指令系统 mov ax,12h call display Jmp 1234h.
第2章 16位和32位微处理器 位微处理器8086/ 位微处理器80386
总 复 习.
第3章 寻址方式 罗文坚 中国科大 计算机学院
走进编程 程序的顺序结构(二).
辅导课程六.
微机原理与接口技术 ——80x86微处理器 西安邮电大学 计算机学院 范琳.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
第二章 8086/8088系统结构 主要内容 8086/8088微处理器的内部结构 8086/8088 CPU 的引脚与功能
第五章 微处理器.
1.3 微型计算机的结构和工作原理.
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
逆向工程-汇编语言
CPU结构和功能.
中国科学技术大学计算机系 陈香兰(0512- ) Spring 2011
第二章 80x86计算机组织 § x86微处理器 § 2.2 基于微处理器的计算机系统构成 § 2.3 中央处理机
第二章 80x86计算机组织 x86微处理器 2.2 基于微处理器的计算机系统构成 2.3 中央处理机 2.4 存储器
微机原理与接口技术 ——80x86微处理器 西安邮电大学 计算机学院 范琳.
第二章 8086微处理器. 第二章 8086微处理器 微处理器的基本结构 8086微处理器的主要特性和内部结构 8086CPU的工作模式和引脚信号 8086的存储器管理 8086的总线操作和时序.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
C语言程序设计 主讲教师:陆幼利.
第四章 MCS-51定时器/计数器 一、定时器结构 1.定时器结构框图
第2章 80x86计算机组织  计算机系统  存储器  中央处理机  外部设备.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月13日.
第三章 MCS 51的硬件结构.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
本节内容 代码跨段 本质就是修改CS段寄存器 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
Windows98虚拟存储技术 (1)Intel80386提供的存储管理方式
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
本节内容 内存复制指令 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
微型计算机原理与接口技术 (第2版) 赵宏伟 于秀峰 黄永平 秦贵和 北京:科学出版社 出版 吉林大学计算机科学与技术学院 制作.
第九节 赋值运算符和赋值表达式.
实验二 带进位控制8位算术逻辑运算实验 带进位控制8位算术逻辑运算: ① 带进位运算 ② 保存运算后产生进位
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
段式存储管理(Segmentation)
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
微机原理与接口技术 ——8086微处理器 西安邮电大学 计算机学院 范琳.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第12章 中断 罗文坚 中国科大 计算机学院
3. 逻辑运算指令 A、简单逻辑操作指令 CLR A. (不影响CY、AC、 OV标志) CPL A
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
本节内容 通用寄存器 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 标志寄存器.
微机原理与接口技术 西安邮电大学计算机学院 宁晓菊.
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第四节 向量的乘积 一、两向量的数量积 二、两向量的向量积.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Lab2 系统调用
上节复习(11.7) 1、定时/计数器的基本原理? 2、定时/计数器的结构组成? 3、定时/计数器的控制关系?
§4.5 最大公因式的矩阵求法( Ⅱ ).
本节内容 任务段 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

大数据搜索挖掘实验室 (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 大数据千人会