开机:按一下电源,学过的一切都走上舞台的那一刻
刚关掉的电脑黑漆漆的。屏幕也灭着,内存空空如也。可我们一直学的是,内核管理着一切。它启动进程,在内存里立起墙,接住系统调用。那这个内核,现在到底在哪儿呢?电源关着,内存里什么都没有。那么,在按下电源键的那一瞬间,一台空空的电脑,是怎么变成活生生在运转的电脑的呢?
按下电源:空空的电脑醒过来
想象一台关着电源的电脑。内存被擦得干干净净。我们学了那么久的内核,还有从它身上伸出枝条的那些进程,此刻在内存里一行都没有。没有电流,当然如此。可一按电源键,奇怪的事就开始了。总得有人迈出第一步吧。迈出这第一步的,不是那个气派的内核,而是芯片里一直刻着的、一个很小很小的程序。我们管它叫启动程序,或者固件。固件从一开始就被嵌在那个位置,好让它在通电的那一刻最先醒来。
点一下电源。内存原是空的,接着芯片里那个小小的启动程序(固件,蓝色)最先醒来。内核还哪儿都不在。
醒来的,只有一个小小的固件。内存依旧几乎是空的。固件并不聪明。它不会把屏幕装点得漂亮,也不会启动应用。固件只懂一件事:怎么把真正的干活的请来。那个真正干活的,正是内核。可内核此刻不在内存里。电源关着的那段时间,内核作为一个文件,睡在磁盘上。那么,固件该做的事就很清楚了。到磁盘去,把那个内核请过来。下面就来看这一幕。
固件把内核从磁盘搬进内存
这里,回想一下前面那讲的一个承诺。我们说过,内核一直常驻在内存里,管理着一切。可仔细想想,就算是说一直常驻的内核,总得在某个时刻头一回被装进内存吧。那个时刻,正是现在。固件从磁盘上找到内核文件,一块一块地搬进内存。曾经空空的内存里,内核终于落了座。我们在这整个领域里一直称作每一幕主角的那个内核,就在开机的这一个场景里,才头一回登上舞台。
点一下固件。作为文件睡在磁盘上的内核(金色),一块一块地升进内存。那个被说成一直常驻的内核,正是此刻头一回落座。
内核全部上了内存,固件就悄悄把任务交出去。那个小小启动程序的角色,到这儿就完了。把真正干活的叫醒、安顿好,舞台如今就归内核了。醒来的内核,最先做什么呢?光靠内核自己,它做不出一件我们看得见的事。屏幕上的图标、键盘的输入、我们打开的应用,全都得有谁被运行起来才会有。所以内核做的头一件事,就是生出第一个进程。下面就来看。
内核生出第一个进程,再从它伸出枝条
回想一下讲进程的那一课。我们说过,程序是睡在磁盘上的文件,它运行起来、活生生在动的状态,就是进程。在开机里,内核正是头一回,把这件事做出来。它从睡在磁盘上的程序里挑一个,运行起来,让它成为这台电脑上第一个活生生在动的进程。可内核并不亲自一个一个地启动每个应用。相反,这第一个进程又生出另一个进程,那个孩子再生孩子,就像一棵树那样伸出枝条。我们用的众多程序,全是从这第一个进程上分叉出来的枝条。
点内核,生出第一个进程。再点一下,它的子进程就像枝条一样伸出来。从内核(金色)到第一个进程,从第一个进程到许多个(绿色)。
一按,第一个进程就出现了,再一按,孩子们就在它下面哗地伸了出来。这就是我们每天看到的那个画面的起点。画桌面的程序、时钟、通知,全都是这些枝条某处的进程。而这些进程各自握着自己的内存空间,每当需要什么,就用系统调用向内核请求。我们在这个领域里分开学的那些碎片,正在开机这一个场景里,一块一块地各就各位。现在,我们把这些碎片,一层一层地垒进一张图里吧。
层层垒起,便告完成(从硬件到应用)
现在,把整体看成一张图。最底下是硬件。磁盘、内存、屏幕、键盘这些实在的部件。它上面,小小的固件醒来、迈出第一步,那个固件再把内核搬上来。内核就坐在硬件正上方,跟每个部件直接对话,在内存里立墙、管理调度。内核之上是第一个进程,再往上,我们用的应用一层层垒起来。下面一层稳稳托住,上面一层才立得起来。没有硬件就没有固件,没有固件就没有内核,没有内核就没有进程,没有进程就没有应用,谁都立不起来。
从下往上,一层一层地点亮。按硬件、固件、内核、第一个进程、应用的顺序垒起来。下面一层先立住,才能往上垒。
等灯一直亮到最顶上的应用,我们看到的那个画面才算完成。黑漆漆的电脑,如今活了起来。有意思的是,这座塔一旦建好,固件干过的事就几乎被忘了。我们用着应用,几乎不会意识到它下面有内核,再下面有固件和硬件托着这一切。可那所有的层,都是在开机这一瞬间,从下往上,整整齐齐垒起来的。现在,最后一步,我们从头到尾走一遍,看一按电源,这一切是怎么连成一条线的。
按一下电源,这一切:把整个领域收进一张
把整体连成一条线,是这样的。按下电源,芯片里那个小小的固件醒来,固件把内核从磁盘搬进内存,内核生出第一个进程,应用再从它身上伸出枝条。在这条短短几秒里展开的线中,几乎装着我们在这个领域里学过的一切。睡在磁盘上的文件和内存、一直常驻的内核、活生生在动的进程、每个进程自己的内存空间、跟部件对话的驱动、决定谁能做什么的权限,还有进程向内核请求的系统调用。开机,正是这所有碎片头一回聚到一处、而且按定好的顺序登场的那一幕。
依次点各个步骤,跟着走完一整轮开机。电源、固件醒来、装载内核、第一个进程、应用栈。你在这个领域里学过的碎片,串成一条线。
如今,按下电源键的那个短短的瞬间,看起来会和从前不一样了。因为在它里面,一个小小的启动程序唤醒内核,内核生出第一个进程,我们的应用再一层层往上立,一场庞大的组装正在进行。我们当初是带着这个问题开始这个领域的:操作系统是个干什么活的管家。开机,正是那位管家清早起来、把家里的事从头一桩桩张罗起来的那一幕。是那台黑漆漆的机器把迎接我们的准备做完的、每天悄悄重复的那一瞬间。