Intel x86 Assembly& Microarchitecture 切换到保护模式
示例
切换到保护模式很容易:您只需要在控制寄存器中设置一位即可。但是,如果要保持保护模式,而又不知道下一步该怎么做,CPU不会举手并重置自身,则需要进行大量准备工作。
简而言之,所需步骤如下:
需要为全局描述符表设置一个内存区域,以定义至少三个描述符:
零度,NULL描述符;
代码段的另一个描述符;
数据段的另一个描述符。
这可以用于数据和堆栈。
全局描述符表寄存器(GDTR)需要初始化,以指向该定义的内存区域。
GDT_Ptr dw SIZEGDT
dd OFFSETGDT
...
lgdt [GDT_Ptr]
需要设置的PM位CR0:
mov eax,cr0 ;GetCR0intoregister
or eax,0x01 ;SettheProtectedModebit
mov cr0,eax ;We'renowinProtectedMode!
需要从GDT加载段寄存器以删除当前的实模式值:
jmp 0x0008:NowInPM ;ThisisaFARJump.0x0008istheCodeDescriptor
NowInPM:
mov ax,0x0010 ;ThisistheDataDescriptor
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0x0000 ;Topofstack!
请注意,这是裸最小,只是为了让CPU进入保护模式。要实际准备好整个系统可能需要更多步骤。例如:
可能需要启用较高的存储区-关闭A20门;
绝对应该禁用该中断-但也许可以在进入保护模式之前设置各种故障处理程序,以允许在处理的早期就出现错误。
本部分的原始作者撰写了有关进入保护模式并使用它的完整教程。