• 7、Linux 的启动过程


    启动第一步--加载 BIOS

    因为 BIOS 中包含了 CPU 的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP 特性等等

     

    启动第二步--读取 MBR

    硬盘上第 0 磁道第一个扇区被称为 MBR,也就是 Master Boot Record,即主引导记录,它的大小是 512 字节,别看地方不大,可里面却存放了预启动信息、分区表信息。

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

    启动第三步--Boot Loader
    Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,
    以便为最终调用操作系统内核做好一切准备。
    Boot Loader 有若干种,其中 Grub、Lilo 和 spfdisk 是常见的 Loader。我们以 Grub 为例来讲解吧,毕竟用 lilo 和 spfdisk 的人并不多。

    系统读取内存中的 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:系统停机(关机)模式,系统默认运行级别不能设置为0,否则不能正常启动,一开机就自动关机。
    1:单用户模式,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录。
    2:多用户模式,没有NFS网络支持。
    3:完整的多用户文本模式,有NFS,登陆后进入控制台命令行模式。
    4:系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
    5:图形化模式,登陆后进入图形GUI模式或GNOME、KDE图形化界面,如X Window系统。
    6:重启模式,默认运行级别不能设为6,否则不能正常启动,就会一直开机重启开机重启。

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

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

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


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

    你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然。rc.local 就是在一切初始化工作后,Linux 留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。

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

  • 相关阅读:
    算法学习-顺序查找
    EF框架中Attach与Entry
    EntityFramework更新实体绑定实体字段简便方法
    C# 快速写入本地文件
    Vue 3.0初探
    二维管线生成三维管线,转换3DTiles 思路
    Civil3d中 如何用管轴线的变坡点桩号控制其他纵断面数据的显示?
    jupyter
    jenkins
    ambari
  • 原文地址:https://www.cnblogs.com/whxiao/p/13432026.html
Copyright © 2020-2023  润新知