实模式和保护模式

保护模式的起源

最开始的程序寻址是直接的“段:偏移”模式,这样的好处是所见即所得,程序员指定的地址就是物理地址,物理地址对程序员是可见的。但是,由此也带来两个问题:

  1. 无法支持多任务(程序员多个程序可能指定运行的物理地址一样)
  2. 程序的安全性无法得到保证(用户程序可以改写系统空间或者其他用户的程序内容)

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

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

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

从80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式。只有在刚刚启动的时候是实模式,到linux操作系统运行起来以后就运行在保护模式。虚拟8086模式是运行在保护模式中的实模式,为了在32位保护模式下执行纯16位程序。它不是一个真正的CPU模式,还属于保护模式。CPU启动环境为16位实模式,之后可以切换到保护模式。但从保护模式无法切换回实模式。

保护模式和实模式区别

2.1

1)实模式的寻址方式与工作原理

8086是16位的CPU,只能访问地址在1M以下的内存成为常规内存,我们把地址在1M以上的内存成为扩展内存。实模式有着16位的寄存器/16位数据总线/20位地址总线。一个地址有段和偏移两部分组成,物理地址的计算公式为:

physicaladdress=segment16+offset

通过上述分段技术,能够表示的最大内存为:

FFFFh : FFFFh
= FFFF0h(左移)+ FFFFh
= 10FFEFh
= 1M + 64K - 16Bytes

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

对于80286或以上的CPU通过A20GATE来控制A20地址线。技术发展到了80286,虽然系统的地址总线由原来的20根发展为24根,这样能够访问的内存可以达到2^24=16M,但是Intel在设计80286时提出的目标是向下兼容,所以在实模式下,系统所表现的行为应该和8086/8088所表现的完全一样,也就是说,在实模式下,80386以及后续系列应该和8086/8088完全兼容仍然使用A20地址线。所以说80286芯片存在一个BUG:它开设A20地址线。如果程序员访问100000H-10FFEFH之间的内存,系统将实际访问这块内存(没有wrap-around技术),而不是像8086、8088一样从0开始。我们来看一幅图:

为了解决上述兼容性问题,IBM使用键盘控制器上剩余的一些输出线来管理第21根地址线(从0开始数是第20根)的有效性,被称为A20Gate;

  1. 如果A20Gate被打开,则当程序员给出100000H-10FFEFH之间的地址的时候,系统将真正访问这块内存区域;
  2. 如果A20Gate被禁止,则当程序员给出100000H-10FFEF之间的地址的时候,系统仍然使用8086/8088的方式即取模方式(8086仿真)。绝大多数IBMPC兼容机默认的A20Gate都是被禁止的。现在许多新型PC上存在直接通过BIOS功能调用来公职A20Gate的功能。
    上面的内存访问模式都是实模式,在80286以及更高系列的PC中,即使A20Gate被打开,在实模式下所能够访问的内存最大也只能为10FFEFH,尽管他们的地址总线所能够访问的能力都大大超过这个限制。

嗯,为了能够访问10FFEFH以上的内存,则必须进入保护模式

2)保护模式寻址

从80386开始,进入32位CPU时代,有32位地址总线。但是,地址并没有用寄存器直接指定,仍然采用“段+偏移”的模式。虽然段值仍由原来的16位cs/ds等寄存器指定,但此时这些寄存器中存放的不再是段基址,而是一个索引:从这个索引,可以找到一个表项,里面存放了段基址等很多属性,这个表项称为段描述符,这个表就成为GDT。

2.2段大小

实模式下面段的大小是固定的64k,而保护模式则不是固定的。关于段基址,实模式下,第16位是0;保护模式下坚持4K对齐,就是说第12b是0。(??,没搞懂这句话意思,应该是后12位为0)

2.3段地址的存放地点

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

2.4对段的保护机制

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

原文链接:实模式与保护模式解惑之(一)——二者的起源与区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值