保护模式及其编程
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
04
DOS操作系统运行于实模式下
CPU被复位(加电)时,自动进入实模式。
1.实模式
保护模式
实模式下对一系列的寄存器进行设置,就可以进入保护模式。 CPU提供了段式和页式内存管理功能 CPU支持多任务和特权级 Windows/Linux操作系统运行于保护模式下
01
02
3.虚拟8086模式
2 虚拟内存管理
01
如果程序要访问的内容不在内存中,CPU会产生一个异常,由操作系统的存储器管理程序来处理,将所需的内容装入内存中。这就是所谓的虚拟存储器,它并不完全是真正的内存空间,也称做虚拟内存。
02
虚拟地址:程序指令中使用的地址,由段和偏移两个部分组成
线性地址:段的基地址再加上偏移量
02
4.执行单元
分段和分页单元负责地址产生、地址转换
和对总线接口单元的段检查。 CPU存储器管理的分段单元用硬件进行高速地址计算,完成逻辑地址到线性地址的转换和保护性检查; 分页单元实现保护模式下的分页机制,它可以将线性地址转换成物理地址,并由总线单元输出。
5.分段和分页单元
01
02
浮点运算单元集成在80486及以上的CPU中;
第10章 保护模式及其编程
单击此处添加副标题
2
支持存储器分段管理机制和分页管理机制
3
支持多任务
1
寻址高达4GB的物理地址空间
5
区分不同级别的代码
4
支持4个特权级和配套的特权检查机制
在保护模式下:
10.1 保护模式基础
10.1.1 32位CPU内部结构 CPU有8个处理单元:执行单元、分段单元、分页单元、总线单元、指令预取单元、指令译码单元、高速缓存单元和浮点运算单元。
中断描述符表IDT中保存着中断门描述符;
01
IDT最多包含256个门描述符,CPU最多支持256个中断。
02
中断描述符表寄存器IDTR是48位的寄存器。其最低16位是限长,给出IDT的字节大小;其高32位是基址,指出IDT在物理存储器中存放的基地址。
03
7.中断描述符表寄存器
中断描述符表寄存器
02
03
04
4.片内转换检测缓冲器TLB
页表项就是在分页转换时用到的页表描述
符和页描述符,它们都是32位的,其格式:
页表项的低12位提供保护功能和统计信息。 U/S位、R/W位、P位实现页保护机制; 而D位和A位提供统计信息。
01
03
02
5.页表项
页表项
U/S:用户/管理员位 U/S=0时,只有操作系统程序可以访问该页,而不允许用户程序访问 U/S=1时,允许用户程序访问该页 R/W:读写位 R/W0,用户程序对页面只有读权限,不能写入; R/W1时,可读/写
02
页表描述符的高20位给出了页表的基地址 。
03
线性地址中的页表索引(10位),指示了被访问的页在页表中的序号。
04
页描述符的高20位给出了物理页面的基地址。
05
物理页面的基地址再加上线性地址中的12位字节索引,便得到32位线性地址对应的32位物理地址。
06
线性地址转换为物理地址的过程
01
04
S=0且E=1时,这是一个代码段,可执行。
05
S=0且E=0时,这是一个数据段或堆栈段,不可执行。
06
E=0时,后面的两位为ED和W;
07
若E=1时,后面的两位为C和R。
08
访问权限字节
ED:扩展方向位
01
为0时,ቤተ መጻሕፍቲ ባይዱ从低地址向高地址扩展,偏移量小于等于限长。
02
为1时,段从高地址向低地址扩展,偏移量必须大于限长。
总线单元是CPU与存储器和I/O的接口
01
02
03
总线接口对外提供:32位(或64位)数据总线、32位(或36位)地址总线以及控制总线
总线单元负责完成所有外部总线操作,能够产生控制地址锁存器和数据总线收发器工作的控制信号。
1.总线单元
指令预取单元实现指令流队列的机制
01
CPU可以预取16字节的指令代码
选择符的格式如下
RPL :请求特权级,2位二进制数字,求特权级是将要访问的段的特权级。
TI :表指示符。为0时,从GDT中选择描述符;为1时,从LDT中选择描述符。
Index:索引。指出要访问描述符在段描述符表中的顺序号。
段寄存器(续)
10.1.4 显示CPU寄存器的值 要取得GDTR,IDTR,TR,LDT寄存器的值,分别使用SGDT,SIDT,STR,SLDT指令,这些指令将寄存器的内容保存到内存单元中。 程序举例:cpuregs.asm
03
W:写允许位
04
为0时,不允许对这个数据段写入;
05
为1时,允许对这个数据段写入。
06
访问权限字节
C:一致位
为0时,这个段不是一致代码段
为1时,这个段是一致代码段
R:读允许位
为0时,不允许读这个段的内容
为1时,允许读这个段的内容
A:访问位
为1表示段已被访问过
为0表示段未被访问过。
访问权限字节
3.线性地址转换为物理地址的过程
页目录索引(10位),对页目录的索引 页表索引(10位),对页表的索引 字节索引(12位),线性地址在页面内的偏移。
线性地址转换为物理地址的过程图
以PDBR的值作为页目录的基地址,定位到页目录 。
01
用线性地址中的页目录索引(10位)在页目录表中找到一个页表描述符。
01
调试寄存器提供高级的调试功能
4.调试寄存器DR
5.测试寄存器TR
测试寄存器提供对TLB的测试。
用全局描述符表寄存器GDTR指出GDT的位置和大小。
02
全局描述符表GDT是用来定义全局存储器空间的一种机制,它用段描述符说明一个全局存储器中的段,每个GDT最多含有8192个描述符(8192864KB)。
1
2
3
9.任务寄存器TR
10.控制寄存器
存在着4个系统控制寄存器CR0~CR3。CR0的低5位是系统控制标志,被称为机器状态字MSW。MSW中各位的含意: PE:保护模式允许标志 等于0为实模,等于1为保护模式 MP:运算协处理器存在位 等于1表示系统中有运算协处理器。
01
EM :等于1时系统用软件模拟器执行数学运算
对于80386,需要另外一个数学运算协处理器80387来执行浮点运算。
6.浮点运算单元
7.高速缓存单元
10.1.2 三种运行模式
CPU具有三种运行模式:实模式、保护模式 和虚拟8086模式 ,关系如下:
01
实模式不支持硬件上的多任务切换
02
CPU不能对内存进行分页管理
03
实模式也不支持特权级
8.局部描述符表寄存器
任务寄存器TR在保护模式的任务切换机制中使用。
TR是16位的选择符,其内容为索引值,它选中的是TSS描述符。
任务状态段TSS中包含启动任务所必需的信息。它在存储器的基地址和限长(大小)由TSS描述符指出,TSS描述符放在全局描述符表GDT中,而TR内容指出了TSS描述符在GDT中的顺序号。
段式内存管理是将形如DS:[EBX]的虚拟地址,由DS的段基址再加上偏移部分,就得到了线性地址。
分页管理将分段管理机制得到的线性地址转换为物理地址。
使用分页机制的好处: 可以把每个活动任务当前所必需的少量页面放在内存中,而不必将整个段调入内存,从而提高了内存的使用效率。
10.2.2 页式内存管理功能
例如: IDTR=0E003F40007FFH,则说明IDT的地址为0E003F400H,长度为7FFH+1=800H。其中可容纳800H/8=100H个中断门描述符。
STEP2
STEP1
局部描述符表LDT含有与系统中某一个任务相关的各个段的描述符;
局部描述符表寄存器LDTR并不直接指出LDT的位置和大小,而是指向一个LDT描述符,由LDT描述符指出LDT的位置和大小。
01
由以下几个部分组成:
02
段基址(32位)
03
限长(20位)
04
访问权限(8位)
05
属性(4位)
06
段描述符
访问权限字节定义如下
访问权限字节
01
P:存在位
03
02
04
S:描述符类型位
01
为1时,这个段为代码段、数据段或堆栈段;
02
为0时,为系统段描述符。
03
E:可执行位,区分代码段和数据段
01
6.全局描述符表寄存器
01
GDTR是48位的寄存器。其最低16位是限长,给出GDT的字节大小;其高32位是基址,指出GDT在物理存储器中存放的基地址。
02
例如:GDTR=0E003F0003FFH,则说明GDT的地址为0E003F000H,长度为3FFH+1=400H。其中可容纳400H/8=80H个段描述符。
01
02
01
P:存在位。
02
P=1,页表或页存在于物理内存中;
03
P=0,页表或页没有在物理内存中。
04
A:访问标志。
05
如果对某页表或页访问过,CPU设置页表项中的A位为1。
06
D:写入位。
07
D=1时表示对该页进行过写操作,
08
D=0时表示对该页还没有进行过写操作。
09
AVL占3位,可以由操作系统使用
02
预取进来的指令要保存在FIFO队列中
03
2.指令预取单元
指令译码单元接收FIFO队列的输出
指令译码单元将接收到的机器代码指令译
码为微代码指令,并供执行单元使用
3.指令译码单元
执行单元取出译码后的指令并执行该操作,
01
包括: 算术逻辑单元ALU 寄存器组 专用乘法器 移位器 控存(ROM)
01
02
03
04
页的长度固定为4KB
页与页之间没有重叠
页式内存简化了存储器管理
不能充分地利用内存 ,会产生碎片
1.分页
每一个线性页面只能映射到一个物理页面上
01.
多个线性页面可以映射到同一个物理页面上
02.
线性地址按页为单位映射到物理地址
2.线性地址到物理地址的映射
32位线性地址被划分为3个部分:
物理地址:从微处理器引脚上输出的地址信号
01
02
03
将虚拟地址转换为线性地址,由CPU的分段部件完成。
10.2.1 段式内存管理功能
虚拟地址到线性地址,再到物理地址的转换过程
3.段描述符
段描述符用于描述代码段、数据段和堆栈段。段描述符的格式如图 :
段描述符位于GDT或LDT中,占64位,
虚拟8086模式是为了在Windows/Linux系统中执行DOS程序而设计的,它是一种经过“修改”的保护模式。
4.特权级
在保护模式下,CPU有4个特权级(0~3),操作系统运行在高的特权级(0)上,而应用程序运行在低的特权级(3)上。
32位CPU支持的寄存器有以下几种:
通用32位寄存器
属性位包括G、D、AVL等
属性位
段描述符高速缓存
在读写内存单元时,CPU需要检查段描述符的内容是否和当前操作相一致,CPU的运行效率极大地降低。为解决这个问题,CPU在内部设置了段描述符高速缓存。 在指令执行过程中,只有段寄存器的值发生改变时,才需要到GDT或LDT中装入段描述符。如果段寄存器的值不改变,高速缓存中的段描述符可以被直接引用,这样就避免了到主存中频繁读取段描述符。提高了CPU的效率。
02
TS:任务切换标志。
03
当任务切换时,自动设置此位为1
04
PG:
05
等于1时,存储器管理单元允许分页;
06
等于0时,分页功能被关闭,线性地址等于物理地址。
MSW中各位的含意(续)
11.段寄存器CS,DS,ES,SS,FS,GS
32位CPU有6个段寄存器,比16位CPU增加了FS和GS两个段寄存器。 在实模式下,它们的用法和16位CPU相同 在保护模式下,段寄存器不直接存放段基址,而是存放一个索引,由索引从GDT或LDT中找到段描述符,从而确定关于这个段的全部描述信息。这个索引被称为段选择符。
指令指针寄存器EIP和堆栈指针寄存器ESP
01
指令指针寄存器EIP,它总是下一条要执行的指令的偏移地址,偏移地址指的是这条指令在代码段中的位置。 堆栈指针寄存器ESP,用于存放当前堆栈段中栈顶的偏移地址。 他们的低16位分别是IP和SP
02
问某个数据时激活调试程序。
02
例如:可以设置一个数据断点,在程序访
分别是:EAX,EBX,ECX,EDX,ESI,EDI,
EBP,ESP。
主要用于算术运算、逻辑运算以及对内存操作数的寻址。
10.1.3 寄存器
2.标志寄存器
标志寄存器EFLAGS也扩展为32位 ,位11到位0和8086完全相同。这里主要扩展了4个标志位: V86模式位VM(位17) 此位为1时,表示当前CPU正工作在V86模式下; 此位为0,表示当前CPU工作在实模式或保护模式下。 嵌套任务位N(位14) 当前的任务嵌套在其他任务中,此位为1,否则为0 恢复位RF(位16) I/O域IOPL(位13和12)