《操作系统真相还原》第九章第二部分:实模式下保护模式切换与寻址详解
在学习《操作系统真相还原》第九章第二部分时,我们聚焦于从实模式切换到保护模式这一关键步骤。这个过程并非一蹴而就,涉及到诸多细节,稍有不慎就会导致系统崩溃,进入死循环。为什么需要从实模式切换到保护模式?因为实模式的1MB寻址空间(实际上是640KB384KB)对于现代操作系统来说捉襟见肘,而保护模式提供的4GB线性地址空间以及更完善的权限管理机制是构建现代操作系统的基石。常见的坑包括:未正确设置GD
在学习《操作系统真相还原》第九章第二部分时,我们聚焦于从实模式切换到保护模式这一关键步骤。这个过程并非一蹴而就,涉及到诸多细节,稍有不慎就会导致系统崩溃,进入死循环。为什么需要从实模式切换到保护模式?因为实模式的1MB寻址空间(实际上是640KB 384KB)对于现代操作系统来说捉襟见肘,而保护模式提供的4GB线性地址空间以及更完善的权限管理机制是构建现代操作系统的基石。常见的坑包括:未正确设置GDT(Global Descriptor Table)导致CPU进入异常状态,或者寻址方式错误导致程序崩溃。例如,在没有正确设置GDT的情况下,直接使用段寄存器寻址,很可能导致访问越界。
GDT(全局描述符表)的配置和作用
GDT 是保护模式的核心数据结构之一,它存储了段的信息,例如段的起始地址、大小、权限等。在切换到保护模式之前,必须先正确配置 GDT。GDT 本身也需要被加载到 CPU 的 GDTR 寄存器中。一个简单的 GDT 初始化代码示例(NASM 汇编):
gdt_start: dd 0 ; Null descriptor dd 0gdt_code: dw 0FFFFh ; 段界限 0-15 bits dw 0 ; 段基地址 0-15 bits db 0 ; 段基地址 16-23 bits db 10011010b ; 访问字节 db 11001111b ; 段界限 16-19 bits 属性 db 0 ; 段基地址 24-31 bitsgdt_data: dw 0FFFFh dw 0 db 0 db 10010010b db 11001111b db 0gdt_end:gdt_ptr: dw gdt_end - gdt_start - 1 ; Size of GDT dd gdt_start ; Base address of GDT
上述代码定义了一个包含空描述符、代码段描述符和数据段描述符的 GDT。需要注意的是,访问字节和属性字节的设置必须正确,否则会导致CPU权限检查失败。
实模式到保护模式的切换步骤详解
《操作系统真相还原》第九章第二部分详细讲解了切换步骤,这里我们再进行一次总结。
-
准备 GDT: 如上文所述,配置 GDT,并将其地址和大小加载到 GDTR 寄存器。
-
关闭中断: 使用
cli指令关闭中断,防止中断处理程序在保护模式下发生错误。 -
启用 A20 地址线: 在早期的 IBM PC 中,A20 地址线默认是关闭的,需要通过端口操作(例如 0x92 端口)来启用,以便访问 1MB 以上的内存。
-
设置 CR0 寄存器的 PE 位: 将 CR0 寄存器的 PE (Protection Enable) 位设置为 1,从而进入保护模式。例如:
mov eax, cr0or eax, 1mov cr0, eax -
长跳转: 由于进入保护模式后,段寄存器的含义发生了变化,需要使用一个长跳转来刷新指令预取队列。例如:
jmp 08h:flush_pipeline ; 08h是代码段的选择子,flush_pipeline是一个标号flush_pipeline: ; ... 保护模式下的代码
常见错误和调试技巧
在从实模式切换到保护模式的过程中,常见的错误包括:
- GDT 配置错误: 例如,段基地址或段界限设置错误,导致程序访问越界。
- A20 地址线未启用: 导致无法访问 1MB 以上的内存。
- CR0 寄存器 PE 位未设置: 导致系统仍然运行在实模式下。
- 长跳转错误: 导致指令预取队列没有被正确刷新,程序执行错误。
调试技巧:
- 使用调试器: 例如 Bochs 或 QEMU,可以单步调试,查看寄存器的值,从而找到错误的原因。
- 添加日志输出: 在关键步骤添加日志输出,可以帮助定位问题。
- 仔细阅读 Intel 手册: Intel 手册是了解 x86 架构的权威资料,可以帮助理解保护模式的原理。
掌握《操作系统真相还原》第九章第二部分的内容,对于理解操作系统的启动过程至关重要。希望本文能帮助读者更好地理解实模式到保护模式的切换,并避免常见的错误。
相关阅读
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)