x64架构上的实模式和保护模式有什么区别?我正在尝试为Linux内核创建自定义引导加载程序 . 如何在程序集中启用保护模式?
见osdev real mode,protected mode .
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或汇编中的内核代码 .
1 回答
见osdev real mode,protected mode .
BIOS初始化的CPU以实模式启动 . 启用保护模式允许使用实模式无法访问的所有4GB内存 . 但是,它会阻止您使用大多数BIOS中断,因为它们在实模式下工作(除非您还编写了V86监视器) .
在切换到保护模式之前,必须禁用中断,可能启用A20线路,并使用适合代码,数据和堆栈的段描述符加载全局描述符表 .
CPU是处于实模式还是处于保护模式由CR0或MSW寄存器的最低位定义 .
此示例将描述符表加载到处理器的GDTR寄存器中,然后设置CR0的最低位:
这会将您带到保护模式 .
在此之后,您可以跳转到C或汇编中的内核代码 .