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
版权声明:本文标题:Linux系统的引导过程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1711745335a608621.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论