什么是保护模式?

2025年2月4日 | 阅读 8 分钟

早在1982年,英特尔就将保护模式引入其x86架构。此后,它发展成为所有后续英特尔x86架构的基础。在早期版本中,无法激活保护模式或切换回实模式。尽管如此,可以使用键盘控制器将中断掩码、寄存器和堆栈指针存储在RAM中。后来,具有内置机制退出保护模式的286架构需要复杂的程序来激活保护模式。然而,随着386 CPU的问世,可以轻松激活保护模式。

What is Protected Mode

基于英特尔的x86微处理器主要在保护模式下运行,该模式通常被称为保护虚拟地址模式。其显著特点是能够防止一个应用程序的地址空间覆盖另一个程序的地址空间。

硬件强制执行此限制,以允许多个由不同开发人员开发的应用程序在单台计算机上运行。如果没有这种保护措施,恶意或有故障的程序可能会覆盖另一个程序的内存,导致其功能失常或崩溃。因此,将不会生成任何日志来解释第二个程序的故障原因。

英特尔CPU使用分段寻址,这是一种将内存划分为块或段以进行虚拟和物理存储的技术。段寄存器包含一个选择器,用于从描述符数据库中选择一个描述符。描述符包括段的长度、初始地址和访问权限。这些数据在保护模式下用于调节应用程序检索内存的方式。

286

最初的保护模式随286一同出现,并被Coherent(始于1982年)、Microsoft Xenix(始于1984年)和Minix等系统使用,但并未被广泛采用。广泛接受受到多种问题的阻碍,包括无法访问BIOS或DOS调用,因为返回实模式需要重置CPU。286仅支持通过其四个段寄存器中的每一个以16位段访问内存,这意味着一次只能读取4*2^16字节,即256千字节。这进一步阻碍了其被接受。

当286启动时,它首先进入实模式,以确保与其前身8086的向后兼容性。由于实模式的运行方式与8086几乎相同,因此大多数现有的8086软件都可以在新的286上运行而无需任何修改。此外,实模式作为一个更基本的模式,允许指定保护模式,从而解决了一种悖论。操作系统会在内存中建立特定的表来处理保护模式下的内存访问,将这些表的地址插入到某些处理器寄存器中,然后将CPU置于保护模式,以利用286的增强能力。这使得CPU能够访问2^24字节的内存,即16MB,这得益于24位寻址。

386

随着1985年386的推出,许多阻碍早期保护模式广泛接受的障碍得到了纠正。386最初发布时,其地址总线大小为32位,这意味着它可以访问2^32字节的内存,即4GB。此外,段大小也扩大到32位,允许访问整个4GB地址空间而无需在段之间切换。除了地址总线和段寄存器的容量增加外,还增加了许多其他功能以提高操作的安全性和稳定性。如今,几乎所有利用x86架构的操作系统——包括微软Windows、Linux和许多其他系统——都具有保护模式。

此外,英特尔设计了一种特殊的虚拟8086模式,允许在386上模拟多个虚拟化的8086处理器,以解决286保护模式在满足多用户DOS需求方面的问题。然而,用于虚拟化保护模式本身所需的硬件x86虚拟化又等待了二十年。

386保护模式有了更多的补充。

随着386的到来,在保护模式中实现了进一步的增强。

  • 分页
  • 80386SX和其他使用过时的286总线的386处理器变体没有32位物理地址空间,这与其他版本中可用的32位虚拟和物理地址空间不同。
  • 32位段偏移量
  • 能够返回实模式而无需完全重启
  • 8086虚拟模式

切换进出保护模式

直到386推出之前,保护模式没有提供一种简单的方法来退出保护模式并返回普通模式。IBM设计了一种在IBM AT中实现的解决方案,该方案包括使用键盘控制器来启动CPU的重置。该方法还涉及将中断掩码、堆栈指针和系统寄存器存储在实时时钟芯片的随机存取存储器(RAM)中。因此,BIOS能够在重置前启动指令的执行并将CPU恢复到类似的状态。后来,286 CPU通过三重故障进行重置,这比使用键盘控制器更快、更精确(它适用于任何系统中的任何80286 CPU,并且不需要IBM AT兼容的硬件)。

构建至少包含三个条目——一个空描述符、一个代码段描述符和一个数据段描述符——的全局描述符表(GDT)是进入保护模式的前提。为了确保与为基于Intel 8088的IBM PC和PC/XT平台设计的旧应用程序的兼容性,在加电后只允许使用前20条地址线。因此,对于IBM兼容系统,还必须启用A20线(第21条地址线),以允许使用所有地址线,从而使CPU能够访问超过1MB的内存。在完成这两个过程后,必须在CR0寄存器中设置PE位,并进行一次远跳转以清除预取输入队列。

实模式与保护模式有何区别?

英特尔首款用于个人计算机的微处理器8088,其RAM容量为1MB。在随机存取存储器(RAM)内建立了多个区域来存储BIOS数据、显示信号和其他系统数据。操作系统(OS)和应用程序消耗了剩余的640KB连续空间。

80286微处理器引入了保护模式,该模式禁止在保护模式下运行的程序中的任何指令访问未分配给该程序的内存。这为多任务处理提供了可能。大多数应用程序软件和操作系统代码通常在保护模式下运行,以避免意外覆盖重要数据。

然而,计算机在执行一些关键任务时需要访问所有内存区域。实模式是英特尔CPU启动时所处的模式,它使这成为可能。在实模式下的指令可以寻址RAM中任何可用的1MB地址。一个被信任在实模式下运行的程序通常需要读写系统数据。通常,这样的程序包含在操作系统或专门的应用程序子系统中。

CPU进入保护模式,也称为英特尔处理器的原生模式,以运行任何复杂的操作系统,如微软Windows或Linux,这些系统需要更宽的地址空间和多任务处理来同时运行多个程序。

保护模式中的许多功能提高了系统的安全性和稳定性。这些特性是:

  • 特权级别: 有四个特权级别,或称环(rings),其中环0是最高特权,环3是最低特权。系统软件可以通过使用这些环来阻止程序访问数据。通常,操作系统在环0上运行,而应用程序在环3上运行。
    保护模式下的四个特权级别,或称环,编号从0到3,其中环0权限最高,环3权限最低。系统软件可以通过使用环来限制哪些任务可以访问数据、调用门或执行特权指令。应用程序在环3中运行,操作系统在环0中运行,一些设备驱动程序在环0中运行。
    What is Protected Mode
  • 虚拟8086模式: 英特尔将保护模式称为虚拟模式,它允许先前生成的8086代码在新系统上运行(向后兼容性)而无需任何修改,并提供系统安全性和稳定性。
  • 实模式: Windows 3.x及其后续版本为在保护模式下执行Windows 2.x应用程序提供了与实模式的二进制兼容性。
  • 分段寻址: 在保护模式下,通过用一个16位选择器替换段部分来实现分段寻址。选择器的高13位包含描述符表内一个条目的索引。该条目包含段的精确行地址、段大小的最大值和少量标志。请求的批准由最低两位决定,其值范围从0到3。最低有效位指示操作是针对全局描述符表(GDT)还是局部描述符表(LDT)。
  • 多任务处理 指的是操作系统同时执行多个任务的能力。为此,必须确保每个任务都安排在其专用的处理器上执行。处理器在任务之间切换时,会将当前的上下文信息保存在一个任务状态段中。当原始任务需要重新调度时,处理器使用存储的数据来修改其内部寄存器,为恢复执行做准备。
  • 保护模式增强了操作系统无错误执行多项任务的能力,并能防范软件问题。在内存周期开始之前进行检查,任何违反规则的内存周期都会被停止,从而引发异常。对非法内存访问的保护确保了所有软件开发工具的稳定性。
  • 分页: 内存被组织成页。操作系统可以为每个进程建立一个独特的虚拟地址,以防止一个任务访问另一个任务的内存。将页面从主存储器转移到辅助存储器可以提供额外的存储空间。
  • 支持调试: 80386有一组可编程的调试寄存器,作为其保护模式的一部分。可以通过声明将导致断点发生的周期类型和目标内存地址在一个调试寄存器中来设置断点。当达到断点时,会触发一个异常,调试器接管以揭示有关处理器内部状态的数据。

现代英特尔CPU还提供哪些额外的工作模式?

除了保护模式和实模式外,英特尔CPU还可以在以下两种模式下运行:

系统管理模式(SMM): 在此操作模式下,操作系统和所有其他程序的执行都会暂停,固件以最高权限运行。例如,硬件辅助的调试器通过SMM运行。

虚拟8086模式: 这在严格意义上不是一种操作模式,因为处理器本身仍处于保护模式,同时运行一个或多个实模式应用程序。高级的英特尔处理器,如80386微处理器及更高版本,可以在虚拟8086模式下模拟多个8086/8088处理器。此功能将以实模式运行的应用程序与系统的其余部分隔离开来。