前言
在邓志老师的《x86/x64体系探索及编程》中讲述了开启保护模式的顺序,我尝试着翻阅intel手册,但很遗憾似乎自己没有找到对此的描述(应该是有的,但是自己没找到,日后找到了会补充上)。 ---> 补充:在intel卷三 9.8 9.9 对保护模式初始化有讲述,查找cr0寄存器时从手册上看到的。
我们这篇文章来分析其如何初始化保护模式,着重来分析代码,可能不会来分析bochs源码。
开启保护模式
在开启保护模式之前,必须建立一个完整的保护模式运行环境,下面的系统表格是必须建立的:
① GDT;
② IDT;
③ TSS段。
在打开 CR0.PE 标志前,GDT必须被建立,IDT和TSS允许进入保护模式后才建立。下列环境是可选的。
① paging机制;
② LDT;
③ 处理器的TSS任务切换机制。
在legacy模式的保护模式里paging可以被关闭,虚拟地址直接变为物理地址。LDT和TSS任务切换机制被用于多任务环境里。
setup.asm 汇编代码分析
在common\setup.asm中,实现了上述过程的代码,我们现在依次来分析一下。
首先是来加载idt段与gdt段,其调用了lidt与lgdt指令,代码如下。
db 0x66
lgdt [__gdt