Linux 系统开机加电后发生了什么?( 五 )


但是,似乎很少通过这种方式启动操作系统 。如果操作系统确实安装在扩展分区,一般采用下一种方式启动 。
情况C:启动管理器
在这种情况下,计算机读取”主引导记录”前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的“启动管理器”(boot loader),由用户选择启动哪一个操作系统 。
Linux环境中,目前最流行的启动管理器是Grub 。
Boot Loader 就是在操作系统内核运行之前运行的一段小程序 。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备 。
Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader 。
我们以Grub为例来讲解吧,毕竟用lilo和spfdisk的人并不多 。

Linux 系统开机加电后发生了什么?

文章插图
 
为什么这么复杂早期的操作系统并没有那么复杂,当然bootload也没有那么多功能,但是如今我们的操作系统越来越复杂,bootload也越来越庞大,而且如今在一台电脑上安装多系统变得那么平常,因此之前简单的bootload已经无法满足这些功能 。
BIOS和MBR都是硬件本身会支持的功能,至于Boot Loader则是操作系统安装在MBR上面的一套软件 。由于MBR仅有446bytes而已,因此这个引导加载程序是非常小而完美的 。这个BootLoader的主要任务如下
  • 提供菜单:用户可以选择不同的开机选项,这也是多重引导的重要功能
  • 载入内核文件:直接指向可开机的程序段来开始操作系统 。
  • 转交其他Loader:将引导加载功能转交给其他loader负责
上面的前两点还容易理解,但是第三点很有趣!那表示你的计算机系统里面可以具有两个以上的引导加载程序呢 。有可能吗?我们的硬盘不是只有一个MBR而已?但是引导加载程序除了可以安装在MBR之外,还可以安装在每个分区的引导扇区 。
举一个例子来说,假设你的个人计算机只有一块硬盘,里面分成4个分区 。其中第一,二分区分别安装了windows及Linux,你要如何在开机的时候选择用Windows还是Linux开机呢?假设MBR内安装的是可以同时识别Windows和Linux操作系统的引导加载程序,那么整个流程如下
做个总结就是这样:
  • 每个分区都有自己的启动扇区
  • 系统分区为第一及第二分区
  • 实际可开机的内核文件是放置到各分区内的
  • loader只会认识自己的系统分区内的可开机内核文件,以及其他的Loader而已
  • loader可直接指向或者是间接将管理权交给另一个管理程序
现在想一下,为什么人家常说:”如果要安装多重引导,最好先安装Windows再安装Linux呢“?
这是因为Linux在安装时,你可以选择将引导加载程序安装在MBR或个别分区的启动扇区,而且Linux的Loader可以手动设置菜单,所以你可以在Linux的Boot Loader里面加入Windows开机选项
Windows在安装的时候,他的安装程序会主动覆盖掉MBR以及自己所在分区的启动扇区,你没有选择的机会,而且他没有让我们自己选择菜单功能
加载操作系统内核用户选择要加载的内核之后,次引导加载程序(GRUB)就会根据/boot/grub.conf配置文件中所设置的信息,从/boot/所在的分区上读取Linux内核映像,然后把内核映像加载到内存中并把控制权交给Linux内核 。
linux内核获得控制权之后开始干自己的事
  • 检测硬件
  • 解压缩自己并安装必要驱动
  • 初始化与文件系统相关的虚拟设备,LVM或RAID
  • 装载根文件系统,挂在根目录下面
  • 完成之后,linux在进程空间里面加载init程序,下面轮到init干活
根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作 。此时,屏幕一般会输出“Uncompressing Linux”的提示 。当解压缩内核完成后,屏幕输出“OK, booting the kernel” 。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立 。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了 。
启动第五步 用户层init依据inittab文件来设定运行等级


推荐阅读