Linux启动过程(超详细过程)

  • 一、前言
  • 二、启动过程概述
  • 三、加电自检及初始化
  • 四、主引导记录
  • 五、加载kernel
  • 六、加载init
  • 致谢

一、前言

我开始的时候写了一篇关于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衍生出其他进程。

致谢

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

  • Linux系统启动管理
  • Linux内核加载全流程
  • Linux启动流程详解
  • 操作系统原理-华中科技大学
  • Linux启动流程 | kernel执行第一个init应用程序的实现原理

电脑启动过程(超详细过程)相关推荐

  1. 【PyTorch】构造VGG19网络进行本地图片分类(超详细过程)——项目介绍

    本篇博客主要解决以下3个问题: 如何自定义网络(以VGG19为例). 如何自建数据集并加载至模型中. 如何使用自定义数据训练自定义模型. 第一篇:[PyTorch]构造VGG19网络进行本地图片分类( ...

  2. VMware安装Centos7超详细过程(图文)

    原文:https://www.jianshu.com/p/ce08cdbc4ddb?utm_source=tuicool&utm_medium=referral 本篇文章主要介绍了VMware ...

  3. VMware安装Centos7和卸载超详细过程(图文)

    下载Centos7镜像 下载地址 提供几个下载Linux镜像的网站,这里我下载的是Centos7.9版本的系统,内核版本为3.10.0版本 国内外镜像源: 阿里云:http://mirrors.ali ...

  4. 使用Matlab工具箱(procamcalib)进行投影仪标定---超详细过程

    使用Matlab工具箱(procamcalib)进行投影仪标定-超详细过程 一 .procamcalib工具箱应用场景 同于相机标定的方法和步骤,投影仪的原理通常被看作是相机成像的逆过程,网上关于相机 ...

  5. SVM支持向量机 超详细过程讲解

    SVM支持向量机 超详细过程讲解 前言 一.线性模型 前言 此篇文章为B站浙大机器学习课程支持向量机部分的个人笔记,不喜勿喷.笔记顺序从线性模型到非线性模型,层层递进,十分易懂. 一.线性模型 先从一 ...

  6. 电脑技巧全书(超详细.)

    目录检索(相关文章在对应的目录下找~~)~~ 1.最全的windows操作系统快捷键-------------------------------------1楼   2.Windows 开始→运行→ ...

  7. Windows10+YOLOV3+VisualStudio2017最新版本超详细过程

    最近两天在看yolo项目,所以想着把作者的项目copy一下运行看一下效果,谁知道一不小心,陷入坑中无法自拔.真实感叹作者的厉害之处. 同时也记录了自己Windows10+YOLOV3+VisualSt ...

  8. Apache Hive 2.1.1 安装配置超详细过程,配置hive、beeline、hwi、HCatalog、WebHCat等组件...

    2019独角兽企业重金招聘Python工程师标准>>> 在Docker环境成功搭建了Apache Hadoop 2.8 分布式集群,并实现了NameNode HA.ResourceM ...

  9. 【干货】Apache Hive 2.1.1 安装配置超详细过程,配置hive、beeline、hwi、HCatalog、WebHCat等组件...

    在Docker环境成功搭建了Apache Hadoop 2.8 分布式集群,并实现了NameNode HA.ResourceManager HA之后(详见我的另一篇博文:Apache Hadoop 2 ...

最新文章

  1. c++ 怎么读取rtf文件_最全集合!Word、PPT、Excel、PDF文件转换方法大全!建议收藏...
  2. 【转】JavaScript事件顺序
  3. 当对象与原型有相同的属性,调用时的上下文指向问题
  4. 利用Virtual Audio Cable实现系统声音录制
  5. 【最详细解析】1052 卖个萌 (20分)_28行代码AC
  6. 迭代反投影法代码_程序员的数学笔记3--迭代法
  7. java空格 逗号_Java将字符串中的空格换为逗号
  8. codeforces 467A-C语言解题报告
  9. 专题导读:科学数据治理
  10. docker pull 国内镜像_MAC版 的最新Docker 2.2版本配置国内代理的解决办法
  11. JQuery选择器中含有冒号的ID处理差异的分析
  12. pythongetpass_Python模块之getpass模块的使用
  13. 有关古文的C语言编程题,文言文考试也编程,文言语言!!!(附c/c++自译)
  14. 多层感知机从零开始实现
  15. gmp计算机分类,GMP附录——计算机化系统汇总.pptx
  16. JavaScript 运算符
  17. 英文论文发表必备干货!SCI投稿7个阶段经典邮件模板,请拿走
  18. 《Metasploit魔鬼训练营》 第二、三章
  19. 靠写代码登上胡润富豪榜花半年写得Python基础 入门必看
  20. 亲情的矛盾都是因为爱而化解 写给17 岁的你

热门文章

  1. 计算机无法启动打印机,打印机无法启动打印作业是怎么回事
  2. ISO14000系列标准特点(转载)
  3. 比较避孕套、安全期、避孕药、体外排精的避孕方法效果
  4. 【sass】安装及入门教程
  5. 社区O2O是什么 怎么做好社区O2O?
  6. Azkaban 是什么?有什么特点?
  7. 音视频传输中时间戳小头处理方式
  8. B站不挡脸弹幕 这到底是什么黑科技?
  9. 成人高考中湖南师范大学录取分数线是
  10. Java 中使用数学的Math.log的方法