原创 引导PC机

2020-7-18 14:28 1309 10 10 分类: 软件与OS

 首先,机器中的每个CPU都要自行初始化,接着可能要用几分之一秒的时间来执行自测试。在多处理器的系统中,这个过程会更复杂些――但是实际上也并不多。在双处理器的Pentium系统中,一个CPU总是作为主CPU存在,另外一个CPU则是辅CPU。主CPU执行启动过程中的剩余工作,随后内核才会激活辅CPU。在多处理器的Pentium Pro系统中,CPU必须根据Intel定义的算法“抢夺标志”――来动态决定由哪个CPU启动系统。取得标志的CPU启动系统,随后内核激活其它的CPU。无论是哪种情况,启动程序的剩余部分只与一个CPU有关。这样,在随后的一段时间内,我们可以认为该系统中只有一个CPU是可用的,而不考虑其它的CPU,或者说这些CPU被暂时隐藏了。另一方面,内核还需要明确的激活所有其它的CPU――这一点你可以在本章后续部分看到。

接下来,       CPU0xfffffff0单元中取得指令并执行,这个地址非常接近于32CPU的最后可用的地址。因为大多数PC都没有4GBRAM,所以通常在这个地址上并没有实际内存的。内存硬件可以虚拟使用它。对那些确实有4GB内存的机器来说,它们也只是仅仅损失了供BIOS使用的顶端地址空间末尾的少量内存(实际上BIOS在这里只保留了64K的空间――这种损失在4GB的机器中是可以忽略的)。

该地址单元中存储的指令是一条跳转指令,这条指令跳转到基本输入输出(BIOS)代码的首部。BIOS内置在主板中,它主要负责控制系统的启动。请注意CPU实际上并不真正关心BIOS是否存在,这样就使得在诸如用户定制的嵌入系统之类的非PC体系结构的计算机中使用IntelCPU成为可能。CPU执行在目标地址中发现的任何指令,在这里使用跳转指令转移到BIOS只是PC体系结构的一部分。(实际上,跳转指令自己是BIOS的一部分,但是这不是考虑这个问题的最方便的方法。)

BIOS使用内置的规则来选择启动设备。通常情况下,这些规则是可以改变的,方法是在启动过程开始时按下一个键(例如,在我的系统中是Delete键)并通过一些菜单选项浏览选择。但是,通常的过程是BIOS首先试图从软盘启动,如果失败了,就再试图从主硬盘上启动。如果又失败了,就再试图从CD-ROM上启动。为了使问题更具体,这里讨论的情况假定是最普通的,也就是启动设备是硬盘。

从这种启动设备上启动,BIOS读取第一个扇区的信息――首512个字节――称之为主引导记录(MBR)。接下来发生的内容有赖于Linux是怎样在系统上安装的。为使讨论形象具体,我们假定LILO是内核的载入程序。在典型的设置中,BIOS检测MBR中的关键数字(为了确认该数据段的确是MBR)并在MBR中检测引导扇区的位置。这一扇区包含了LILO的开始部分,然后BIOS将其装入内存,开始执行。

注意我们现在已经实现了从硬件和内置软件的范围到实际软件范围的转变,从有形范围到无形范围,也就是说从你可以接触的部分到不可接触的部分。

下面就是LILO的责任了。它把自己其余的部分装载进来,在磁盘上找到配置数据,这些数据指明从什么地方可以得到内核,启动时要通过什么选项。LILO接着装载内核到内存并跳转到内核。

通常,内核以压缩形式存储,只有少量指令足以完成解压缩的任务,也就是自解压可执行文件,是以非压缩形式存储的。因此,内核的下一步工作是自解压缩内核镜像。到这里,内核就已经完成了装载的过程。

下面是到现在进行的步骤地简要描述:

1.       CPU初始化自身,接着在固定位置执行一条指令。

2.       这条指令跳转到BIOS中。

3.       BIOS找到启动设备并获取MBR,该MBR指向LILO

4.       BIOS装载并把控制权转交给LILO

5.       LILO装载压缩内核。

6.       压缩内核自解压并把控制权转交给解压的内核

正如你所见到的,引导过程每一步都将你带入更大量更复杂的代码块中,一直到最后成功地运行了内核为止。

依赖于你计算层次的方式,CPU成为内核引导程序的引导程序的引导程序的引导程序(CPU装载BIOSBIOS装载LILOLILO装载压缩内核,压缩内核装载解压内核;但是你可以合理的考虑是否这些步骤都满足引导程序的定义)。
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条