Linux启动过程
theme: channing-cyan
两种启动方式
传统启动方式(LEGACY+MBR)
指传统BIOS启动方式,存在一些不足:比如最大只支持2TB磁盘,磁盘最多四个分区,且不支持图形操作
UEFI+GPT方式
是新式的启动方式,逐步取代传统启动方式
相对于Legacy+mbr, 优点在启动更快(不要开机自检),最多可支持128个磁盘分区最大可支持18EB硬盘支持图形操作
整体过程

- 打开计算机电源,计算机首先从BIOS开始启动
- BIOS对硬件进行检测,CPU从起始地址为0xFFF0处开始执行程序。BIOS自检的内容主要包括CPU、内存、硬盘等设备和即插即用设备。
- 按BIOS中的设置将硬盘的主引导扇区(第一个扇区)加载到0x7C00,接着启动硬盘上安装的引导程序LILO或GRUB来引导Linux。
- Linux首先进行内核的引导,主要完成磁盘引导、机器状态数据读取、从实模式到保护模式的切换、数据段寄存器加载及中断描述符表设置等。
- 进行系统初始化,执行init程序。init程序调用rc.sysinit和rc等程序,而rc.sysinit和rc在完成系统初始化和运行服务后返回init。
- 启动mingetty,打开终端供用户登录系统。
这样就完成了从开机到登录的整个启动过程。
详细过程
BIOS
展示
主板上的BIOS芯片


作用
BIOS,Basic Input/Output System,基本输入输出系统。早期的 BIOS 存储在内存的 ROM 中,不会断电消失;现在大多存储在内存的闪存(Flash Memory)中。
-
CPU 加电后会首先执行 BIOS 程序,其中 POST(Power-On Self-Test)加电自检程序是执行的第一个例行程序,主要是对 CPU、内存等硬件设备进行检测和初始化。
-
BIOS 中断调用即 BIOS 中断服务程序,是计算机系统软、硬件之间的一个可编程接口。开机时,BIOS 会通知 CPU 各种硬件设备的中断号,并提供中断服务程序。软件可以通过调用 BIOS 中断对软盘驱动器、键盘及显示器等外围设备进行管理。
-
BIOS 会根据在 CMOS 中保存的配置信息来判断使用哪种设备启动操作系统,并将 CPU 移交给操作系统使用。
流程

-
在CPU加电之后,会把CPU所有寄存器的值设为默认值,除了CS寄存器的值改为0xFFFF,其他寄存器的值都为0,这样,根据CS 和 IP的值就可以找到指令的物理地址0xFFFF:0x0000,也就是0xFFFF0。
-
这时CPU就开始执行在这个位置开始执行,这里存放的一条无条件跳转指令JMP,跳转到BIOS的真正启动代码处。
-
BIOS首先先进行POST(Power-On Self Test,加电后自检)POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备;如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。
-
BIOS 程序在执 行一些必要的开机自检和初始化后,会将自己复制到从 0xA0000 开始的物理内存中并继续执行
-
然后,BIOS 开始搜寻可引导的存储设备(即根据用户指定的引导顺序从软盘、硬盘或是可移动设备)。如果找到,则将存储设备中的引导扇区读入物理内存 0x7C00 处,并跳转到 0x7C00 继续执行,从而将 CPU 交给引导扇区中的 Boot 程序
引导(Boot)程序
引导顺序
可以在BIOS配置引导设备,接下来以最常见的硬盘启动为例进行说明。

主引导扇区
硬盘被格式化之后被划分为固定容量(一般是512B)的数据块,每个数据块被称为一个扇区(sector)。
硬盘的第一个扇区被称为主引导扇区(0磁头0磁道1扇区,bootsector),它在所有的系统分区之前不属于任何系统分区。主引导扇区由主引导记录(Master Boot Record,MBR)、磁盘分区表(Disk Partition Table,DPT)和引导记录标识(Boot Record ID)3个部分组成:
- MBR占用主引导扇区的前446个字节(bootloader),存放系统主引导程序,负责从活动分区中装载并运行系统引导程序。
- DPT占用64个字节,记录磁盘的基本分区信息。磁盘分区表分为4个分区项,每项16字节,分别记录每个主分区的信息,因此最多可以有4个主分区。其中只有一个活动分区(Active Partition)
- Boot Record ID占用2个字节。对于合法的引导扇区,它等于0xAA55,这是判别引导扇区是否合法的标志


流程

-
BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。
-
MBR代码从磁盘分区表找到活动分区,通过BIOS将活动分区的启动扇区读入内存,并跳转到启动扇区的起始位置。
-
硬盘的MBR装载分区引导扇区,分区引导扇区也称DBR,DBR是程序。
-
DBR装入内存后,即开始执行该引导程序段。
Boot loader
比较流行的引导加载程序(Boot loader)是LILO和Grub,Grub比LILO更好,所以只聊Grub。
GRUB(Grand Unified Boot Loader)拥有强大的交互式命令界面,支持网络引导。GRUB负责装入内核并引导Linux系统。此外,还可以引导其他操作系统,如FreeBSD、DOS和Windows系列。

GRUB包含两个阶段:Stage 1和Stage2。Stage1被安装到磁盘的MBR,它直接加载Stage2并执行跳转。Stage2主要功能是为了加载其他操作系统。Stage2首先把系统切换到保护模式,设置好C语言运行环境。系统执行时首先查找配置文件(如grub.conf和menu.lst)。如果没有,则执行一个Shell,并等待用户输入命令。当用户输入boot命令时,将控制权转移给操作系统。
加载内核(Kernel)
当Stage 2 bootloader已经被加载到内存中,文件系统被识别到,并且默认的内核镜像和initrd镜像被加载到内存中。
内核镜像已经准备好,并且控制权从Stage 2 bootloader传递过来,启动过程的Kernel阶段就可以开始了。内核镜像并非直接可以运行,而是一个被压缩过的,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
init
内核初始化的最后一步就是启动 pid 为 1 的 init 进程,这个进程是系统的第一个进程,它负责产生其他所有用户进程。
-
init以守护进程方式存在,是所有其他进程的祖先。init进程非常独特,能够完成其他进程无法完成的任务。 -
init系统能够定义、管理和控制init进程的行为。它负责组织和运行许多独立的或相关的始化工作(因此被称为init系统),从而让计算机系统进入某种用户预订的运行模式。 -
仅仅将内核运行起来是毫无实际用途的,必须由
init系统将系统代入可操作状态。比如启动外壳shell后,便有了人机交互,这样就可以让计算机执行一些预订程序完成有实际意义的任务。
总结
最终,Linux启动过程如下图所示:

资料
- bios
- 【博客419】cpu实模式与保护模式
- 操作系统启动过程
- 操作系统启动过程
- 【操作系统】操作系统的启动都干了些什么
- BIOS加电自检的过程是怎样的
- 浅谈操作系统-启动过程
- 关于硬盘主引导扇区的结构及功能全面释疑
- 怎样设置BIOS电脑启动顺序?
- 硬盘:主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR解析
- LINUX 启动过程
- 深入LINUX启动过程
- LINUX启动过程详解
- 解读LINUX启动过程
- LINUX启动过程
最后
大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)
我的个人博客为:https://shidawuhen.github.io/
往期文章回顾:
- 设计模式
- 招聘
- 思考
- 存储
- 算法系列
- 读书笔记
- 小工具
- 架构
- 网络
- Go语言
相关文章:
Linux启动过程
theme: channing-cyan 两种启动方式 传统启动方式(LEGACYMBR) 指传统BIOS启动方式,存在一些不足:比如最大只支持2TB磁盘,磁盘最多四个分区,且不支持图形操作 UEFIGPT方式 是新式的启动方式,…...
面试资料整理——C++
C/C难题的高赞回答「中文版」 https://mp.weixin.qq.com/s/KBEnrRVb1T6LfwHgaB4jiQ C/C难题的高赞回答「中文版」,帮你整理好了 https://mp.weixin.qq.com/s/o9MdENiasolVT-Fllag2_Q C语言与C面试知识总结 https://mp.weixin.qq.com/s/MGSoPqPv_OzyWBS5ZdnZgw 程…...
【ArcGIS Pro二次开发】(9):GeoProcessing工具和自定义工具的调用
ArcGIS Pro自带了1000种以上的GeoProcessing工具,几乎可以实现所有你想要做的事。 ArcGIS Pro的二次开发并不需要我们从底层做起,很多功能只要学会调用工具并组合使用,就完全可以实现。 下面介绍如何调用系统自带的GeoProcessing工具&#x…...
皕杰报表斜线单元格、图表里或导出pdf的中文显示小方块解决方案
在皕杰报表中,如果含有斜线的单元格、统计图的报表、或导出pdf时,汉字变成小方框,这往往是服务器端操作系统的中文安装包没有装全,导致报表里用到的字体在服务器端的操作系统里找不到,因此成了小方块。因为斜线单元格里…...
python读写hdfs文件的实用解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...
RK3399+FPGA+MIPI 方案细节之subLVDS to MIPI处理
#CROSSLINK系列 #CROSSLINK vs XO3L 总的来说XO3L的灵活性更强,更近似于一片通用的CPLD;CROSSLINK专用性更强。 针对subLVDS转换到MIPI的需求,CROSSLINK比较有优势,因为集成度更高,所以稳定性也更高。 #要点 #crossl…...
Vue组件是怎样挂载的
我们先来关注一下$mount是实现什么功能的吧: 我们打开源码路径core/instance/init.js: export function initMixin (Vue: Class<Component>) {......initLifecycle(vm)// 事件监听初始化initEvents(vm)initRender(vm)callHook(vm, beforeCreate)initInject…...
gcc: 编译选项:-fdelete-null-pointer-checks、-fno-delete-null-pointer-checks
文章目录 说明实例:Linux 里的使用chatGPT说明 这个说明写的有些理解不了,可能还是不太理解(有未知的东西在里面?)。但是从这个编译选项的命名上来看还是非常明确,就是删除不必要的空指针检查。使用时要小心了,这个优化超出了编译的界限! -fdelete-null-pointer-check…...
周赛334(前缀和、贪心+双指针、Dijkstra求最短路径、二分答案)
文章目录[6369. 左右元素和的差值](https://leetcode.cn/problems/left-and-right-sum-differences/)前缀和[6368. 找出字符串的可整除数组](https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/)超长整数如何取余?[6367. 求出最多标记下标](ht…...
imx6ull——I2C驱动
I2C基本介绍 SCL 为高电平,SDA 出现下降沿:起始位 SCL 位高电平,SDA出现上升沿:停止位 主机——从机地址(ack)——寄存器地址(ack)——数据(ack) 重点:先是写,…...
Spring Cache的基本使用与分析
概述 使用 Spring Cache 可以极大的简化我们对数据的缓存,并且它封装了多种缓存,本文基于 redis 来说明。 基本使用 1、所需依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-…...
【安全知识】——端口复用隐藏后门
作者名:白昼安全主页面链接: 主页传送门创作初心: 以后赚大钱座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日鸡汤: 精彩的人生是在有限的生命中实现无限价值端口复用是…...
Tina_Linux量产测试使用指南_new
OpenRemoved_Tina_Linux_量产测试_使用指南_new 1 概述 文档主要描述如何配置tinatest 并搭建量产测试环境。 1.1 编写目的 • 介绍量产配置方法; • 介绍量产测试环境搭建流程; • 介绍如何使用dragonMAT 软件; • 方便开发人员按照说明…...
STC32单片机 普通 I/O 口中断功能介绍和使用
STC32单片机 普通 I/O 口中断功能和使用✨STC32单片机普通 I/O 口中断,不是传统外部中断. 🔖手册上描述:STC32G 系列支持所有的 I/O 中断,且支持 4 种中断模式:下降沿中断、上升沿中断、低电平中断、高电平中断。每组 …...
计算机学生如何找到第一份实习?
作为一名计算机专业的学生,找到第一份实习是非常重要的一步,它不仅可以帮助你更好地了解行业,增加实践经验,还可以为即将到来的校招提供有力支持。计算机专业的校招,每年都在变得越来越卷。5年前,可能你只要…...
《Python机器学习》基础代码
1,要学习Python机器学习,第一步就是读入数据,这里我们以读入excel的数据为例,利用jupyter notebook来编码,具体教程看这个视频 推荐先上传到jupyter notebook,再用名字.xlsx来导入 Jupyter notebook导入Excel数据的两种方法介绍_哔哩哔哩_bilibili 2,…...
【前端】JS异步加载
文章目录为什么要异步加载如何实现异步加载参考为什么要异步加载 两个原因其实是一个意思。 原因1: JS是单线程的语言,它会同步的执行代码,从上往下执行 但是,一旦网络不好,或要加载的js文件过大的话,会…...
【MySQL】SQL语言的五个部分
DQL 数据查询语言(Data Query Language,DQL):DQL主要用于数据的查询,其基本结构是使用SELECT子句,FROM子句和WHERE子句的组合来查询一条或多条数据。 DML 数据操作语言(Data Manipulation La…...
详细的IO面试题汇总
IO 流简介 IO 即 Input/Output,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在…...
在Linux终端管理你的密码!
大家好,我是良许。 现在是互联网时代,我们每天都要跟各种 APP 、网站打交道,而这些东西基本上都需要注册才可以使用。 但是账号一多,我们自己都经常记不清对应的密码了。有些小伙伴就一把梭,所有的账号密码都是一样。…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
