Intel80386知识总结: 处理器初始化

====================================================================
本文用于汇总整理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指令

猜你喜欢

转载自chong-zh.iteye.com/blog/1953423