CPU的实模式与保护模式

首先我们要知道这两种模式都是 CPU 的工作模式,实模式是早期 CPU 运行的工作模式,而保护模式则是现代 CPU 运行的工作模式。

实模式(Real Mode)

起源

  实模式出现于早期 8086 CPU 时期,8086 也是第一款支持内存分段模型的处理器。当时,8086 只有一种工作模式,即实模式,但当时还没有这个说法。由于 CPU 的性能有限,一共只有 20 位地址线(地址空间只有 1M), 8 个 16 位的通用寄存器,以及 4 个 16 位的段寄存器。由于 16 位的物理地址只能访问 64KB 的内存。所以,为了能够用这些 16 位的寄存器去构成 20 位的主存地址,访问 1 MB 的内存,必须采取一种特殊的方式。

原理

  实模式下的主存地址由两部分组成:第一个字段是段基址,由一个16位的段寄存器提供;第二个字段是段内偏移量,它的值由通用寄存器来提供,所以也是 16 位。那么问题来了,两个 16 位的值如何组合成一个 20 位的地址呢?这里采用的方式是:把段寄存器所提供的段基址先向左移 4 位(或乘以 16),这样就变成了一个 20 位的值,然后再与 16 位的段偏移量相加。

应用

  在现代计算机上,实模式运行的时间非常短,一般我们感觉不到它的存在。CPU 复位(reset)或加电(power on)的时候就是以实模式启动,这时处理器以实模式工作,不能实现权限分级,也不能访问 20 位以上的地址线,也就只能访问 1M 内存。之后,加载操作系统模块,进入保护模式。

  此外,在这种模式下,系统在计算实际地址的时候是按照对 1M 求模的方式进行的,这种技术被称为 wrap-around。也就是说,当程序员给出超过 1M(100000H ~ 10FFEFH)的地址时,为了保持逻辑上正常,系统并不认为其访问越界而产生异常,而是自动从 0 开始计算。

  然而,在实模式中整个物理内存被看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向「实在」的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,容易造成软件甚至系统崩溃。

保护模式(Protected Mode)

起源

  最开始的程序寻址是直接的 段基址:段内偏移 模式,这样的好处是所见即所得,程序员指定的地址就是物理地址,物理地址对程序员是可见的。但这就带来一些问题:

  1. 无法支持多任务
  2. 程序的安全性无法得到保证

  随着 CPU 的发展,CPU 的地址线的个数也从原来的 20 根变为现在的 32 根,所以可以访问的内存空间也从 1 MB 变为现在 4 GB,寄存器的位数也变为 32 位。因此,实模式下的内存地址计算方式就已经不再适用了,需要引入新的模式,即保护模式,实现更大空间的、更灵活的内存访问。

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

  总的来说,保护模式出现的原因名副其实:保护进程地址空间

原理

  在保护模式下,地址的表示方式与实模式是一样的,都是 段基址:段内偏移。不过,保护模式下 的概念发生了根本性的改变。实模式下的段值可以看作是地址的一部分,可直接参与转换计算。而保护模式下的段值(尽管仍然由原来的段寄存器表示)变成了一个索引,指向了一个数据结构的一个表项(段表项),表项中详细定义了段基址界限属性(权限)等内容。这个数据结构是全局描述符(GDT,Global Descriptor Table),也有可能是本地描述符(LDT,Local Descriptor Table)。它们存放关于某个运行在内存中的程序的分段信息的,比如某个程序的代码段是从哪里开始,有多大;数据段又是从哪里开始,有多大。

------本文结束感谢您的阅读 ------
0%