zoukankan      html  css  js  c++  java
  • Linux学习笔记:系统启动引导过程

    Linux系统启动引导过程

    近期发现自己在仅仅是掌握上有几个比較硬的伤:

    • 一、知识体系碎片,比方Linux,这学点那学点,结果没有成体系,串不起来;

    • 二、记忆时间短暂,非常多的内容学了就忘,最后的结果是遇见一个知识点就能想起来自己的确学过。可是如今记不起来了。

    • 三、理解程度浅显,比方说今天要整理关于Linux引导的内容,之前大体是知道的,不能称之为理解,我觉得在学着一个知识点的时候至少要能系统有条理地讲出来,而不是有个模模糊糊的大体认识。

    个别名词解释

    1.BIOS(Basic Input Output System):基本输入输出系统。事实上。它是一组固化到计算机内主板上一个ROM芯片上的程序。它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序。它可从CMOS中读写系统设置的具体信息。

    2.MBR(Master Boot Record):主引导记录。硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。

    MBR是不属于不论什么一个操作系统。也不能用操作系统提供的磁盘操作命令来读取它,但能够通过命令来改动和重写。

    3.GRUB(GRand Unified Bootloader):GNU GRUB是一个来自GNU项目的多操作系统启动程序。

    GRUB是多启动规范的实现,它同意用户能够在计算机内同一时候拥有多个操作系统,并在计算机启动时选择希望执行的操作系统。GRUB可用于选择操作系统分区上的不同内核。也可用于向这些内核传递启动參数。

    Linux引导过程预览

    从按下电源键后执行的操作:

    Created with Raphaël 2.1.0按下电源键载入BIOS读取MBRBoot LoaderBoot Loader用户层init根据inittab文件来设定执行等级init进程执行rc.sysinit启动内核模块执行不同执行级别的脚本程序执行/etc/rc.d/rc.local执行/bin/login程序。进入登录状态开机完毕

    具体分析引导过程

    第一步、载入BIOS

    BIOS的功能由两部分组成,各自是POST码和Runtime服务。POST阶段完毕后它将从存储器中被清除。而Runtime服务会被一直保留。用于目标操作系统的启动。BIOS两个阶段所做的具体工作例如以下:

    1. 步骤1:上电自检POST(Power-on self test),主要负责检測系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常。比如。最常见的是内存松动的情况。BIOS自检阶段会报错,系统就无法启动起来。

    2. 步骤2:步骤1成功后。便会执行一段小程序用来枚举本地设备并对其初始化。这一步主要是根据我们在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器。如硬盘、光盘、U盘、软盘和网络等。我们以硬盘启动为例。BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节)。然后执行里面的代码。

      实际上这里BIOS并不关心启动设备第一个扇区中是什么内容。它仅仅是负责读取该扇区内容、并执行。
      至此,BIOS的任务就完毕了。此后将系统启动的控制权移交到MBR部分的代码。

    第二步、读取MBR

    系统找到BIOS所指定的硬盘的MBR后,就会将其拷贝到0×7c00地址所在的物理内存中。事实上被拷贝到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。

    补充:

    一个扇区的硬盘主引导记录MBR由4个部分组成。

    1. 主引导程序(偏移地址0000H–0088H),它负责从活动分区中装载,并执行系统引导程序。

    2. 出错信息数据区,偏移地址0089H–00E1H为出错信息,00E2H–01BDH全为0字节。

    3. 分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH–01FDH,每一个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。

    4. 结束标志字,偏移地址01FE–01FF的2个字节值为结束标志0xAA55或0x55AA,称为“魔数”(magic number)。假设该标志错误系统就不能启动。

    第三步、Boot Loader

    Boot Loader 就是在操作系统内核执行之前执行的一段小程序。通过这段小程序。我们能够初始化硬件设备、建立内存空间的映射图。从而将系统的软硬件环境带到一个合适的状态,以便为终于调用操作系统内核做好一切准备。

    Boot Loader有若干种,当中Grub、Lilo是常见的Loader。

    系统读取内存中的grub配置信息(一般为menu.lst或grub.lst)。并按照此配置信息来启动不同的操作系统。

    第四步、载入内核

    根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时。屏幕通常会输出“Uncompressing Linux”的提示。

    当解压缩内核完毕后,屏幕输出“OK, booting the kernel”。

    系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完毕Linux核心环境的建立。至此,Linux内核已经建立起来,基于Linux的程序应该能够正常执行。

    第五步、用户层init根据inittab文件来设定执行等级

    内核被载入后。第一个执行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并根据此文件来进行初始化工作。

    /etc/inittab文件最基本的作用就是设定Linux的执行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux须要执行在等级5上。Linux的执行等级设定例如以下:

    • 0:关机
    • 1:单用户模式
    • 2:无网络支持的多用户模式
    • 3:有网络支持的多用户模式
    • 4:保留,未使用
    • 5:有网络支持有X-Window支持的多用户模式
    • 6:又一次引导系统,即重新启动

    第六步、init进程执行rc.sysinit

    在设定了执行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。

    第七步、启动内核模块

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

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

    根据执行级别的不同,系统会执行rc0.d到rc6.d中的对应的脚本程序。来完毕对应的初始化工作和启动对应的服务。

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

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

    This script will be executed after all the other init scripts.
    You can put your own initialization stuff in here if you don’t
    want to do the full Sys V style init stuff.

    rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你能够把你想设置和启动的东西放到这里。

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

    此时,系统已经进入等待用户输入username和password状态,用户能够用自己的帐号登入系统

  • 相关阅读:
    01-节点层次
    WebAPI02
    WebAPI01
    牛客剑指Offer7
    Python字典排序
    Python字典中的键映射多个值
    计算机硬件的主要技术指标
    计算机的基本组成
    计算机系统概论
    数据库概论
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7206823.html
Copyright © 2011-2022 走看看