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