Linux系统启动流程

       了解Linux系统的启动流程,能够让我们更加深入的去理解操作系统。今天博主就关于Linux系统启动流程做一个简单的总结,希望对小伙伴们有一点启发。其实,前面的几步对于其他操作系统也是通用的,只是不同系统之间在这几步上稍微有那么一点点区别罢了。

第一步--加载BIOS

       当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。在BIOS将系统的控制权交给硬盘第一个扇区之后,就开始由Linux来控制系统了。BIOS是开机主动执行的韧体(写到硬件中的软件程序),找到第一个可开机的设备。

 

第二步--读取MBR

       磁盘的第0磁道第一个扇区主要记录了两个重要的信息,分别是主引导分区(Master Boot Record,可以安装引导加载程序的地方,大小为446Byte。主引导分区的作用之一是找到标记为活动(ACTIVE)的分区,并将活动分区的引导区读入内存。)和分区表(Partition table,记录整块硬盘分区的状态,大小为64Byte)

       系统找到BIOS所指定的硬盘的MBR后,就会将其复制到物理内存(如:0x7c00地址)中。其实被复制到物理内存的内容就是引导加载程序 (Boot Loader,可读取内核文件来执行的软件。Boot Loader的功能主要是提供菜单、加载内核、转交控制权给其他loaderBoot Loader可以安装的地点有两个,分别是MBRboot sector),而具体到你的电脑,那就是lilo或者grub了。

 

第三步--引导加载程序(Boot Loader)

       Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。通常,Boot Loader:是严重地依赖于硬件而实现的,不同体系结构的系统存在着不同的Boot LoaderBoot Loader有若干种,其中GrubLilospfdisk是常见的Boot Loader。系统读取内存中的grub配置信息(一般为menu.lstgrub.lst),并依照此配置信息来启动不同的操作系统。

 

第四步--加载内核

      根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。

       


第五步--用户层init依据inittab文件读取运行级别

      

       内核被加载后,第一个运行的程序便是上述截图中的程序(init进程),该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。其实/etc/inittab文件最主要的作用就是设定Linux的初始默认运行等级,其设定形式是“id:5:initdefault:”,这就表明Linux默认运行在等级5上。Linux的运行等级设定如下:

0:关机

1:单用户模式(类似windows安全模式,启动最小的程序进行系统修复)

2:无网络支持的多用户模式,不含NFS服务(文件共享服务)

3:有网络支持的多用户模式

4:保留,未使用

5:有网络支持有X-Window支持的多用户模式(图形界面)

6:重新引导系统,即重启

runlevel:查看系统当前运行级别(输出:切换前级别 当前级别(N表示NULL,即空级别)

 


第六步--init进程执行/etc/rc.d/rc.sysinit脚本

       在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件。

       线程init的最终完成状态是能够使得一般的用户程序可以正常地被执行,从而真正完成可供应用程序运行的系统环境。它主要进行的操作有:

(1) 执行函数do_basic_setup(),它会对外部设备进行全面地初始化。

(2) 构建系统的虚拟文件系统目录树,挂接系统中作为根目录的设备(其具体的文件系统已经在上一步骤中注册)

(3) 打开设备/dev/console,并通过函数sys_dup()打开的连接复制两次,使得文件号0, 1 ,2 全部指向控制台。这三个文件连接就是通常所说的“标准输入”stdin,“标准输出”stdout和“标准出错信息”stderr这三个标准I/O通道。

(4) 准备好以上一切之后,系统开始进入用户层的初始化阶段。内核通过系统调用execve()加载执行相应的用户层初始化程序,依次尝试加载程序"/sbin/init"," /etc/init"," /bin/init',和“/bin/sh。只要其中有一个程序加载获得成功,那么系统就将开始用户层的初始化,而不会再回到init()函数段中。至此,init()函数结束,Linux内核的引导部分也到此结束。

 

第七步--启动内核模块

       具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。

 

第八步--执行不同运行级别的脚本程序

      根据运行级别的不同,系统会运行rc0.drc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。

 

第九步--执行/etc/rc.d/rc.local

你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:

# This script will be executed *after* allthe other init scripts.

# You can put your own initialization stuffin here if you don’t

# want to do the full Sys V style initstuff.

       rc.local就是在一切初始化工作后,Linux留给用户进行个性化设置的地方。你可以把你想设置和启动的东西放到这里。你可以把一些需要开机启动或完成的事情放在这里,如开机启动服务、打印信息、写配置文件等等。

 

第十步--执行/bin/login程序,进入登录状态

此时,系统已经进入到了等待用户输入usernamepassword的时候了,你已经可以用自己的帐号登入系统了。

 

        整个启动过程到此结束,是不是很easy!。相信你已经熟悉了这个流程,是不是对操作系统有了更深一步的了解呢?当然,如果有什么表述有误的地方,欢迎拍砖啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值