您的位置:首页 > 其它

pc 启动过程

2005-03-23 16:29 211 查看
一、引言

最近在网上经常看到有朋友在问计算机(pc计算机)的启动过程,这个过程确实很神秘但并不复杂。我虽然不是一个系统程序员,但一直比较关心底层的东西,这篇文章就算是自己对这个问题的总结,但愿也能给那些希望了解这个神秘过程的朋友一些帮助。

二、PC机的硬件初始化

当我们按下PC机的开关后或者CPU的RESET管脚有信号时,CPU就进入了硬件初始化阶段。在这个阶段,CPU做大量的工作,检测自己内部的各个组件的状态,初始化各个寄存器,初始化算数协处理器的内部寄存器等等。初始化过程结束后,系统内部的寄存器都有了稳定且固定的值。表一列出了Pentium 4 CPU初始化后的状态,关于其它CPU的状态,朋友们可以参考Intel的相关手册,我这里的数据也来源于Intel的资料。(IA-32 Intel Architecture Software Developer’s Manual Volume 3: System Programming Guide)这个表里只列出了大家关心的一些寄存器的初始值,其它内容可参见Intel的手册。

表一
[/b]
寄存器
[/b]
初始值
[/b]
EFLAGS
00000002H
EIP
0000FFF0H
CR0
60000010H
CS
Selector = F000H
Base = FFFF0000H
Limit = FFFFH
AR = Present, R/W
Accessed
DS ES SS FS GS
Selector = 0000H
Base = 00000000H
Limit = FFFFH
AR = Present, R/W
Accessed
根据CR0的初始值,我们可以看出CPU初始化后是运行在实模式不分页的状态。
这里重点要解释的是CS的初始值,为了说明这个值的特殊,我先偏离一下主题,我先向大家解释一下386系列的段寄存器的一些特殊的地方。在386或者更高的32位处理器中,CS,DS,ES,SS,FS,GS寄存器仍然是16位的,只不过,它们里面放的东西现在有个新的名字“选择子” 除了我们能看到的这个选择子外,这些寄存器里还有一个我们看不到的影子部分,这个部分主要包括Base,limit,access等等。这些东西的作用主要是内存寻址和保护等功能。现在的寻址方式其实是这样:
Line address = Selector.Base + offset
这种寻址方式是386系列的唯一寻址方式,不论是在实模式还是保护模式。有些资料上认为,在实模式下,地址的生成是:
段寄存器值X16 + 偏移
其实在CPU的地址生成部件中,形成地址的方式是段选择子里面的不可见部分的base+偏移。只是在实模式下当我们装入段选择子的时候,系统自动为我们设置好了段选择子中的不可见部分。让我们来举个例子吧,比如我们现在要把DS中装入1000H
MOV AX, 1000H
MOV DS, AX

当我们在实模式下执行这条指令的时候,CPU已经悄悄的为我们设置了DS中的不可见部分,结果如下:
DS.Base = 10000H
DS.Limit = FFFFH
这样当我们执行指令的时候CPU就直接到段寄存器的不可见部分取出Base.
好了,我们回到主题。当CPU初始化完成后,CS.Base = FFFF0000H EIP = 0000FFF0H, 所以,系统会跳到地址FFFFFFF0H去执行初始化后的第一条指令,由于现在系统并没有启用分页机制,所以现在的这个地址就是物理地址。在PC机的设计上,这个地址是一个ROM地址,里面存放着BIOS。

三、BIOS初始化
BIOS接管了计算机,它做上电自检(POST)、设置中断向量、填写BIOS的数据区、硬件设备初始化等等工作。虽然BIOS代码是在系统最高的64K中执行,但它要把很多数据填写到物理内存的最低1M空间中去,这个是完全可以办到的,应为现在的DS.Base = 00000000H,如果把DS(或者ES等)当成段基址的话,BIOS可以很好的将一些变量放置到系统的低1M空间中。
除了这些以外,还有一件很重要的事情就是把自己从系统的高地址区搬移到1M空间一下的64K中,为什么要把自己搬移到1M 以下呢?由于系统先在工作在实模式下,它还要为实模式下程序提供服务,还要提供一些硬件中断服务。这些就和老旧的8086一样,如果我们不把BIOS搬移下来,那实模式下的硬件中断就没有服务的代码了。但是,把BIOS从高端搬下来如何做呢?听起来很简单,但是别忘记,现在我们还是在实地址模式下,DS或者别的段寄存器只能定位到地址为低1M的空间,为了实现这次代码搬移,有不同的办法,但是我见到的一些BIOS代码中是把CPU进入保护模式,这个时候,DS和ES都可以访问系统中的全部地址空间,于是,就成功地把代码从系统最高的64k搬移到了系统低1M的空间中,这个时候,BIOS又把系统切换到了实地址模式并执行一次段间跳转,就跳到了系统的低1M空间。BIOS初始化完成后,就要装入操作系统了。
别急,朋友们想过么?现在的BIOS已经搬到了RAM中,但是我们用DEBUG或者Softice等工具并没有办法修改F0000H 到 FFFFFH的内存,难道这里的存储器真的是ROM么,不可能,如果是ROM的话,我们就不可能把高端64k的东西搬下来。呵呵,首先告诉大家,这里的确是RAM只不过不让我们写,为什么在BIOS初始化的时候可以写,而我们不能写呢?原来这里的内存被系统设置为不能写的Shadow RAM,我们可以通过对主板上的芯片组进行编程来修改某些内存区域的特性,设置需要直接用out指令写入22H和23H,由于各个芯片组的指令不同,这个设置我没有亲自做过(毕竟自己的机器,别写坏了J),这样就清楚了,原来BIOS在搬移后,会把目的区的内存属性设置为只读。

四、操作系统的引导
关于操作系统的引导,我想资料很多,也不复杂,这里就不需要多说了。

五、结语
以上是我的一点总结,希望能和大家一起交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: