本文由 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 站内资料)
- Rings 是一种低层次的保护机制,其为程序提供一个保护层,允许为不同级别的进程提供不同的资源访问权限;
- V86 即 Virtual 8086 模式,其是保护模式的一个子模式,让 CPU 在保护模式下模拟 16位实机 的运行。Virtual Monitor 是用于在 V86 模式下控制任务的代码。
进入保护模式
在进入保护模式前,必须进行以下工作:
译注:(总结、整理自 wiki.osdev.org 站内资料)
- NMI, Non Maskable Interrupt:NMI 是一个硬件驱动的中断,与 PIC 非常类似。但 NMI 既可以直接连到 CPU,也可以通过另一个控制器(如 ISP)连到 CPU
- A20总线:用于访问内存的地址线的第 21 根线。该线上有一个总能被软件开关的逻辑门,可以阻止或允许地址线收到 A20 的信号
- 全局描述符表(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
- www.osdever.net/tutorials/v… - very good tutorial how entry to protected mode
- OSRC: protected mode
- home.swipnet.se/smaffy/asm/… - pragmatic tutorial on protected mode (Cached copy)
- www.brokenthorn.com/Resources/O…
- Protected mode Wikipedia page
- members.tripod.com/protected_m… - PMode tutorials in C & Asm