当前位置: 首页 > news >正文

Linux启动过程


theme: channing-cyan

两种启动方式

传统启动方式(LEGACY+MBR)

指传统BIOS启动方式,存在一些不足:比如最大只支持2TB磁盘,磁盘最多四个分区,且不支持图形操作

UEFI+GPT方式

是新式的启动方式,逐步取代传统启动方式

相对于Legacy+mbr, 优点在启动更快(不要开机自检),最多可支持128个磁盘分区最大可支持18EB硬盘支持图形操作

整体过程

screenshot-20230209-132105.png

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

这样就完成了从开机到登录的整个启动过程。

详细过程

BIOS

展示

主板上的BIOS芯片

bba1cd11728b4710a7bf531ecdcec3fdfd03234b.jpeg

img

作用

BIOS,Basic Input/Output System,基本输入输出系统。早期的 BIOS 存储在内存的 ROM 中,不会断电消失;现在大多存储在内存的闪存(Flash Memory)中。

  1. CPU 加电后会首先执行 BIOS 程序,其中 POST(Power-On Self-Test)加电自检程序是执行的第一个例行程序,主要是对 CPU、内存等硬件设备进行检测和初始化。

  2. BIOS 中断调用即 BIOS 中断服务程序,是计算机系统软、硬件之间的一个可编程接口。开机时,BIOS 会通知 CPU 各种硬件设备的中断号,并提供中断服务程序。软件可以通过调用 BIOS 中断对软盘驱动器、键盘及显示器等外围设备进行管理。

  3. BIOS 会根据在 CMOS 中保存的配置信息来判断使用哪种设备启动操作系统,并将 CPU 移交给操作系统使用。

流程

BIOS.png

  1. 在CPU加电之后,会把CPU所有寄存器的值设为默认值,除了CS寄存器的值改为0xFFFF,其他寄存器的值都为0,这样,根据CS 和 IP的值就可以找到指令的物理地址0xFFFF:0x0000,也就是0xFFFF0。

  2. 这时CPU就开始执行在这个位置开始执行,这里存放的一条无条件跳转指令JMP,跳转到BIOS的真正启动代码处。

  3. BIOS首先先进行POST(Power-On Self Test,加电后自检)POST的主要检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备;如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。

  4. BIOS 程序在执 行一些必要的开机自检和初始化后,会将自己复制到从 0xA0000 开始的物理内存中并继续执行

  5. 然后,BIOS 开始搜寻可引导的存储设备(即根据用户指定的引导顺序从软盘、硬盘或是可移动设备)。如果找到,则将存储设备中的引导扇区读入物理内存 0x7C00 处,并跳转到 0x7C00 继续执行,从而将 CPU 交给引导扇区中的 Boot 程序

引导(Boot)程序

引导顺序

可以在BIOS配置引导设备,接下来以最常见的硬盘启动为例进行说明。

c83d70cf3bc79f3daea78e49b6a1cd11728b2900.webp

主引导扇区

硬盘被格式化之后被划分为固定容量(一般是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,这是判别引导扇区是否合法的标志

微信图片_20230221200203.jpg

f2f3f639900acc36dc374b87cf60b13f.png

流程

截图-2023-02-23-154519.png

  1. BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。

  2. MBR代码从磁盘分区表找到活动分区,通过BIOS将活动分区的启动扇区读入内存,并跳转到启动扇区的起始位置。

  3. 硬盘的MBR装载分区引导扇区,分区引导扇区也称DBR,DBR是程序。

  4. DBR装入内存后,即开始执行该引导程序段。

Boot loader

比较流行的引导加载程序(Boot loader)是LILO和Grub,Grub比LILO更好,所以只聊Grub。

GRUB(Grand Unified Boot Loader)拥有强大的交互式命令界面,支持网络引导。GRUB负责装入内核并引导Linux系统。此外,还可以引导其他操作系统,如FreeBSD、DOS和Windows系列。

LL4-4.png

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

内核初始化的最后一步就是启动 pid1init 进程,这个进程是系统的第一个进程,它负责产生其他所有用户进程。

  1. init 以守护进程方式存在,是所有其他进程的祖先。init 进程非常独特,能够完成其他进程无法完成的任务。

  2. init系统能够定义、管理和控制 init 进程的行为。它负责组织和运行许多独立的或相关的始化工作(因此被称为 init 系统),从而让计算机系统进入某种用户预订的运行模式。

  3. 仅仅将内核运行起来是毫无实际用途的,必须由 init 系统将系统代入可操作状态。比如启动外壳 shell 后,便有了人机交互,这样就可以让计算机执行一些预订程序完成有实际意义的任务。

总结

最终,Linux启动过程如下图所示:

Linux启动过程.png

资料

  1. bios
  2. 【博客419】cpu实模式与保护模式
  3. 操作系统启动过程
  4. 操作系统启动过程
  5. 【操作系统】操作系统的启动都干了些什么
  6. BIOS加电自检的过程是怎样的
  7. 浅谈操作系统-启动过程
  8. 关于硬盘主引导扇区的结构及功能全面释疑
  9. 怎样设置BIOS电脑启动顺序?
  10. 硬盘:主分区、扩展分区、逻辑分区、活动分区、系统分区、启动分区、引导扇区、MBR解析
  11. LINUX 启动过程
  12. 深入LINUX启动过程
  13. LINUX启动过程详解
  14. 解读LINUX启动过程
  15. LINUX启动过程

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

往期文章回顾:

  1. 设计模式
  2. 招聘
  3. 思考
  4. 存储
  5. 算法系列
  6. 读书笔记
  7. 小工具
  8. 架构
  9. 网络
  10. Go语言

相关文章:

Linux启动过程

theme: channing-cyan 两种启动方式 传统启动方式(LEGACYMBR) 指传统BIOS启动方式,存在一些不足:比如最大只支持2TB磁盘,磁盘最多四个分区,且不支持图形操作 UEFIGPT方式 是新式的启动方式&#xff0c…...

面试资料整理——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是实现什么功能的吧&#xff1a; 我们打开源码路径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/)超长整数如何取余&#xff1f;[6367. 求出最多标记下标](ht…...

imx6ull——I2C驱动

I2C基本介绍 SCL 为高电平&#xff0c;SDA 出现下降沿:起始位 SCL 位高电平&#xff0c;SDA出现上升沿:停止位 主机——从机地址&#xff08;ack&#xff09;——寄存器地址&#xff08;ack&#xff09;——数据&#xff08;ack&#xff09; 重点&#xff1a;先是写&#xff0c…...

Spring Cache的基本使用与分析

概述 使用 Spring Cache 可以极大的简化我们对数据的缓存&#xff0c;并且它封装了多种缓存&#xff0c;本文基于 redis 来说明。 基本使用 1、所需依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-…...

【安全知识】——端口复用隐藏后门

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 以后赚大钱座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日鸡汤&#xff1a; 精彩的人生是在有限的生命中实现无限价值端口复用是…...

Tina_Linux量产测试使用指南_new

OpenRemoved_Tina_Linux_量产测试_使用指南_new 1 概述 文档主要描述如何配置tinatest 并搭建量产测试环境。 1.1 编写目的 • 介绍量产配置方法&#xff1b; • 介绍量产测试环境搭建流程&#xff1b; • 介绍如何使用dragonMAT 软件&#xff1b; • 方便开发人员按照说明…...

STC32单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能和使用✨STC32单片机普通 I/O 口中断&#xff0c;不是传统外部中断. &#x1f516;手册上描述&#xff1a;STC32G 系列支持所有的 I/O 中断&#xff0c;且支持 4 种中断模式&#xff1a;下降沿中断、上升沿中断、低电平中断、高电平中断。每组 …...

计算机学生如何找到第一份实习?

作为一名计算机专业的学生&#xff0c;找到第一份实习是非常重要的一步&#xff0c;它不仅可以帮助你更好地了解行业&#xff0c;增加实践经验&#xff0c;还可以为即将到来的校招提供有力支持。计算机专业的校招&#xff0c;每年都在变得越来越卷。5年前&#xff0c;可能你只要…...

《Python机器学习》基础代码

1&#xff0c;要学习Python机器学习,第一步就是读入数据,这里我们以读入excel的数据为例,利用jupyter notebook来编码,具体教程看这个视频 推荐先上传到jupyter notebook,再用名字.xlsx来导入 Jupyter notebook导入Excel数据的两种方法介绍_哔哩哔哩_bilibili 2&#xff0c;…...

【前端】JS异步加载

文章目录为什么要异步加载如何实现异步加载参考为什么要异步加载 两个原因其实是一个意思。 原因1&#xff1a; JS是单线程的语言&#xff0c;它会同步的执行代码&#xff0c;从上往下执行 但是&#xff0c;一旦网络不好&#xff0c;或要加载的js文件过大的话&#xff0c;会…...

【MySQL】SQL语言的五个部分

DQL 数据查询语言&#xff08;Data Query Language&#xff0c;DQL&#xff09;&#xff1a;DQL主要用于数据的查询&#xff0c;其基本结构是使用SELECT子句&#xff0c;FROM子句和WHERE子句的组合来查询一条或多条数据。 DML 数据操作语言&#xff08;Data Manipulation La…...

详细的IO面试题汇总

IO 流简介 IO 即 Input/Output&#xff0c;输入和输出。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。数据传输过程类似于水流&#xff0c;因此称为 IO 流。IO 流在…...

在Linux终端管理你的密码!

大家好&#xff0c;我是良许。 现在是互联网时代&#xff0c;我们每天都要跟各种 APP 、网站打交道&#xff0c;而这些东西基本上都需要注册才可以使用。 但是账号一多&#xff0c;我们自己都经常记不清对应的密码了。有些小伙伴就一把梭&#xff0c;所有的账号密码都是一样。…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...