浅析Mac OS X与Linux的启动过程

这两天翻阅了一些资料,试图想搞清Mac OS X和Linux操作系统各自的启动过程,下面是我自己的一些学习笔记。

 

首先说说Mac OS X,它的系统启动过程分为两大阶段:系统初始化+用户会话。顾名思义,前者是启动操作系统所需要的过程,后者则是为了初始化用户环境。

大体流程如下:
浅析Mac OS X与Linux的启动过程
    听过这样一个说法,计算机的启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!因此,工程师们把一小段程序装入内存,然后计算机才能正常运行。

在OS X系统中也是这样,Mac计算机的固件被称为BootROM,是一个位于计算机主板上的flash memory芯片。在真正启动操作系统之前,固件就像一个迷你操作系统先运行起来,而它要做的第一件事就是POST。POST测试内建的硬件组件,eg:处理器、系统内存、外设端口etc。(这一阶段顺利完成的标志就是:听到一声启动音,然后在所有屏幕上显示淡灰色背景。)

流程图中的虚线区块是针对系统磁盘采用了FileVault 2加密而言,在此情况下,OS X的引导程序无法被访问,因此系统将从OS X恢复分区启动,该分区中有一个特殊的EFI引导文件,显示一个类似登录窗口的屏幕。解密后,EFI固件被允许访问引导文件。

默认情况下,固件会加载系统引导文件,找到了引导文件后,EFI将会启动引导程序,OS X就开始启动了。(该阶段,主屏幕会显示一个暗灰色的苹果标志。)

引导程序通过Mac的固件启动,它负责加载OS X内核,以及最基本的内核扩展(KEXT)。为加快进程,引导程序会尽可能的加载缓存下来的文件,这显然要比重新加载整个系统快得多。(该阶段顺利完成的标志是一个小的、灰色的旋转齿轮图标。)

当引导程序成功加载了内核与基本的KEXT后,内核就会接管启动进程。因为已有足够的KEXT,内核能够读取整个文件系统,以便加载更多的KEXT,然后开始启动BSD UNIX系统的核心。[此处还未深究]

系统初始化的最后一步,内核会启动第一个非内核进程—系统launchd,它是所有其他进程的父进程,它的第一个任务就是通过启动所有其他系统进程来完成系统初始化。

接下来就到了用户会话过程。Loginwindow负责显示登录界面;用户launchd用于进行用户环境的初始化并启动任何用户级别的进程或应用程序;最后,用户登录到系统之后,就到了会话环境中,而前两个进程会始终运行着。

网上有的资料将OS X的启动分为了近30个过程,不明觉厉,但好像也是将以上各个过程讲得更详细一些、各个进程都指明了吧。

 

然后是Linux,因为花在这上面的时间相对而言少一些,因此概括讲下。(部分摘自网络
浅析Mac OS X与Linux的启动过程

BIOS是基本输入输出系统,存于ROM,计算机通电后,第一件事就是读取它。与OS X一样,BIOS先进行硬件自检,自检完成后,按照启动顺序,搜索处于活动状态并且可以引导的设备,通常,Linux系统都是从硬盘上引导的。

GRUBLILO都是引导加载程序。引导加载程序用于引导操作系统启动。

接下来的步骤就是加载内核映像到内存中,内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压缩,然后将其放入高端内存中。

init进程是系统所有进程的起点,内核在完成核内引导以后,即在本进程空间内加载init程序。init进程可用于扮演终结父进程的角色,同时在进入某个特定的运行级别时运行相应的程序,以此对各种运行级别进行管理。

Init的工作是根据/etc/inittab来执行相应的脚本,进行系统初始化,如设置键盘、字体、装载模块,设置网络等。

最后,login程序会提示使用者输入账号及密码,接着编码并确认密码的正确性,如果账号与密码相符,则为使用者初始化环境,并将控制权交给shell,即等待用户登录。

 

本想比较一下Linux与Mac OS X二者的区别,无奈时间、精力不足,而且用win7这么多年,Linux也用了半年多,但对于这两个系统的差别感知还停留在界面上,无法做到从专业角度深层次地比较。只好想着随着对操作系统的进一步学习,两者的差别在我看来也会逐渐明显吧。

 

欢迎批评指正~