本文用于汇总整理Intel80386初始化的相关信息,
参考文献:
- 《INTEL 80386 programmer's reference manual 1986》
本文是系列文章《Intel80386知识总结》的一部分。
===================================================================
1.寄存器的初始化状态
在i386收到来自RESET针脚的信号后,会将寄存器的状态进行初始化。
1.1 EAX
如果在RESET信号后,处理器收到来自BUSY针脚的信号,那么处理器将进行加电自检。加电自检的结果若没有问题,则EAX的值为0,否则为非0。若没有进行加电自检,那么EAX的值是不确定的。
1.2 DX
DX寄存器用于保存处理器的型号,对于i386第2字节(8~15位)取值为3。第一字节保存处理器的revision level。
1.3 CR0
CR0的初始化状态如下图所示。
若ET位=1,则处理器正在使用协处理器80387,否则正在使用协处理器80287或者没有协处理器。
1.4 其他寄存器
其他几个寄存器的初始化状态如下所示,不在下面列表中的寄存器状态都是不确定的:
- EFLAGS =00000002H
- IP =0000FFF0H
- CS selector =000H
- DS selector =0000H
- ES selector =0000H
- SS selector =0000H
- FS selector =0000H
- GS selector =0000H
- IDTR: base =0, limit =03FFH
上面这些寄存器状态包含的主要信息是处理器初始处于实模式、关中断状态。
2.设计实模式系统软件的初始化要点
2.1第一条指令
处理器初始完后将会执行的第一条指令位于物理地址fffffff0处。
2.2中断处理
关中断只能屏蔽Maskable中断的处理,异常和NMI还是会照常触发,处理器初始化时可以采取下列三种策略中的一种:
- 设置IDTR的LIMIT字段为0,此时若发生异常或NMI将会进行关机
- 在中断处理表中设置可能用到的中断处理函数指针
- 设置完整的中断处理表
3.切换到保护模式
设置CR0寄存器的PE位为1将把处理器切换到保护模式,初始CPL为0。在设置PE后,应当立即通过执行一条JMP指令来清空处理器的流水线。
3.1 初始化GDT
在设置完GDTR前,无法使用分段机制,GDTR必须在PE前设置。
3.2 初始化IDT
可以先设置PE在设置IDTR,也可以先设置IDTR再设置PE,但是应当保证在初始化完IDT后再开启中断。
3.3 开启分页机制
PageDir和PageTab可以在设置PE前后设置都可以。但是CR0中的PG位的设置必须在设置PE位后,或者通过一条指令,同PE位同时设置。
在设置页表时,应注意以下2点:
- 当前正在执行的页在设置PG前后应该映射到相同的物理地址
- 在设置PG后应当立即执行一条JMP指令