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