admin 管理员组

文章数量: 1086019


2024年3月30日发(作者:jquery下载文件流)

6.2 Linux系统的引导过程

Linux系统的引导和初始化过程可以分为两个阶段,如图6.3所示

图6.3 Linux内核启动过程示意图

第1阶段:完成硬件检测、初始化和内核的引导。

第2阶段:主要是init初始化进程的执行。

1.BIOS自检

计算机通电后,首先由BIOS进行自检,即所谓的POST(Power On Self Test),对硬件

进行检测,然后BIOS 必须确定要使用哪个设备来引导系统,此时会根据CMOS中设置的

引导顺序,搜索处于活动状态并可引导的设备(硬盘、CDROM、USB设备或软盘),当找

到一个引导设备之后,从中读出引导块或MBR(MBR,Master Boot Record)。主引导记录

MBR中包含主引导加载程序。MBR是一个512B大小的扇区,位于磁盘的第一个扇区中(0

道0面1扇区)。当MBR被加载到RAM中之后,BIOS会把控制权交给MBR。

注意,要看MBR的内容,可以执行如下命令:

# dd if=/dev/hda of= bs=512 count=1

# od -xa

//从/dev/hda上读取前512B的内容,将其写入文件中

//以十六进制和ASCII码格式打印这个二进制文件的内容

MBR中的主引导加载程序是一个512B大小的映像,其中包含程序代码和一个分区表。

前446B是主引导加载程序,其中包含可执行代码和错误消息文本。接下来的64B是分区表,

其中包含4个分区的记录(每个记录的大小是16个字节)。MBR以两个特殊数字的字节

(0xAA55)结束。这个数字会用来进行MBR的有效性检查。

2.启动GRUB

GRUB是引导加载程序,会引导操作系统。当机器引导它的操作系统时,BIOS会读取

引导介质上最前面的512字节(MBR,Master Boot Record)

主引导加载程序(第一阶段的引导加载程序)的主要作用是查找并加载次引导加载程序,

它是通过在分区表中查找一个活动分区来实现这种功能的。当找到一个活动分区时,会扫描

分区表中的其它分区,以确保它们都不是活动的。当这个过程验证完成之后,就将活动分区

的引导记录(第二阶段的引导加载程序)从这个设备中读到RAM中,并执行它。

第二阶段的引导加载程序(次引导加载程序)可以更形象地称为内核加载程序。主要作

用是将默认的内核映像和initrd映像加载到内存中。

在PC环境中,第一阶段和第二阶段的引导加载程序一起称为GRand Unified Bootloader

(GRUB)。在GRUB命令行环境中(启动电脑后,在GRUB界面中按C键进入),可以使

用initrd映像引导一个特定的内核,方法如下:

grub> kernel (hd0,2)/

Possible files are: lost+found sys proc var tmp dev etc root selinux usr bin boot home li

b media mnt opt sbin srv misc tftpboot .autofsck net cache_db

grub> kernel (hd0,2)/boot/5

[Linux-bzImage, setup=0x1e00, size=0x1bbeb4]

grub> initrd (hd0,2)/boot/

[Linux-initrd @ 0x2fd79000, 0x266c72 bytes]

grub>

当内核映像被加载到内存后,内核阶段就加开始了。

3.加载内核

当内核映像被加载到内存中,并且阶段2的引导加载程序释放控制权之后,内核阶段就

开始了。内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个

zImage(压缩映像,小于512KB)或一个bzImage(较大的压缩映像,大于512KB)。在这

个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,

然后将其放入高端内存中,如果有初始RAM磁盘映像,就会将它移动到内存中,并标明以

后使用。然后该例程会调用内核,并开始启动内核引导的过程。

在内核引导过程中,初始RAM磁盘(initrd)是由次引导加载程序加载到内存中的,它

会被复制到RAM中并挂载到系统上。这个initrd会作为RAM中的临时根文件系统使用,

并允许内核在没有挂载任何物理磁盘的情况下完整地实现引导。由于与外围设备进行交互所

需要的模块可能是initrd的一部分,因此内核可以非常小,但是仍然需要支持大量可能的硬

件配置。在内核引导之后,就可以正式挂载根文件系统了,此时会将initrd根文件系统卸载

掉,挂载真正的根文件系统。

注意:在一个没有硬盘的嵌入式环境中,initrd可以是最终的根文件系统,或者通过网

络文件系统(NFS)挂载最终的根文件系统。

4.执行init进程

内核被载入内存,开始运行并初始化所有的设备驱动程序和数据结构等之后,内核将生

成第一个进程―init(实际上依次寻找/sbin/init、/etc/init、/bin/init或/bin/sh,将执行第一个

找到的,如果这4个文件都不存在,将给出“No init found. Try passing init= option to kernel."

错误提示,内核启动失败。详细分析见5.3节)。init进程是一个由内核启动的用户级进程,

是系统上运行的所有其它进程的父进程,它会观察其子进程,并在需要的时候启动、停止、

重启它们,主要用来完成系统的各项配置。该进程对于Linux系统的正常工作是非常重要的。

init的主要工作是根据/etc/inittab文件来执行相应的脚本,进行系统的初始化,如设置键

盘、字体、装载模块、设置网络等。所以,init进程执行的每一步都是由/etc/initab文件中的

配置决定的,以下是RadHat的/etc/inittab文件的例子:

# inittab This file describes how the INIT process should set up

# the system in a certain run-level.

# Author: Miquel van Smoorenburg,

# Modified for RHS Linux by Marc Ewing and Donnie Barnes

# Default runlevel. The runlevels used by RHS are:

# 0 - halt (Do NOT set initdefault to this) //停机(不要把initdefault设置为0,否则开机之后就会自动关机 )

# 1 - Single user mode //单用户模式

# 2 - Multiuser, without NFS (The same as 3, if you do not have networking) //多用户模式,但是没有NFS

# 3 - Full multiuser mode //完全多用户模式

# 4 - unused //没有使用

# 5 - X11 //X-windows模式

# 6 - reboot (Do NOT set initdefault to this) //系统重新启动(不要把initdefault设置为6,否则开机之后就会重启 )

#

id:5:initdefault: //该命令指出缺省的运行级别为5,即开机后进入X-window模式

# System initialization.

#系统启动之后自动执行/etc/rc.d/t脚本,当运行级别为5时,会以5为参数运行/etc/rc.d/rc 5脚本,

# init进程将等待其返回(wait)

si::sysinit:/etc/rc.d/t

l0:0:wait:/etc/rc.d/rc 0

l1:1:wait:/etc/rc.d/rc 1


本文标签: 引导 内核 加载 程序 映像