在本文的第一篇中,我主要对bootsect.s进行了讲述. 在第二部分中,我将对setup.s进行描述,我将其视为是Linux启动的第二步骤.
操作系统的启动过程是一个漫长而有序的过程,各个阶段都有其不同的作用. boot;setup;init虽然看似很接近,但是却是完全不同的过程.他们各司其职,按部就班.boot比较准确的翻译应该是引导,而setup的翻译则是设置或者建立.这听上去可能有点微妙,不要怪我咬文嚼字,请看官少安毋躁,等你看完了setup.s的过程后,你就会有深刻的体会了.
这是本文的第二部分,我将接续第一部分的内容,直接从bootsect运行完毕,跳转到setup.s开始.
在开始之前,让我们先看看现在计算机处在什么样的状态.下图是一个假想的内存空间,当bootsect运行完毕后,计算机的物理内存分配情况如图所示:
内核的system模块现在处于0x10000起始的内存段中,bootsect.s的二进制码处于0x90000起始的内存段中,而现在即将运行的setup.s则被load在0x90200的内存段中. 需要说明的是,下图的运行结果是在0.11版本的Linux运行完毕之后的结果,如2.6这样的高版本,system模块可能已经相当大了,如果放在0x10000位置上,从0x10000到0x90000的内存空间已经容不下它.在这种情况下,system模块会被load至0x100000起始的地址空间中,这就是所谓的"高地址".当前的程序计数器指向0x90200位置上,既从setup.s开始运行.
+--------+
| |
| |
| |
| | <---------0x100000 "高地址"
| |
| |
| |
|---------|
| | &nb