欢迎来到天天文库
浏览记录
ID:40317805
大小:71.24 KB
页数:6页
时间:2019-07-31
《CPU的实模式和保护模式简介》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、16位微处理器8086寄存器组成8086/8088包括:4个16位的数据寄存器,2个16位的指针寄存器,2个16位变址寄存器,分成四组。通用寄存器中,这些寄存器除完成规定的专门用途外,均可用于传送和暂存数据,可以保存算术逻辑运算的操作和运算结果。 段寄存器能在8086中实现1M物理空间寻址,并可与8080CPU进行兼容。段寄存器都是16位的,分别称为代码段(CodeSegment)寄存器CS、数据段(DataSegment)寄存器DS、堆栈段(StackSegment)寄存器SS,附加段寄存器。 标志寄存器在8086中有一个16位用于反映处
2、理器的状态和运算结果的某些特征。(其中只有9位有定义)这些标志位分为两类:其一是运算结果标志,主要用于反映处理器的状态和运算结果特征。(例如:进位标志、零标志、符号标志、溢出标志等)其二是状态控制标志,它控制着处理器的操作。要通过专门的指令才能使状态控制标志发生变化。(例如:方向标志、中断允许标志、追踪标志) 内存的寻址(实模式)8086CPU有20根地址线,可直接寻址的物理地址空间为1M。尽管8086/8088内部的ALU每次最多进行16位运算,但存放存储单元地址偏移的指针寄存器都是16位的,所以8080/8086通过内存分段和使用段寄存
3、器的方法来有效地实现寻址1M的空间。 存储单元的逻辑地址由段值和偏移两部分组成,用如下形式表示: 段值:偏移所以根据逻辑地址可以方便地得到存储单元的物理地址,计算公式如下: 物理地址(20位)=段值*16+偏移段值通过段寄存器的值来取得,偏移可由指令指针的IP或其他可作为内存指针使用的寄存器给出。偏移还可以直接用16位数给出。指令中不使用物理地址,而使用逻辑地址,由总线接口单元BIU按需要根据段值和偏移自动形成20位物理地址。 32位微处理器1985年,真正的32位微处理器80386DX诞生,为32位
4、软件的开发提供了广阔的舞台。80386寄存器的宽度大多是32位,可分为如下几组:通用寄存器、段寄存器、指令指针及标志寄存器、系统地址寄存器、调试寄存器、控制寄存器和测试寄存器。应用程序主要使用前面三组寄存器,只有系统才会使用其他寄存器。[说明]由于在实模式下,段的最大范围是64KB,所以EIP的高16位必须全是0,仍相当于16位的IP作用。注意,在32位模式下,段寄存器仍然是16位。 80836中,标志寄存器也扩展到了32位,记为EFLAG。其中,增加了IO特权级IOPL:当前运行程序或任务的CPL必须小于或等于这个IOPL才能访问I/O地
5、址空间。嵌套任务标志NT(NestTask)重启动标志RF(ResetFlag)虚拟8086标志VM:当设置该标志时,就开启虚拟8086方式,当复位该标志时,则回到保护模式。控制寄存器控制寄存器(CR0~CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性。4个控制寄存器都是32位的。CR0:含有控制CPU操作模式和状态的标识CR1:保留不用CR2:存储导致页错误的线性地址CR3:含有页目录表的物理内存基址 CR0中的保护控制位:PE:CR0的位0是启用保护(ProtectionEnable)标志。(CR0的最低位)当设置该位时即开
6、启了保护模式,当复位时即进入实地址模式。这个标志仅开启段级保护,而没有启用分页机制。若要启用分页机制,那么PE和PG都要置位。PG:CR0的位31是分页(Paging)标志。(CR0的最高位)当设置该位时即开启了分页机制,当复位时则禁止分页机制,此时所有线性地址等同于物理地址。注意,在开启这个标志之前必须已经开启PE标志,否则CPU会产生一个一般保护性异常。改变PG位的代码必须在线性地址空间和物理地址空间中具有相同地址,这部分具有相同地址的代码在分页和未分页世界之间起着桥梁的作用。如果PE=0、PG=0,处理器工作在实地址模式下。(兼容早期
7、的实模式操作系统)如果PE=1、PG=0,处理器工作在无分页机制的段保护模式下(兼容段式管理的操作系统)如果PE=1、PG=1,处理器工作在段页式保护模式下 在系统刚上电时,处理器被复位成PE=0和PG=0(即实模式状态),以允许引导代码在启用分段和分页机制之前能够初始化这些寄存器和数据结构。 【程序原理】CPU是如何处理物理地址的?在实模式下用段寄存器左移4位与偏移量相加。在保护模式下用段描述符中的基址加偏移量。这两者其实是一样的。当Intel把80286推出时,其地址空间变成了24位,则从8086的20位到24位,十分自然地要加大段寄
8、存器才行。实际上,段寄存器和指针都被加大了,只是由于保护的原因,加大的部分没有被程序看见,到了80386之后,地址又从24位加大到32位。在8086中,CPU只有“看得见部分”,
此文档下载收益归作者所有