保护模式入门 — 从实模式到保护模式

tags: 操作系统, 保护模式
@烩面 14/01/2026

《操作系统真相还原》学习笔记:保护模式核心概念,段描述符、GDT、选择子,以及打开保护模式的三个步骤。

bits 指令

bits 决定汇编器生成哪种机器码。

  • [bits 16] — 编译成 16 位机器码
  • [bits 32] — 编译成 32 位机器码
  • 未指定时默认为 [bits 16]

前缀 0x66 和 0x67

0x66:切换操作数大小

  • 16 位实模式下,操作数大小变为 32 位
  • 32 位保护模式下,操作数大小变为 16 位

0x67:寻址方式反转

想在 32 位模式下使用 16 位内存寻址(如 bx),需加 0x67 前缀;16 位模式同理。

段描述符

一个段描述符只用来定义一个内存段。结构如下:

段描述符

字段含义
G段界限粒度:0=字节,1=4KB
D/B有效地址及操作数大小
L64 位代码段标记(32 位下为 0)
AVL用户自定义
P段是否在内存中
DPL特权级:0=内核,3=用户
S0=系统段,1=非系统段(代码/数据段)

段描述符结构

全局描述符表 GDT

  • 存放段描述符的表,位于内存中
  • 用专用寄存器 GDTR 存储 GDT 的地址和大小
  • 最多定义 8192 个描述符

选择子

用于确定段描述符在 GDT/LDT 中的索引位置。

选择子

字段含义
RPL请求特权级:0=高权限,3=低权限(用户级)
TI0=GDT,1=LDT

打开保护模式三步

1. 加载全局描述符表(lgdt 指令,48 位内存操作数)
2. 打开 A20 Gate,关闭地址回绕
3. 将 CR0 的 PE 位 置为 1