LINUX 系统启动过程

原创 2012年03月29日 16:15:40
linux系统启动过程,不同的boot loader和发行版的启动过程略有差异,这里以grub引导centos为例。

系统的启动过程大致为:
         1.BIOS引导阶段
         2.GRUB引导阶段
         3.内核启动阶段
         4.系统初始化阶段

下面详细介绍这四个阶段的过程

一、BIOS引导阶段
    系统上电后,BIOS通过运行POST代码,检查CPU、显卡、内存等系统外围设备,读取CMOS上的硬件配置信息,之后根据BIOS中设置的启动顺序搜索启动驱动器,通常情况下硬盘首先启动。BIOS会读取硬盘的MBR,并执行其中的代码。
    MBR为硬盘的第一个扇区,512字节,可分为三个部分:前446字节存储着主引导记录,之后64字节存储着硬盘的4个主分区记录,最后两个字节为结束标志。
LINUX 系统启动过程 - Decly - Decly的博客
 

二、GRUB引导阶段
    在 BIOS 读完信息后,接下来会到第一个开机装置的MBR去读取 boot loader(这里为GRUB),存放在整个硬盘的第一个扇区内的一个区块,大小也就 446 字节而已,所以将GRUB引导的过程分为两个阶段:
    第一阶段是为执行 boot loader 第二阶段的一个小程序,这个程序必须要被安装在MBR 。
    第二阶段是GRUB的主程序,包括最重要的引导内核,载入initramfs,还有显示配置菜单。

GRUB中有3个重要的文件:stage1、stage1_5、stage2
stage1:存储在硬盘的MBR中,stage1的任务十分简单,就是在系统启动时装载stage2或者stage1_5并将控制权交给它。
satge2:GRUB应用的核心,所有GRUB的功能都是由stage2实现的,但是stage2通常较大,所以是存放在文件系统中的,也就是boot分区下的/boot/grub/stage2文件。
stage1_5:用来识别文件系统,介于stage1和stage2之间,他的存在是因为BIOS在读取stage1之后,stage1要载入stage2,但是由于stage1并不能识别文件系统,而stage2是存在于文件系统中的,所以就有了stage1_5。stage1_5是存储在硬盘0头0道3扇区向后的22个扇区内的,通常不到10K的大小。

有了以上三个文件,GRUB的启动顺序就是这样:stage1 -> stage1_5 -> stage2
在BIOS引导的最后阶段,BIOS将stage1载入内存并执行,通过调用 INIT13中断,将硬盘0头0道2扇区内容载入内存,0头0道2扇区的内容是start.S函数,他才是stage1_5或者stage2的真正加载器,作用是将stage1_5或者stage2载入内存。
因为stage1存在于MBR中,stage2存在于文件系统中,所以这里还分为两种情况:
(1)如果是使用stage1_5 -> stage 2 的方式, 会首先检测是否有合适的文件系统的驱动,载入stage1_5,然后通过使用文件系统的方式找到stage2 ,并载入stage2。
(2)如果是没有stage1_5情况,start.S就会通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,限制在8GB以内。因此这种情况需要将/boot分区应该分在硬盘8GB寻址空间之前。 
这样子GRUB就载入了stage2,之后GRUB的功能就全部支持了,也就可以通过GRUB启动内核并加载initramfs了。

另外重点注意:stage1和stage1_5都是存储在MBR或者之后的空间中的,所以如果将文件系统中的/boot目录下stage1和stage1_5删掉,系统还是可以启动,但是stage2是存储在文件系统中的,如果将stage2删除的话系统启动就会出问题。(我尝试着删除了stage2然后重启,但是系统还是可以启动,这是因为删除stage2后马上重启时,stage2所在的块没有被覆盖掉,所以还是能通过硬盘寻址找到stage2的,如果这个块被别的文件覆盖了的话,那么系统将再也启动不起来了。)

三、内核启动阶段
在第二阶段启动GRUB之后,通过GRUB的boot指令启动linux内核,内核是存放在boot分区下的/boot/grub/kernel-version ,通过解压并将内核载入到内存中,之后将控制权转交给内核。
内核启动后开始检测各种硬件设备,包括储存装置、CPU、网络卡、声卡等。此时内核会以自己的功能重新侦测一次硬件,而不是使用 BIOS 侦测到的硬件信息。
然后内核开始加载各种驱动程序,驱动程序又分为两种情况:
(1)一部分的驱动是直接嵌入内核中的,也就是编译内核的时候选择“*”的驱动,内核会调用这部分驱动初始化相关设备。
(2)另外有一部分设备驱动并没有编入内核,而是作为模块编译。这部分驱动程序放置在initramfs中,initramfs是经过cpio和gzip压缩的文件系统。一般存放在boot分区的/boot/initrd-version,可以用gzip解压后再用cpio解压,得到一系列的目录,是一个精简的文件系统。

在内核启动过程中,会将initramfs释放到rootfs中,然后执行其中的init脚本,这个时候内核的控制权移交给init文件处理,而init文件的内容,主要也是加载各种存储介质相关的设备驱动,比如SATA的驱动、USB驱动和SCSI的驱动等。加载完成后释放虚拟文件系统,开始挂载实际的根目录文件系统, 根目录文件系统挂在完后,就开始到根目录系统中执行相关的初始化系统过程。

另外说明一点:initramfs的使用并不是必须的,他主要是为了加载内核中没有的驱动而存在的,可以把相关的驱动都编译进内核,这样也就不需要initramfs了,直接由内核加载各种驱动然后挂在根文件系统。当然这不是一个好的做法。

四、系统初始化阶段
在挂载根文件系统后,执行的第一个程序是/sbin/init ,也就是ps显示的1号进程,他是所有进程的父进程。
init 主要通过读取/etc/inittab文件进行系统的初始化,例如inittab文件可能为:

#/etc/inittab

id:5:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6

1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6

x:5:respawn:/etc/X11/prefdm -nodaemon


这个文件的语法结构是利用冒号分隔成四个字段:

[设定项目]:[运行级别]:[动作行为]:[指令项目]

1. 设定项目:代表 init 的主要工作项目,只是一个简单的代表说明。
2. 运行级别:该项目在哪些运行级别下运行。
3. 动作行为:表示运行的动作,比如根据定义主要有
  initdefault ---> 代表设置的默认运行等级值
  sysinit ---> 系统初始化的动作
wait ---> 代表指令项目必须要执行完才能继续底下的动作
 respawn ---> 代表指令项目可以无限重生
4. 指令项目:表示要执行的指令,通常是脚本文件。

现在解释下inittab文件的涵义:
(1)取得系统运行级别, 一共有7个运行级别,例如这里设置默认进入X窗口,级别为5
(2)执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要启动相应的服务
(3) 根据运行级别执行/etc/rc.d/rc,关闭和开启相应的服务
(4)启动虚拟终端/sbin/mingetty ,这里开启了tty1~tty6
(5)在运行级别5上运行X窗口
之后系统的启动就全部完成了,也就是机器开机后的状态。





参考:
http://blogt.chinaunix.net/space.php?uid=14735472&do=blog&id=111013
http://bbs.chinaunix.net/thread-2046548-1-1.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

LINUX系统启动过程分析

  • 2009-06-08 22:53
  • 122KB
  • 下载

Linux系统启动过程剖解及故障排除

系统启动顺序: 加载BIOS的硬件信息   └  读取MBR的Boot Loader信息 stage1,stage2,grub.conf         └  Boot Lo...

Linux系统启动过程

  • 2014-05-05 07:41
  • 1.59MB
  • 下载

剖析Linux系统启动过程

  • 2008-01-19 17:26
  • 40KB
  • 下载

剖析Linux系统启动过程

本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。    阅读Linux源代码,无疑是深入学习L...

嵌入式Linux系统启动过程

嵌入式Linux系统启动过程   一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader), Linux 内核,文件系统,应用程序。 当系统首次引导时,或系统被...

Linux系统启动过程

Linux系统启动过程

Linux系统启动过程

内容提要   本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。   阅读Linux源代码,无疑是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)