【译】保护模式

223 阅读3分钟

本文由 marsCatXDU 翻译,如有谬误,还请大神们多多指教

原文地址:wiki.osdev.org/Protected_M…

翻译的原文版本:20 September 2020, at 01:17.

保护模式

保护模式,是现代 Intel 处理器的主要操作模式,该模式最初在 16 位的 80286 上引入。在 80386 系列以及后续的产品中,32 位保护模式开始支持多种特性:

  • 支持多个虚拟地址空间,每个空间最多有 4GB 内存;
  • 允许系统强制使用严格内存模式、保护硬件 I/O ;
  • 通过引入 Rings 1来限制当前可用的指令种类

CPU 的初始化是由 BIOS实模式下开始的。启动保护模式才能释放 CPU 的真正力量。然而,保护模式却会防止用户使用绝大多数只工作在实模式下的 BIOS 中断(除非你自己写了一个 V86 monitor2

译注:(总结、整理自 wiki.osdev.org 站内资料)

  1. Rings 是一种低层次的保护机制,其为程序提供一个保护层,允许为不同级别的进程提供不同的资源访问权限;
  2. V86 即 Virtual 8086 模式,其是保护模式的一个子模式,让 CPU 在保护模式下模拟 16位实机 的运行。Virtual Monitor 是用于在 V86 模式下控制任务的代码。

进入保护模式

在进入保护模式前,必须进行以下工作:

  • 关中断,也包括 NMI3 中的中断(Intel Developers Manual 建议的做法);
  • 启动 A20总线4
  • 使用段描述符载入全局描述符表5。这个段描述符应该是适合于代码、数据和栈的

译注:(总结、整理自 wiki.osdev.org 站内资料)

  1. NMI, Non Maskable Interrupt:NMI 是一个硬件驱动的中断,与 PIC 非常类似。但 NMI 既可以直接连到 CPU,也可以通过另一个控制器(如 ISP)连到 CPU
  2. A20总线:用于访问内存的地址线的第 21 根线。该线上有一个总能被软件开关的逻辑门,可以阻止或允许地址线收到 A20 的信号
  3. 全局描述符表(GDT,Global Descriptor Table):用于 IA32 架构。其包含告诉 CPU 内存段相关信息的条目

CPU 处于的是实模式还是保护模式,是由 CR0 或 MSW 寄存器的最低一位决定的。

下面的例子将一个描述符表载入到处理器的 GDTR 寄存器中,并将 CR0 的最低位置 1

cli				; 关中断
lgdt [gdtr]		; 将全局描述符表起始地址加载到 GDTR 寄存器
mov eax, cr0	; cr0 送 eax
or al, 1		; eax 最低位置 1,即置位 CR0 的 PE(Protection Enable) 位
mov cr0, eax	; 最低位为 1 的值送 cr0

; 远跳到选择器(selector)08h
; (偏移到 GDT 中,指向一个 32位 PM 代码段描述符,将合适的 PM32 描述符加载进 CS )
jmp 08h:PModeMain

PModeMain:
; 加载 DS,ES,FS,GS,SS,ESP

译注:(总结、整理自网络资料)

  • CR0~4:控制寄存器,用于控制和确定处理器的操作模式及当前执行任务的特性。CR0 含有控制处理器操作模式和状态的系统控制标志。
  • MSW :16 位机器状态字寄存器,从 80386 开始被 CR0~4 取代
  • LGDT、LIDT 仅能用于操作系统。是保护模式中能直接加载线性地址(即,非段相对地址)的指令。通常在实模式下运行,让 CPU 在切换到保护模式前进行初始化(摘自 blog.csdn.net/judyge/arti…

相关阅读

Articles

External Links