第十九章、【Linux】开机流程、模块管理与Loader

news2025/1/16 16:07:27

19.1.1 开机流程一览

以个人计算机架设的 Linux 主机为例,当你按下电源按键后计算机硬件会主动的读取 BIOS 或 UEFI BIOS 来载入硬件信息及进行硬件系统的自我测试, 之后系统会主动的去读取第一个可开机的设备 (由 BIOS 设置的) ,此时就可以读入开机管理程序了。

开机管理程序可以指定使用哪个核心文件来开机,并实际载入核心到内存当中解压缩与执行, 此时核心就能够开始在内存内活动,并侦测所有硬件信息与载入适当的驱动程序来使整部主机开始运行,主机系统开始运行后,此时 Linux 才会调用外部程序开始准备软件执行的环境,并且实际的载入所有系统运行所需要的软件程序,最后系统就会开始等待你的登陆与操作。

19.1.2 BIOS, boot loader 与 kernel 载入

BIOS:不论传统 BIOS 还是 UEFI BIOS 都会被简称为 BIOS;

MBR:虽然分区表有传统 MBR 以及新式 GPT,不过 GPT 也有保留一块相容 MBR 的区块,因此,下面的说明在安装 boot loader 的部份,简称MBR。

BIOS, 开机自我测试与 MBR/GPT

在个人计算机架构下,你想要启动整部系统首先就得要让系统去载入 BIOS (Basic Input Output System),并通过 BIOS 程序去载入 CMOS 的信息,并且借由 CMOS 内的设置值取得主机的各项硬件设置, 例如 CPU 与周边设备的沟通频率啊、开机设备的搜寻顺序啊、硬盘的大小与类型啊、 系统时间啊、各周边总线的是否启动 Plug and Play (PnP, 随插即用设备) 啊、 各周边设备的 I/O 位址啊、以及与 CPU 沟通的 IRQ 岔断等等的信息。

在取得这些信息后,BIOS 还会进行开机自我测试 (Power-on Self Test, POST)。 然后开始执行硬件侦测的初始化,并设置 PnP 设备,之后再定义出可开机的设备顺序,接下来就会开始进行开机设备的数据读取了。

由于我们的系统软件大多放置到硬盘中,所以 BIOS 会指定开机的设备好让我们可以读取磁盘中的操作系统核心文件。 但由于不同的操作系统他的文件系统格式不相同,因此我们必须要以一个开机管理程序来处理核心文件载入 (load) 的问题, 因此这个开机管理程序就被称为 Boot Loader 了。那这个 Boot Loader 程序安装在哪里呢?就在开机设备的第一个扇区(sector) 内,也就是我们一直谈到的 MBR (Master Boot Record, 主要开机记录区)。

既然核心文件需要 loader 来读取,那每个操作系统的 loader 都不相同, 这样的话 BIOS 又是如何读取 MBR 内的 loader 呢?其实 BIOS 是通过硬件的 INT 13 中断功能来读取 MBR 的,也就是说,只要 BIOS 能够侦测的到你的磁盘(不论该磁盘是 SATA 还是 SAS 接口),那他就有办法通过 INT 13 这条信道来读取该磁盘的第一个扇区内的 MBR 软件啦!这样 boot loader 也就能够被执行。

我们知道每颗硬盘的最前面区块含有 MBR 或 GPT 分区表的提供 loader 的区块,那么如果我的主机上面有两颗硬盘的话, 系统会去哪颗硬盘的最前面区块读取 boot loader 呢?这个就得要看 BIOS 的设置了。 基本上,我们常常讲的“系统的 MBR”其实指的是 第一个开机设备的 MBR 才对! 所以,改天如果你要将开机管理程序安装到某颗硬盘的 MBR 时, 要特别注意当时系统的“第一个开机设备”是哪个,否则会安装到错误的硬盘上面的 MBR。

Boot Loader 的功能

刚刚说到 Loader 的最主要功能是要认识操作系统的文件格式并据以载入核心到内存中去执行。 由于不同操作系统的文件格式不一致,因此每种操作系统都有自己的 boot loader。用自己的 loader 才有办法载入核心文件,多重操作系统就是在一部主机上面安装多种不同的操作系统。

其实每个文件系统(filesystem, 或者是 partition) 都会保留一块开机扇区 (boot sector) 提供操作系统安装boot loader , 而通常操作系统默认都会安装一份 loader 到他根目录所在的文件系统的 bootsector 上。如果我们在一部主机上面安装 Windows 与 Linux 后,该 boot sector, boot loader与 MBR 的相关性会有点像下图:

                          

                 图19.1.1、boot loader 安装在 MBR, bootsector 与操作系统的关系

如上图所示,每个操作系统默认是会安装一套 boot loader 到他自己的文件系统中 (就是每个filesystem 左下角的方框),而在 Linux 系统安装时,你可以选择将 boot loader 安装到 MBR去,也可以选择不安装。 如果选择安装到 MBR 的话,那理论上你在 MBR 与 boot sector 都会保有一份 boot loader 程序的。 至于 Windows 安装时,他默认会主动的将 MBR 与 bootsector 都装上一份 boot loader!所以啦, 你会发现安装多重操作系统时,你的 MBR 常常会被不同的操作系统的 boot loader 所覆盖。

虽然各个操作系统都可以安装一份 boot loader 到他们的 boot sector 中, 这样操作系统可以通过自己的 boot loader 来载入核心了。问题是系统的 MBR 只有一个,那要怎么执行boot sector里面的loader呢?

boot loader 主要的功能如下:

  • 提供菜单:使用者可以选择不同的开机项目,这也是多重开机的重要功能!
  • 载入核心文件:直接指向可开机的程序区段来开始操作系统;
  • 转交其他 loader:将开机管理功能转交给其他 loader 负责。

由于具有菜单功能,因此我们可以选择不同的核心来开机。而由于具有控制权转交的功能,因此我们可以载入其他 boot sector 内的 loader,不过 Windows 的 loader 默认不具有控制权转交的功能,因此你不能使用 Windows 的 loader 来载入 Linux 的 loader。

载入核心侦测硬件与 initramfs 的功能

当我们借由 boot loader 的管理而开始读取核心文件后,接下来, Linux 就会将核心解压缩到内存当中, 并且利用核心的功能,开始测试与驱动各个周边设备,包括储存设备、CPU、网卡、声卡等等。 此时 Linux 核心会以自己的功能重新侦测一次硬件,而不一定会使用 BIOS侦测到的硬件信息。核心文件一般放置在/boot里面,取名为/boot/vmlinuz。

从上表中的特殊字体,我们也可以知道 CentOs 7.x 的 Linux 核心为 3.10.0-229.el7.x86_64这个版本!为了硬件开发商与其他核心功能开发者的便利, 因此 Linux 核心是可以通过动态载入核心模块的 (就请想成驱动程序即可),这些核心模块就放置在 /lib/modules/ 目录内。由于模块放置到磁盘根目录内 (要记得 /lib 不可以与 / 分别放在不同的 partition !), 因此在开机的过程中核心必须要挂载根目录,这样才能够读取核心模块提供载入驱动程序的功能。 而且为了担心影响到磁盘内的文件系统,因此开机过程中根目录是以只读的方式来挂载的。

一般来说,非必要的功能且可以编译成为模块的核心功能,目前的 Linux distributions 都会将他编译成为模块。 因此 USB, SATA, SCSI... 等磁盘设备的驱动程序通常都是以模块的方式来存在的。 现在来思考一种情况,假设你的 linux 是安装在 SATA 磁盘上面的,你可以通过BIOS 的 INT 13 取得 boot loader 与 kernel 文件来开机,然后 kernel 会开始接管系统并且侦测硬件及尝试挂载根目录来取得额外的驱动程序。

问题是,核心根本不认识 SATA 磁盘,所以需要载入 SATA 磁盘的驱动程序, 否则根本就无法挂载根目录。但是 SATA 的驱动程序在 /lib/modules 内,你根本无法挂载根目录又怎么读取到 /lib/modules/ 内的驱动程序,所以需要通过虚拟文件系统来处理。

虚拟文件系统 (Initial RAM Disk 或 Initial RAM Filesystem) 一般使用的文件名为/boot/initrd 或 /boot/initramfs ,这个文件的特色是,他也能够通过 boot loader 来载入到内存中,然后这个文件会被解压缩并且在内存当中仿真成一个根目录, 且此仿真在内存当中的文件系统能够提供一支可执行的程序,通过该程序来载入开机过程中所最需要的核心模块, 通常这些模块就是 USB, RAID, LVM, SCSI 等文件系统与磁盘接口的驱动程序,等载入完成后, 会帮助核心重新调用 systemd 来开始后续的正常开机流程。

                            图19.1.3、BIOS 与 boot loader 及核心载入流程示意图

如上图所示,boot loader 可以载入 kernel 与 initramfs ,然后在内存中让 initramfs 解压缩成为根目录, kernel 就能够借此载入适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统,就能够开始后续的正常开机流程。 更详细的 initramfs 说明,你可以自行使用 man initrd 去查阅看看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1016287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程安全问题的原因及解决方案

要想知道线程安全问题的原因及解决方案,首先得知道什么是线程安全,想给出一个线程安全的确切定义是复杂的,但我们可以这样认为:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,…

基于 IntelliJ 的 IDE 将提供 Wayland 支持

导读对于使用 IntelliJ 开发环境的用户,JetBrains 一直致力于提供原生 Wayland 支持。 JetBrains 正在致力于为基于 IntelliJ 的 IDE 提供 Wayland 支持,以增强 Linux 桌面体验以及在 Windows Subsystem for Linux 下运行。 Wayland 支持功能尚未完成&…

Jmeter性能实战之分布式压测

分布式执行原理 1、JMeter分布式测试时,选择其中一台作为调度机(master),其它机器作为执行机(slave)。 2、执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行,slave执行时不需要启动GUI&#xff0…

专栏十:10X单细胞的聚类树绘图

经常在文章中看到对细胞群进行聚类,以证明两个cluster之间的相关性,这里总结两种绘制这种图的方式和代码,当然我觉得这些五颜六色的颜色可能是后期加的,本帖子只总结画树状图的方法 例一 文章Single-cell analyses implicate ascites in remodeling the ecosystems of pr…

zemax慧差与消慧差

基础设置: 该表面用于对系统的波前进行调制,得到想要的波前形状 通过理想透镜的光线在像空间聚焦,得到完美的球面波,经过调制可以模拟出任意的像差 这里的系数为泽尼克系数 1:平移 2:x轴倾斜 3&#x…

C盘简易无门槛清理指南

C盘在日常使用过程中会逐渐越来越少明明什么也没装,C盘空间却满了,导致最后爆满出现系统运行变慢,软件卡等现象。但随便删除一些东西,系统就崩溃了。本篇分析原因和介绍一些解决方法。 爆满原因主要分为四大类: 一&a…

浅谈C++|文件篇

引子&#xff1a; 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放通过文件可以将数据持久化。C中对文件操作需要包含头文件< fstream > 。 C提供了丰富的文件操作功能&#xff0c;你可以使用标准库中的fstream库来进行文件的读取、写入和定位…

Mobirise for Mac:轻松创建手机网站的手机网站建设软件

如果你是一位设计师或者开发人员&#xff0c;正在寻找一款强大的手机网站建设软件&#xff0c;那么Mobirise for Mac绝对值得你尝试。这个独特的应用程序将帮助你轻松创建优雅而实用的手机网站&#xff0c;而无需编写复杂的代码。 Mobirise for Mac的主要特点包括&#xff1a;…

Java ReentrantLock锁源码走读

目录 多线程例子程序&#xff1a;两个线程累加共享变量&#xff0c;结果正确非公平锁加锁&#xff08;即 lock.lock();&#xff09;过程非公平锁解锁&#xff08; lock.unlock();&#xff09;过程公平锁公平锁的加锁逻辑公平锁的释放锁逻辑 多线程例子程序&#xff1a;两个线程…

【JavaSE笔记】继承与多态(万字详解)

一、前言 在Java的核心概念中&#xff0c;继承和多态无疑是重要的一环。它们都是Java以及其他许多面向对象编程语言的基石&#xff0c;为我们提供了强大的工具来创建模块化&#xff0c;可重用和易于维护的代码。继承让我们可以创建新的类&#xff0c;通过继承现有类的属性和方…

关于单片机的分频定时器的记录

记录一内部时钟&#xff1a; 对于单片机的频率原来一直不太明白&#xff0c;现在在学习进行记录&#xff1a; 主频&#xff1a; 以一个72M的STM32单片机作为主频为例子&#xff0c;这个72M主频说得是一秒钟产生72000000&#xff08;七千两百万&#xff09;个脉冲或周期&…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 数据压缩打更新 (本篇有数据到列节点异步但不延迟的解释)...

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

使用ChatGPT和Blender绘制金色球的完整指南

简介&#xff1a; 在本篇博客中&#xff0c;我们将了解如何结合使用ChatGPT和Blender来创建一个金色的球体。ChatGPT是OpenAI开发的强大自然语言处理模型&#xff0c;而Blender则是一款流行的3D建模和渲染软件。通过结合这两个工具&#xff0c;您可以获得详细的指导&#xff0c…

【JavaEE】_JavaScript(WebAPI)

目录 1. DOM 1.1 DOM基本概念 1.2 DOM树 2. 选中页面元素 2.1 querySelector 2.2 querySelectorAll 3. 事件 3.1 基本概念 3.2 事件的三要素 3.3 示例 4.操作元素 4.1 获取/修改元素内容 4.2 获取/修改元素属性 4.3 获取/修改表单元素属性 4.3.1 value&#xf…

04条件构造器和常用接口

条件构造器和常用接口 wapper介绍 条件构造器的两个条件之间默认就是AND并列关系,如果需要或者的关系则需要调用构造器的or()方法 条件构造器类型作用Wrapper条件构造抽象类,最顶端父类AbstractWrapper生成SQL的where条件QueryWrapper封装查询或删除的条件UpdateWrapper封装修…

Python:Tornado框架之获取get和post的传参

一、获取get方式传参 import tornado.ioloop #导入tornado包 import tornado.web class MainHandle(tornado.web.RequestHandler):def get(self,id): #定义请求函数self.write("Hello %s!" %id)apptornado.web.Application([ #定义应用配置函数(r"/…

Python深度学习入门 - - 卷积神经网络学习笔记

文章目录 一、卷积神经网络简介二、卷积神经网络的数学原理1、卷积层2、池化层3、感受野 三、Python实战卷积神经网络1、LetNet-5网络2、Resnet 残差网络3、VGGNet 迁移学习 总结 一、卷积神经网络简介 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称…

Linux系统调试篇——核心转储调试(core dump)

文章目录 核心转储开启核心转储使用GDB调试core文件可能遇到的问题 本篇讲解Linux应用程序发生Segmentation fault段错误时&#xff0c;如何利用core dump文件定位错误。 核心转储 在 Linux 系统中&#xff0c;常将“主内存”称为核心(core)&#xff0c;而核心映像(core image…

C++语法

1、基本语法和特性 1、基本语法 对象 - 对象具有状态和行为。例如&#xff1a;一只狗的状态 - 颜色、名称、品种&#xff0c;行为 - 摇动、叫唤、吃。对象是类的实例。类 - 类可以定义为描述对象行为/状态的模板/蓝图。方法 - 从基本上说&#xff0c;一个方法表示一种行为。一…

Vivado IP中Generate Output Products的设置说明

文章目录 Vivado IP中Generate Output Products的设置说明Synthesis OptionsRun Settings 官方文档中的介绍Generate Output ProductsSynthesis Options for IP 参考文献 Vivado IP中Generate Output Products的设置说明 在创建IP核时&#xff0c;将IP核的信息配置完成之后会弹…