实模式、保护模式和虚拟8086模式

参考自:实模式与保护模式解惑之(一)——二者的起源与区别(河西无名式)


概述:实模式保护模式是处理器发展的两个非常重要的阶段。这两个模式下的编程也有着显著的不同,弄明实模式与保护模式的区别是理解操作系统运行原理和编写操作系统的基础。本文主要讲解了实模式和保护模式的区别和保护模式的起源,侧重点在二者寻址方式上的差异。


这里插入一段 CPU 的发展式(源自:8086 CPU 寄存器简介(小宝马的爸爸 - 梦想的家园)):

Intel CPU 系列,最初是 4 位微处理器 4004,然后到 8 位微处理器的 8008 

再到 8 位微处理器 8080,以及稍后的 16 位微处理器 8086

由 8086 开始,Intel 进入现在所谓的  x86  时代 

Intel  8086 为 16 位  CPU ,而因为在 8086 之前的 CPU 都是 8 位 CPU,这样也就造成了很多的外设也只支持 8 位

因此  Intel  紧接着就退出了 8 位的 8088 CPU,因此  Intel 8088 也就可以看做是 8086 的 8 位版本

如果是从汇编语言的角度上来说,8086 和 8088 是没有区别的,即 8086 上跑的程序可以不加修改的移植到 8088 

8088 上跑的程序也可以不加修改的移植到 8086 上,当然,还是有些特殊的地方是不同的,而这些基本上在这里可以忽略掉

在 8088  CPU 之后,Intel  又推出了  80186 ,80286 ,这两款 CPU 均是 16 位  CPU 

对于 80186 来说,其与 8086 的区别可以简单的看做是 80186 多了几条指令而已

而 80286 则不同,80286 的地址总线数目有了变化

在 8086 , 8088 , 80186 上,CPU 的地址总线都是 20 根,即可最大寻址 2^20 即达到 1MB 的寻址能力

而对于 80286 CPU 来说,其地址总线数目达到了 24 根,从而最大寻址能力为 2^24 即 16MB

由于支持更多的物理内存寻址,因此 80286 便开始成为了多任务,多用户系统的核心

而后来,Intel  又推出了 80386 ,80386 为 32 位微处理器,Intel 80x86 家族的 32 位微处理器始于 80386

同时 80386 也完全兼容先前的 8086/8088,80186,80286,并且 80386 全面支持 32 位数据类型和 32 位操作

并且 80386 的数据总线根数和地址总线根数均达到了 32 根,从而可以最大物理寻址为 232  即 4GB 

而之后的 80486 也是 32 位微处理器,而后又出来了 Pentium 和 Pentium Pro 等等第五代微处理器

这些处理器虽然也是 32 位微处理器,但是他们的数据总线和地址总线都有所扩展,比如 Pentium 的数据总线达到 64 位,

而Pentium Pro 的地址总线位数达到了 36 位 。


1、保护模式起源

最开始的程序寻址是 [段:偏移] 模式,这样的好处是所见即所得,程序员指定的地址就是物理地址,物理地址对程序员是可见的。但是,由此也带来两个问题1)无法支持多任务2)程序的安全性无法得到保证(用户程序可以改写系统空间或者其他用户的程序内容)

    实模式将整个物理内存看成分段的区域,代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。

    在保护模式下,全部32条地址线有效,可寻址高达4GB的地址空间;扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境;4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;支持虚拟8086方式,便于执行8086程序。

    保护模式出现的原因是:保护进程地址空间。这样,就产生了一个结果:两种模式下程序的寻址方式发生了变化。

    从80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式。在系统刚刚启动的时候是实模式,在实模式下,存储器寻址方式和8086是一样的,由段寄存器的内容乘以16当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的32位地址线只使用了低20位。此时的80386处理器不能对内存进行分页管理,所以指令寻址的地址就是内存中实际的物理地址。实模式下80386不支持优先级,所有的指令相当于工作在最高级(优先级0)下,所以它可以执行所有特权指令包括读写控制寄存器CR0等。实际上,80386就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过使能CR0寄存器的保护模式使能位PE而进入保护模式的。实模式下不支持硬件上的多任务切换。 


等到操作系统运行起来以后就运行在保护模式。虚拟8086模式是运行在保护模式中的实模式,为了在32位保护模式下执行纯16位程序。它不是一个真正的CPU模式,还属于保护模式。



2、保护模式和实模式的区别


2.1 寻址方式


1)实模式寻址方式

808616位的cpu,有16位的寄存器,16位数据总线以及20位地址总线,可以访问1MB的内存地址由 [段:偏移] 组成,物理地址的计算公式为:  physical address = segment * 16 + offset   其中,segmentoffset都是16位的。

    通过上述分段技术,能够表示的最大内存为:FFFFh:FFFFh=FFFF0h+FFFFh=10FFEFh=1M+64K-16Bytes1M多余出来的部分被称做高端内存区HMA)。但8086/8088只有20位地址线,只能够访问1M地址范围的数据,所以如果访问100000h~10FFEFh之间的内存(大于1M空间),则必须有第21根地址线来参与寻址(8086/8088没有)。因此,当程序员给出超过1M100000H-10FFEFH)的地址时,因为逻辑上正常,系统并不认为其访问越界而产生异常,而是自动从0开始计算,也就是说系统计算实际地址的时候是按照对 1MB 求模的方式进行的,这种技术被称为wrap-around

   到了 80286,虽然系统的地址总线由原来的20根发展为24根,这样能够访问的内存可以达到2^24=16MB,但是Intel在设计80286时提出的目标是向下兼容,所以在实模式下,系统所表现的行为应该和8086/8088所表现的完全一样,也就是说,在实模式下,80386以及后续系列应该和8086/8088完全兼容仍然使用20位地址线。


2)保护模式寻址方式

80386开始,进入32cpu时代,有32位地址总线。寻址仍然采用了[段 偏移] 的模式,虽然段值仍然由原来的16cs/ds等寄存器指定,但此时这些寄存器中存放的不再是段基址,而是一个索引:从这个索引,可以找到一个表项,里面存放了段基址等很多属性,这个表项称为段描述符,这个表就称为GDT。有关GDT的相关介绍,可以参考GDT详解


2.2 段大小

实模式下段的大小是固定的64k,而保护模式则不是固定的。关于段基址,实模式下,低16位是0;保护模式下坚持4KB对齐,就是说低 12位 都是0。


2.3段基址的存放地点

实模式下在cs/ds等寄存器中,保护模式在段描述符中,而要取得段描述符,又需要取得CS等中的段选择子。


2.4对段的保护机制

实模式下没有提供对段的保护,保护模式下面提供了对段的保护机制。


  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值