4

x64 架构上的实模式和保护模式有什么区别?我正在尝试为 Linux 内核制作一个自定义引导加载程序。如何在程序集中启用保护模式?

4

1 回答 1

2

参见 osdev实模式保护模式

由 BIOS 初始化的 CPU 在实模式下启动。启用保护模式允许使用实模式无法访问的所有 4GB 内存。但是,它会阻止您使用大多数 BIOS 中断,因为它们在实模式下工作(除非您还编写了 V86 监视器)。

在切换到保护模式之前,您必须禁用中断,可能启用 A20 线,并使用适用于代码、数据和堆栈的段描述符加载全局描述符表。

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

此示例将描述符表加载到处理器的 GDTR 寄存器中,然后设置 CR0 的最低位:

cli          ; disable interrupts
lgdt [gdtr]  ; load GDT register with start address of Global Descriptor Table
mov eax, cr0 
or al, 1     ; set PE (Protection Enable) bit in CR0 (Control Register 0)
mov cr0, eax

; Perform far jump to selector 08h (offset into GDT, pointing at a 32bit PM code segment descriptor) 
; to load CS with proper PM32 descriptor)

JMP 08h:PModeMain

; [...]

PModeMain:
; load DS, ES, FS, GS, SS, ESP.

这会将您带到保护模式。
在此之后,您可以跳转到 C 或汇编中的内核代码。

于 2014-10-26T04:42:04.943 回答