Intel x86 Assembly& Microarchitecture 切换到保护模式

示例

切换到保护模式很容易:您只需要在控制寄存器中设置一位即可。但是,如果要保持保护模式,而又不知道下一步该怎么做,CPU不会举手并重置自身,则需要进行大量准备工作。

简而言之,所需步骤如下:

  • 需要为全局描述符表设置一个内存区域,以定义至少三个描述符:

    1. 零度,NULL描述符;

    2. 代码段的另一个描述符;

    3. 数据段的另一个描述符。

      这可以用于数据和堆栈。

  • 全局描述符表寄存器(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门;

  • 绝对应该禁用该中断-但也许可以在进入保护模式之前设置各种故障处理程序,以允许在处理的早期就出现错误。

本部分的原始作者撰写了有关进入保护模式并使用它的完整教程。