电脑开机 怎么工作
刚关掉的电脑一片漆黑:屏幕黑着,内存空空。可我们学过,内核管着一切:启动进程、在内存里砌墙、接收系统调用。那么,这个内核现在在哪儿?电源关着,内存里什么也没有。在按下电源键的那一瞬间,一台空空的电脑是怎样变成一台活生生、动起来的电脑的?
按下电源,空空的电脑醒过来
想象一台断了电的电脑。它的内存被清得干干净净。我们学了那么多的内核,还有从它那里分出枝杈的进程,此刻在内存里连一行都没有。没有电流,这再自然不过。
按下电源键,总得有谁先迈出第一步。迈出这一步的不是内核,而是一直存放在主板芯片里的一个很小的程序。它叫启动程序,也叫固件。
固件从一开始就待在那里,好在通电时第一个醒来。
按“开机”按钮,在内存原本空空的电脑里,芯片中的小小启动程序(固件,蓝色)最先醒来。内核还哪儿都没有。
醒来的只有小小的固件,内存仍几乎是空的。固件并不聪明,除了简单检查一下各个部件有没有接好,它既不会装点屏幕,也不会启动应用。
它只知道怎样把真正干活的请来,而那个干活的就是内核。可内核现在不在内存里:断电期间,它一直以文件的形式睡在磁盘上。
所以固件的任务很明确:去磁盘把内核请过来。
固件把内核从磁盘搬进内存
回想一下上一课说的:内核常驻内存,管理一切。可就算是常驻内存的内核,也总有第一次进入内存的时刻。这个时刻就是现在。
固件在磁盘上找到内核文件,一块一块搬进内存。在真实的电脑上,固件通常先载入一个叫引导程序的小程序,再由引导程序把内核载入内存。不论哪种方式,原本空空的内存里,内核终于有了自己的位置。
这一单元里一直被称作每一幕主角的内核,正是在开机的这一幕里第一次登场。
每点一次按钮,以文件形式睡在磁盘上的内核(金色)就有一块被搬进内存。四块都上来后,那个“常驻”的内核才第一次坐稳了位置。
内核全部进入内存后,固件便悄悄交了班。小小启动程序的戏份到此为止:它已把真正干活的叫醒、安顿好,接下来的舞台属于内核。
醒来的内核先做什么?单靠内核自己,什么我们看得见的事都做不了。屏幕上的图标、接收键盘输入的窗口、我们打开的应用,都要等某个程序运行起来才会出现。
从这一刻起,整台电脑都由内核负责。所以内核做的第一件事,就是生出第一个进程。
内核生出第一个进程,枝杈由此伸展
回想讲进程的那一课:程序是睡在磁盘上的文件,它运行起来、活动着的状态就是进程。开机时,内核第一次做的正是这件事。
它从磁盘上挑出一个程序来运行,让它成为这台电脑上第一个活着的进程。在 Linux 上,这第一个进程的编号是 1。不过,内核并不亲自一个个启动所有应用。第一个进程会生出别的进程,孩子又生孩子,像一棵树一样伸出枝杈。
我们用的众多程序,全都是从这第一个进程分出来的枝杈。
点一次按钮,内核(金色)下面就生出第一个进程;再点一次,子进程(绿色)就从它那里像枝杈一样伸展出来。
点一下,第一个进程诞生;再点一下,它下面的孩子们一下子伸展开来。这就是我们每天看到的那个屏幕的起点。画桌面的程序、时钟、通知,都是这些枝杈上某处的进程。
这些进程各有自己的内存空间,需要什么时,就用系统调用去请内核帮忙。这一单元里分开学过的碎片,正在开机这一幕里一块块各就各位。
现在,可以把这些碎片一层层叠成一幅图了。
一层层叠起来就完成了(从硬件到应用)
把整体看成一幅图:最下面是硬件,也就是磁盘、内存、屏幕、键盘这些实实在在的部件。它上面,小小的固件醒来迈出第一步,再由固件把内核载入。
内核紧挨着坐在硬件之上,直接和每个部件打交道,在内存里砌墙、安排日程。内核上面是第一个进程,再往上,我们用的应用一个个叠上去。
下层稳稳托住,上层才立得住。没有硬件就没有固件,没有固件就没有内核,没有内核就没有进程,没有进程也就没有应用。这种下层托住上层的结构,通常叫作分层结构。
每点一次按钮,就从下往上多亮一层:硬件、固件、内核、第一个进程、应用。下层先立住,上层才能叠上去。
灯一路亮到最上面的应用,我们看到的屏幕才算完成。原本漆黑的电脑,现在活了过来。
有意思的是,这座塔一建好,固件做过的事几乎就被忘掉了。用着应用的时候,我们几乎意识不到下面有内核托着,更下面还有固件和硬件。
可这一层一层,都是在开机那一瞬间从下往上依次搭起来的。开机时一闪而过的厂商标志画面,正是固件在干活的时候;那个画面快消失时,内核就接手了。
一按电源,这一切都在:整个单元归成一页
串成一条线就是这样:按下电源,芯片里的小小固件醒来,固件把内核从磁盘搬进内存,内核生出第一个进程,应用再从那里伸展出来。
这条几秒钟内走完的线里,装着这一单元学过的几乎所有东西:睡在磁盘上的文件和内存、常驻的内核、活动着的进程、每个进程自己的内存空间、和部件打交道的驱动、决定谁能做什么的权限,还有进程向内核求助的系统调用。
开机,就是这些碎片第一次同时登场、而且按照既定顺序登场的那一幕。
按顺序点五个步骤,开机的一整圈就串成一条线:通电、固件醒来、载入内核、第一个进程、叠起应用。
从此以后,按下电源键的那一瞬间,看起来会和以前不一样。在那一瞬间里,小小的启动程序唤醒内核,内核生出第一个进程,我们的应用一层层往上搭,一场盛大的组装正在进行。
这一单元,是从“屏幕背后那位看不见的管家到底在做什么”这个问题开始的。开机,就是这位管家清早起床,从头开始一步步把家里打理好的那一幕。那是漆黑的机器为迎接我们做好准备、每天都在悄悄重复的一瞬间。