• 电脑启动过程(超详细过程)


    一、前言

    我开始的时候写了一篇关于Linux启动过程的文章,但是不是特别详细,并没有从内核文件的角度去分析Linux的启动过程,今天这篇文章就会比较详细的介绍一下Linux内核的整个启动过程,如果你只是想简单的了解一下Linux是如何启动的话你可以看另一篇文章,如果你想要详细的了解一下Linux是如何启动的,那咱们就直接开始吧!

    Linux启动过程详讲解

    树莓派的启动流程

    二、启动过程概述

    Linux系统的启动过程并不复杂,其过程可以分为5个阶段:

    BIOS自检 --> 读取主引导记录 --> 加载内核 --> 加载init --> 系统启动

    但是我们不是简单的知道这些过程就可以了,我们今天要详细的了解一下每个过程是怎么实现的,每个过程是靠哪个硬件或软件来实现的。

    在这里插入图片描述

    但是我们不能满足与此,我们还需要对Linux启动过程有个更深的了解,下面我们就从上电开始给大家一步一步讲解Linux是如何启动的。

    三、加电自检及初始化

    当Linux上电后,电脑首先会进行硬件的自检,该过程主要检查电脑硬件有没有问题,比如电脑的CPU是否正常、系统主板是否正常、系统ROM BIOS等是否正常。

    在CPU生厂商生产CPU的时候会给CPU内置一系列指令,让CPU通电以后就在固定的内存(ROM)中寻找自检指令,进行自检。该自检程序是保存在主板上的ROM寄存器内固化的BIOS程序,上电后该程序将自动执行。

    当我们按下开机键后会自行FFFF0处的指令:JUMP POST; 跳转到加电自检,POST位于系统BIOS内部。

    在POST中会查找显卡BIOS,并且调用显卡BIOS,完成显卡BIOS的初始化。完成BIOS调用后会依次执行相应设备的BIOS,执行相应设备的初始化,最后会显示启动画面。

    完整的POST自检包括对CPU、系统主板、基本的640KB内存、1MB以上的扩展内存、系统ROM BIOS的测试、CMOS中系统配置的校验、初始化视频控制器、测试视频内存、检验视频信号和同步信号,对VGA接口进行测试、对键盘、软驱、硬盘及CDROM子系统作检查、对并行口(打印机)和串行口(RS232)进行检查。

    自检中如发现有错误,将按两种情况处理:

    • 对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;
    • 对于非严重故障则给出提示或声音报警信号,等待用户处理;

    BIOS的最后一项任务就是将MBR读入到内存中,

    四、主引导记录

    在完成BIOS后系统会从硬盘/软盘/光驱/U盘中读入操作系统(OS),并由操作系统接管计算机。在操作系统接管计算机之后操作系统会读取硬盘(软盘)的首扇区即主启动记录。

    MBR 也就是主引导记录,位于硬盘的 0 磁道、0 柱面、1 扇区中,主要记录了启动引导程序和磁盘的分区表,我们通过下图来看看 MBR 的结构。

    MBR并不存在于任何一个分区中,而是处于分区之上,里面存储着一段用于装载操作系统的小程序。
    在这里插入图片描述
    主启动记录总长度512个字节,主引导记录最后两个字符0xAA55h,在分区表中会被分成不同的扇区,每个扇区又被分成不同的块,来执行不同的功能。

    五、加载kernel

    当主引导记录完成初始化读取到PBR后,主引导记录就会接加载内核kernel,内核kernel是以压缩的形式存储的,所以kernel会经历边解压边运行的过程,将内核加载到内存中运行。

    GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核开始替代 BIOS 接管 Linux 的启动过程了。

    那么,Linux 的内核在 /boot 启动目录中,我们来看看这个目录下的内容吧。
    在这里插入图片描述

    • config-5.4.0-122-generic: 内核的配置文件,内核编译时选择的功能与模块;
    • initrd.img-5.4.0-122-generic: 虚拟文件系统;
    • System.map-5.4.0-122-generic: 内核功能和内存地址的对应列表;
    • lost+found: boot分区的备份目录;
    • grub: 启动引导程GTUB的数据目录;
    • vmlinuz-5.4.0-122-generic: 用于启动的Linux内核。这个文件是一个压缩的内核镜像;

    主引导程序不仅要加载kernel,还要负责加载Initial Ram Disk,又被成为initrd。其目的主要是为了保证一个小体积的内核。initrd为一个简单的文件系统,它包含了一些内核必要的文件和模块。

    基于此,首先将initrd挂载为一个根系统,然后kernel利用这个基本的系统,来检测环境,加载更多的必要的模块。

    在完成所有的加载后,这时kernel已经完全准备就绪。此时initrd对于kernel来说,已经不需要了。这时,kernel会将initrd从根/上卸载,并挂载上真正的根系统,并执行正常的启动程序。

    六、加载init

    Linux系统启动过程中通过init_task创建0idle进程。然后通过kernel_thread创建1init进程。创建该进程时通过系统调用,在内核空间执行用户空间的/sbin/init程序,通过该程序产生出shell,并依赖init衍生出其他进程。

    致谢

    本文主要参考以下文章完成:

  • 相关阅读:
    数据库选型
    机器学习入门(二)一元线性回归
    k8s异常Too many requests: Too many requests, please try again later.
    【初阶与进阶C++详解】第十七篇:红黑树(插入+验证+查找)
    AB试验(四)基于规范流程的一个案例分析
    倩女幽魂手游攻略:云手机自动搬砖辅助教程!
    小米6/6X/米8/米9手机刷入鸿蒙HarmonyOS.4.0系统-刷机包下载-遥遥领先
    el-table <template slot=“header“>不更新问题
    【算法合集】学习算法第一天(链表篇)
    云原生Java架构实战Docker原理说明及使用+idea使用docker插件一键部署(一篇就够了)
  • 原文地址:https://blog.csdn.net/qq_45172832/article/details/126120531