源码级揭秘Linux内核启动流程

news2025/2/23 22:00:45

哈喽,我是子牙,一个很卷的硬核男人。深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程

今天这篇文章给大家分享一下Linux内核的启动流程。为什么要分享这个话题呢?所谓万丈高楼平地起,如果我们想玩转Linux内核,我们既要了解它的前世,又要了解它的今生,还要了解它的未来。启动流程就是Linux内核的前世,对于理解Linux内核,里面包含了太多太多关键信息

其实也是在为后面出书做准备…Linux内核的重要性,我不必言说了。但是目前市面上关于Linux内核的书籍,要么是基于老版本的Linux2.6内核讲的,要么就是ARM架构的、MIPS架构的,Intel架构的几乎没有!凭什么歧视我大Intel!我准备填补这个空缺

授人以鱼不如授人以渔,在分享Linux内核的启动流程过程中,我会把研究明白流程中的每一步所需要的基础也顺便分享出来。这样大家看完这篇文章,不仅知道了Linux内核是如何启动起来的,更知道了研究Linux内核需要的每一层基础

以下,enjoy(对应Linux x86_64 5.0内核)

01   关于启动流程

如果我们要研究Linux内核,我们需要什么呢?单步调试Linux内核的环境(这部分内容我好像还没写过文章,已加入todo list,抽空写。如果你需要的话,可以关注下我的公众号,才能获得文章推送

现在假设我们有了单步调试Linux内核的环境,我们第一步要做什么呢?下断点。那在哪下断点最合适呢?

这个你随便搜资料都能找到答案:start_kernel

好,我们下个断点。顺便让大家看下,单步调试Linux内核是一种怎样的赶脚

注意看我用红框框出来的。我想表达什么呢?启动流程不是从start_kernel开始的,前面还要很多。求知,自己还是得有探索的能力,或者得有基本的判断,不然只能人云亦云

其实这个框出来的,也只是64位内核部分。如果你写过操作系统,或者对CPU有一定的了解,你就知道:电脑刚启动的时候,CPU是出于实模式下(real mode)的,我们图中看到的,已经是CPU的长模式(long mode)了,这中间还要经历保护模式,IA32-e兼容模式。这部分内容,我之前写过文章,感兴趣的可以去看看 传送门

接下来我们就来看看,Linux内核是如何完成CPU的模式切换并启动起来的

02   启动内核

说到启动内核,大家应该都或多或少听过这些词:MBR、Bootloader、Grub、UEFI、BIOS、GPT…它们分别代表什么呢?我来解释一下

BIOS+MBR是一组搭档,负责加载BootLoader及Linux内核。当你按下开机键,BIOS程序会从MBR区域将引导程序BootLoader读入内存。MBR区域就是你听过的磁盘的0柱面0磁道1扇区,这种磁盘分区结构,一个扇区是固定的512B,而功能强大的引导程序通常超过512B,所以Linux内核的做法是将MBR区域当作一个跳板,由MBR区域的代码将BootLoader主体载入内存,然后移交控制权,最后由BootLoader将Linux内核读入内存

没get到?看我写的操作系统中的MBR区域代码

注意上图中我用红圈圈出来的部分,这部分代码就是BootLoader主体,在早期的Linux内核中,这部分代码是自己写的,程序名叫setup,现在都用功能强大齐全的Grub

我发现Linux5.0内核已经不支持BIOS+MBR组合了,我运行了它的MBR区域的代码,得到的结果是这样的

我特地研究了一下这个问题,得到的答案是:这部分代码主要目的是防止旧的不识别GPT的工具误操作。这种"Protective MBR"通常不包含有效的引导代码或分区信息

这就引出来了GPT,UEFI+GPT是一组搭档,用来取代BIOS+MBR。因为UEFI比BIOS强大,GPT比MBR强大,强大具体体现在哪些方面我就不展开了,感兴趣的小伙伴自行chatgpt

那UEFI+GPT+Grub是如何启动Linux内核的呢?UEFI固件会对硬件进行初始化,并读取在NVRAM中的启动条目,然后读取GPT磁盘上的ESP区域,加载Grub程序,Grub程序会读取配置文件,然后启动Linux内核

Grub配置文件在哪呢?

Grub文件中重要的内容

最终执行的Linux内核的代码位置在哪呢?

到这里,这趴就分享完了,得到最终的结论就是Linux5.0内核已经不支持BIOS+MBR启动,仅支持UEFI+GPT启动,Linux5.0内核最初的代码入口是一个叫_start的函数,这个函数的前面两个字节是一个短跳转,最终跳到Linux内核的主要代码start_of_setup程序

通过前面的分享你应该能看出来,如果你想玩明白Linux内核中的这部分内容,你需要具备的基础:AT&T汇编、要了解CPU的运行模式、OS的通用加载机制、Linux内核的加载机制、BIOS+MBR的工作机制、UEFI+GPT的工作机制、Grub的工作机制…

是不是感觉Linux内核这玩意,看别人玩感觉好容易,自己一玩,就emo了:大家玩的是同样的内核吗?

03   实模式进保护模式

这个环节最重要的就是完成CPU由实模式进入保护模式的切换。那如何实现CPU由实模式进入保护模式呢?这个代码要怎么写?翻下Intel手册就知道要干三件事。关中断是我加的,我觉得这时候处理发生的中断没有意义,发生错误让机器直接down掉得了

但是Linux5.0内核的代码远远没有这么简单。所以我觉得:自己动手写一个64位多核操作系统,是玩转Linux内核的唯一方式。因为你不写,你会迷失在Linux内核庞大的代码中,找不到重点,没有一根主线牵引你的思维去理解Linux内核源码

Linux内核是如何实现的呢?执行start_of_setup程序,进入C语言的世界,这时候C语言的世界是16位的,功能很弱。Linux内核在这个环节,除了做了主要的事情,还做了很多边缘的事情

这部分代码我就不展开讲了。这篇文章的主题是帮助大家梳理出Linux内核的启动流程主线及玩转这些需要的基础,感兴趣的小伙伴可以自行去研究,也可以选择加入我的实战Linux内核小班跟我学习

04   保护模式进IA32-e兼容模式

接下来就是进入64位CPU独有的运行模式,但是CPU设计的时候,不能直接由保护模式进入64位长模式,而是要先进入兼容模式

你肯定有这样的疑惑:为什么不能直接进入64位长模式呢?64位CPU中的"兼容模式"(也被称为“32位模式”或“保护模式”)是为了向后兼容而设计的。主要的理由是当新的64位CPU和操作系统被引入时,大量的已存在的软件仍然是32位的。为了让这些软件能够在新的硬件和操作系统上运行,而不需要重新编写,64位CPU支持了这种模式

那如何进入IA32-e兼容模式呢?看核心代码

这部分代码在Linux内核中还真不太好找。我们真正运行的内核是压缩过的,所以这部分代码在这里

这部分代码我是怎么找到的呢?分析Linux内核的编译脚本makefile分析出来的

所以如果你想玩转Linux内核,makefile语法你要非常非常熟悉

05   兼容模式进长模式

终于可以进入64位CPU的最终运行模式了。如果你看Linux内核源码,还真不好理解

你看我写的代码,就很容易理解了

如果不采用这样的方式,就得用一种长跳转的方式实现,看起来没这个优雅

仔细阅读Linux内核源码,真的能感受到写Linux内核的这些工程师对技术的热爱,他们对代码优雅的追求、代码技巧的追求、对技术的综合应用,真的让人拍案叫绝!Linux内核,无愧是集结了全球顶级程序员智慧的结晶!

当CPU执行完这段代码,就进入了我们熟悉的世界,就是本篇文章的第一张图

06   启动多核支持

如果你的CPU是多核的,到目前为止,只有一个核完成了由实模式进入长模式的切换,这个核称为BP,一般就是0号核。其他的核暂时都还是出于原始状态,即实模式下,还不能用

那Linux内核是如何让这些核,即所有的AP核,进入长模式呢?下篇文章细讲。关注公众号【硬核子牙】,第一时间获得最新文章推送

对了,关注公众号【硬核子牙】回复【Linux内核启动流程】可以获取我梳理流程时画的图

enjoy·题外话

我的实战Linux内核小班还在招生,文章中讲到的所有知识点都会讲到,并且会提供实战环境,告诉你做实验的思路,让你彻底掌握。

为了保证课程质量,所有课程内容由子牙老师亲自授课!整个课程大概三个月左右,50+课时,每节课都超硬核,干货满满

对课程感兴趣的,可以看看我之前写的文章:

手写64位多核OS,玩转Linux内核

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

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

相关文章

可口可乐用新的“Y3000”口味拥抱有争议的人工智能图像生成器

可口可乐公司已经迈出了一大步,用它的释放;排放;发布据报道,可口可乐Y3000零糖“限量版”饮料是与人工智能共同创造的。它未来的名字让人想起3000年的味道(还有977年),但它的营销依赖于人工智能从2023年产生的图像——…

Vue之路由及Node.js环境搭建(一起探索新事物)

目录 ​编辑 前言 一、Vue之路由 1.路由简介 1.1 什么是路由 1.2 什么是SPA 1.3 SPA的实现思路 1.4 使用路由的优势 2. 案例演示 2.1 导入所需的js文件 2.2 编写案例代码(模拟页面跳转) 二、Vue之node.js 1. node.js简介 1.1 什么是node.j…

玫瑰代码||逐字打印字体||中秋快乐

关注微信公众号「ClassmateJie」 更多惊喜等待你的发掘 直接看实现效果 电脑端 手机端 使用场景 发给女神告白~ 提供一些文案 “自从遇见你,我的世界变得不一样了。每一天都因为你而变得特别。我想告诉你,我喜欢你,不仅仅是因为你的美丽&am…

使用 PyTorch 的计算机视觉简介 (2/6)

一、说明 在本单元中,我们从最简单的图像分类方法开始——一个全连接的神经网络,也称为感知器。我们将回顾一下 PyTorch 中定义神经网络的方式,以及训练算法的工作原理。 二、数据加载的实践 首先,我们使用 pytorchcv 助手来加载…

民安智库(第三方市场调查公司)开展景区游客满意度调查

为什么要开展景区游客满意度调查 景区的经营管理是一个动态的过程,需要不定期的地进行调查,让管理者了解景区管理的不足之处,并不断地改善和提高管理水平,以保证经营目标的顺利完成。 景区旅游要想真正地成为可持续发展的经济产…

人类的生成式与机器的生成式

生成式是指一种基于模型的方法,通过给定的条件或输入,生成与之相符合的输出。在自然语言处理领域中,生成式模型通常用于生成文本、文章、对话等自然语言序列。 生成式模型的训练主要涉及两个步骤:学习和生成。在学习阶段&#xff…

【每日一题】2603. 收集树中金币

文章目录 Tag题目来源题目解读解题思路方法一:拓扑排序 写在最后 Tag 【拓扑排序】【树】 题目来源 2603. 收集树中金币 题目解读 有一个有 n 个节点的无相无根图,节点编号从 0 到 n-1。有一个表示图中节点间连接关系的数组 edges,长度为 …

目前最流行的无人机摄影测量软件有哪些?各有什么特点?

文章目录 1. Pix4Dmapper2. PhotoScan3. ContextCapture4. 天工GodWork5. Trimble Inpho6. IMAGINE Photogrammetry7. 大疆智图 推荐阅读:《无人机航空摄影测量精品教程》 包括:无人机航测外业作业流程(像控点布设、航线规划、仿地飞行、航拍…

滚雪球学Java(30):多维数组:定义和初始化一次搞定

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!&#xf…

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V/0-10mA/0-20mA/4-20mA

主要特性: >>精度等级:0.1级。产品出厂前已检验校正,用户可以直接使用 >>辅助电源:8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号:0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

spring boot 八、 sharding-jdbc 分库分表 按月分表

在项目resources目录下新建com.jianmu.config.sharding.DateShardingAlgorithm 文件 新增yaml配置 数据源 spring:shardingsphere:props:sql:#是否在日志中打印 SQLshow: true#打印简单风格的 SQLsimple: truedatasource:names: pingxuanlogpingxuanlog:type: com.alibaba.dru…

【20230921】关于sing-box命令行程序开机自启动运行(Windows、Linux)

1 背景 sing-box是一个命令行程序,官网给出的教程是复制链接到Git Bash(windows)或终端运行(Linux)。每次开机都进行复制运行是一件繁琐的事情。 复制的内容其实就是下次并运行shell脚本,其实系统只需要运…

在线旅游平台步入新时代,携程如何走出自己的路?

今年旅游从线下到线上全方位火了。有统计数据,一季度,光是抖音,旅游达人发布视频数量就高达175万条,播放量1350亿次,收获27亿次点赞。在这一趋势下,许多“不出名”的景区和酒店借势抖音达人完成“出圈”。短…

openGauss天津用户组招募正式启动,欢迎报名

openGauss天津用户组招募正式启动,欢迎报名! openGauss用户组(openGauss User Group,简称oGUG)是一个让openGauss用户就技术特性、最佳实践、运营进展等方向交流的开放性本地社区。oGUG致力于构建一个开放、多元、包容的 openGauss城市用户交…

maven找不到jar包

配置settings.xml文件之后出现报错找不到jar包 先改maven设置: 然后在重新清理构建项目: 可以通过执行以下命令清理本地 Maven 仓库 mvn dependency:purge-local-repository

Java中运用BigDecimal对字符串的数值进行加减乘除等操作

系列文章目录 SpringBootVue3实现登录验证码功能 Java实现发送邮件(定时自动发送邮件) 换个角度使用Redis去解决跨域存取Session问题 Redis缓存穿透、击穿、雪崩问题及解决方法 Spring Cache的使用–快速上手篇 List<HashMap<Str…

rv1126-rv1109-驱动方法

1.简单写一下, 在根目录下修改指定编译 指定uboot 指定kernel的config 指定DTS

防静电离子风扇的应用及优点

防静电静电离子风扇是一种用于消除静电的设备,它可以通过离子化原理将静电荷离子化,从而达到静电的效果。防静电静电离子风扇通常采用离子风扇的形式,通过离子化原理将静电荷离子化,从而消除静电。 防静电静电离子风扇的工作原理…

Redis 持久化之 RDB 与 AOF 详解

Redis 持久化 我们知道Redis的数据是全部存储在内存中的,如果机器突然GG,那么数据就会全部丢失,因此需要有持久化机制来保证数据不会因为宕机而丢失。Redis 为我们提供了两种持久化方案,一种是基于快照,另外一种是基于…

数据结构与算法:排序算法(1)

目录 冒泡排序 思想 代码实现 优化 鸡尾酒排序 优缺点 适用场景 快速排序 介绍 流程 基准元素选择 元素交换 1.双边循环法 使用流程 代码实现 2.单边循环法 使用流程 代码实现 3.非递归实现 排序在生活中无处不在,看似简单,背后却隐藏…