深入解析嵌入式Linux系统架构:从Bootloader到用户空间 - 结合B站视频教学
B站视频链接,请多多关注本人B站:
📌 Yocto项目实战教程:第二章 视频讲解

目录
- 第2章 Linux系统架构
- 2.1 GNU/Linux
- 2.2 Bootloader
- 2.3 内核空间
- 2.4 用户空间
- 总结
第2章 Linux系统架构 {#linux系统架构}
嵌入式Linux系统是Linux内核的精简版本,广泛应用于物联网设备、工业控制、消费电子等领域。其核心架构由**内核空间(Kernel Space)和用户空间(User Space)**构成,两者通过系统调用接口交互。本章将深入分析其关键组件,包括引导加载程序(Bootloader)、内核、文件系统及用户空间组件,为后续学习Yocto项目奠定基础。
系统架构总览
Linux系统的核心设计遵循权限隔离原则:
-
内核空间:拥有最高权限,直接管理硬件资源(如CPU、内存、设备驱动)。
-
用户空间:运行用户程序,通过系统调用访问内核功能,权限隔离保障系统安全。

图2-1:Linux系统架构示意图
2.1 GNU/Linux
2.1.1 GNU/Linux概述
GNU项目始于1984年,旨在构建完全自由的操作系统。然而,其最初的内核GNU Hurd因开发缓慢和技术复杂性未能普及。1991年,Linus Torvalds开发了Linux内核,其快速发展和高度兼容性使其成为GNU项目的理想选择。最终,GNU/Linux操作系统诞生,成为现代开源生态的基石。
2.1.2 Linux系统架构
Linux架构分为两部分:
- 内核空间
- 功能:进程调度、内存管理、设备驱动、文件系统管理、网络通信。
- 权限:直接访问硬件,执行特权指令。
- 用户空间
- 功能:运行应用程序(如GUI、Shell、服务进程)。
- 权限:通过系统调用请求内核服务,无法直接操作硬件。
关键设计哲学:内核与用户空间的隔离确保了系统的稳定性。即使应用程序崩溃,内核仍可保持运行。
2.2 Bootloader
2.2.1 Bootloader启动流程
Bootloader是系统启动的第一阶段程序,负责初始化硬件并加载操作系统。其流程分为四步:
- CPU上电:执行ROM中的初始代码(如BIOS/UEFI),完成基础硬件初始化。
- Bootloader第一阶段:初始化内存控制器,为加载内核做准备。
- Bootloader第二阶段:从存储介质(如Flash、SD卡)加载内核和文件系统到内存。
- 内核执行:跳转到内核入口地址,移交系统控制权。

图2-2:Linux系统加载流程
2.2.2 常用Bootloader对比
| Bootloader | 支持的架构 | 特点 | Yocto支持 |
|---|---|---|---|
| U-Boot | ARM、MIPS、x86等 | 嵌入式首选,高度可定制 | 支持 |
| GRUB | x86、UEFI | 多系统引导,桌面/服务器适用 | 支持 |
| barebox | ARM、MIPS | 轻量化设计,类似U-Boot | 支持 |
2.2.3 U-Boot:嵌入式系统的引导核心
- 核心特性:
- 多架构支持(ARM、RISC-V等)。
- 网络引导(TFTP、NFS),便于远程调试。
- 命令行接口(CLI),支持动态配置启动参数。
- 应用场景:
- 嵌入式设备启动Linux内核或Android系统。
- 通过U-Boot脚本实现自动化测试。
# U-Boot命令行示例:设置内核启动参数
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2
bootm 0x82000000
2.2.4 GRUB:通用系统的引导标准
- 核心特性:
- 支持多操作系统引导(Linux、Windows、macOS)。
- 模块化设计,动态加载文件系统驱动。
- 配置文件(
grub.cfg)支持条件逻辑和主题定制。
- 优势:
- 兼容UEFI固件,适用于现代服务器和PC。
- 支持加密分区和LVM存储管理。
2.3 内核空间
2.3.1 Linux内核:系统的核心引擎
-
核心功能:
- 硬件抽象:通过设备驱动管理CPU、内存、外设。
- 资源调度:进程调度器(如CFS)公平分配CPU时间片。
- 安全隔离:通过虚拟内存机制防止进程越权访问。
-
内核版本管理:
版本类型 特点 适用场景 稳定版(Stable) 经过全面测试,修复已知漏洞 生产环境 长期支持版(LTS) 提供2-6年维护 企业级嵌入式系统 主线版(Mainline) 包含最新功能,未充分测试 开发者验证新特性
2.3.2 控制硬件资源:内核的四大支柱
- 设备驱动
- 功能:将硬件操作抽象为统一接口(如
read()/write())。 - 示例:网卡驱动处理数据包收发,GPU驱动渲染图形界面。
- 功能:将硬件操作抽象为统一接口(如
- 中断处理
- 机制:硬件中断触发上下文切换,优先处理高优先级任务。
- 应用:实时系统(如工业机器人)依赖低延迟中断响应。
- I/O管理
- 优化:I/O调度算法(如CFQ、Deadline)减少磁盘寻道时间。
- 技术:DMA(直接内存访问)释放CPU负载,提升吞吐量。
- 内存管理
- 虚拟内存:通过MMU实现物理地址到虚拟地址的映射。
- 内存保护:用户进程无法直接访问内核空间内存。
2.3.3 服务用户空间:内核的桥梁作用
-
系统调用接口:
- 功能:提供300+系统调用(如
open()、fork())。 - 示例:
mmap()实现内存映射文件,提升I/O效率。
- 功能:提供300+系统调用(如
-
进程管理:
- 调度策略:CFS(完全公平调度器)确保多任务公平性。
- 实时扩展:RT-Preempt补丁支持微秒级任务响应。
-
文件系统:
- 抽象层:VFS(虚拟文件系统)统一EXT4、XFS等接口。
- 特性:日志功能(Journaling)防止数据丢失。
-
网络子系统:
- 协议栈:TCP/IP实现可靠数据传输,QoS保障关键流量。
- 安全机制:Netfilter框架支持防火墙和NAT功能。

图2-3:用户空间与内核空间交互
2.4 用户空间
2.4.1 根文件系统:系统启动的基石
-
目录结构:遵循FHS标准,关键目录包括:
目录 功能 /bin基础命令(如 ls、cp)/etc配置文件(如网络设置、服务启动项) /lib共享库(如 libc.so)/dev设备节点(如 /dev/sda1) -
定制化:嵌入式系统常使用BusyBox替换GNU工具链,减少存储占用。
2.4.2 标准C库:开发者与内核的纽带
- 核心作用:
- 封装系统调用,提供
fopen()、printf()等高级接口。 - 优化性能(如缓冲区管理减少上下文切换开销)。
- 封装系统调用,提供
- 实现对比:
库名称 特点 适用场景 glibc 功能全面,兼容性强 通用Linux系统 musl 轻量化,静态链接优势 嵌入式/容器环境
2.4.3 系统共享库:代码复用的艺术
- 动态链接:
- 优点:减少内存占用,支持热更新。
- 示例:
libc.so被多个进程共享,无需重复加载。
- 关键库:
libm:数学运算(如三角函数、矩阵计算)。libpam:可插拔认证模块(支持LDAP、指纹识别)。
2.4.4 init进程:用户空间的起点
- 核心功能:
- 启动系统服务(如网络管理、日志守护进程)。
- 管理进程生命周期(如孤儿进程回收)。
- 实现方案:
init系统 特点 SysVinit 简单可靠,脚本按顺序执行 systemd 并行启动,依赖关系自动解析
# systemd服务管理示例
systemctl start nginx.service
systemctl enable docker.service
2.4.5 窗口管理系统:图形界面的引擎
- X11协议:
- 架构:客户端-服务器模型,支持远程显示。
- 缺点:协议冗余,合成效率低。
- Wayland:
- 优势:直接合成窗口,减少中间层开销。
- 应用:Fedora、Ubuntu已默认支持Wayland。

图2-5:窗口管理系统架构
总结
Linux系统通过内核空间与用户空间的协作,实现了硬件资源的高效管理和用户程序的稳定运行。从Bootloader的硬件初始化,到内核的进程调度,再到用户空间的应用程序,每一层都扮演着不可替代的角色。理解这些组件的设计原理和交互机制,是定制嵌入式Linux系统的关键基础。后续章节将结合Yocto项目,深入探讨如何优化和裁剪这些组件以满足特定需求,例如:
- 如何为ARM设备编译最小化内核?
- 如何通过Yocto定制根文件系统?
- 如何选择适合的init系统和C库?
通过掌握这些知识,开发者能够构建出高性能、高可靠性的嵌入式Linux解决方案。
相关文章:
深入解析嵌入式Linux系统架构:从Bootloader到用户空间 - 结合B站视频教学
B站视频链接,请多多关注本人B站: 📌 Yocto项目实战教程:第二章 视频讲解 目录 第2章 Linux系统架构 2.1 GNU/Linux2.2 Bootloader2.3 内核空间2.4 用户空间 总结 第2章 Linux系统架构 {#linux系统架构} 嵌入式Linux系统是Linux内核的精简版…...
Asp.NET Core WebApi 配置文件
在 ASP.NET Core Web API 中,配置文件(如 appsettings.json)是管理应用程序设置的核心部分。ASP.NET Core 提供了一套灵活的配置系统,允许开发者从多种来源加载配置数据,并根据需要使用这些配置。 以下是关于如何在 A…...
pipe匿名管道实操(Linux)
管道相关函数 1 pipe 是 Unix/Linux 系统中的一个系统调用,用于创建一个匿名管道 #include <unistd.h> int pipe(int pipefd[2]); 参数说明: pipefd[2]:一个包含两个整数的数组,用于存储管道的文件描述符: pi…...
2025.04.10-拼多多春招笔试第三题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 数字重排最大化问题 问题描述 LYA是一位专业的数字设计师。她手中有两个数字序列 s 1 s_1...
Vue.js组件安全开发实战:从架构设计到攻防对抗
目录 开篇总述:安全视角下的Vue组件开发新范式 一、Vue.js组件开发现状全景扫描 二、安全驱动的Vue组件创新架构 三、工程化组件体系构建指南 四、深度攻防对抗实战解析 五、安全性能平衡策略 结语:安全基因注入前端开发的未来展望 下期预告&…...
质因数之和-蓝桥20249
题目: 代码:无脑直接根据题目,一步步操作就行 #include <iostream> using namespace std;int gcd(int a,int b){if(b0) return a;return gcd(b,a%b); }bool exist_gcd(int a,int b){if(gcd(a,b)1) return false;return true; }bool is…...
《栈区、堆区和静态区:内存管理的三大支柱》
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、栈区(Stack)(一)栈区的定义(二)栈区的特点(三)栈区的使用…...
Rust Command无法执行*拓展解决办法
async fn run_cmd_async_out<I, S>(cmd: &str, args: I, timeout_s: u64, with_http_proxy: bool) -> Result<String> whereI: IntoIterator<Item S>,S: AsRef<OsStr>, {let mut cmd tokio::process::Command::new(cmd);// 让 sh 来运行命令&…...
AI 笔记 - 开源轻量级人脸检测项目
开源轻量级人脸检测项目 引言项目解析[libfacedetection 于仕琪](https://github.com/ShiqiYu/libfacedetection)[Ultra-Light-Fast-Generic-Face-Detector-1MB Linzaer](https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB)[A-Light-and-Fast-Face-Detec…...
AI Agent vs 大模型
一句话概述 大模型是“超级学霸”,负责理解、思考和生成内容; AI Agent是“行动派秘书”,会调用工具和知识库,自主完成任务。 角色定位对比 大模型 智能体 核心 任务 回答、创作、推理、分析 规划、决策、执行、协调多工具 …...
go游戏后端开发32:自摸杠处理逻辑
当我们在自摸杠时,实际上在杠完之后,我们还需要进行一个删除操作。因此,我们需要在上面拷贝一个删除操作。由于这是自摸杠,所以这个地方需要删除四次。在这里,我们需要注意的是,自摸杠时,传过来…...
今日行情明日机会——20250411
今天缩量,上方压力依然在,外围还在升级,企稳还需要时日。 2025年4月11日A股涨停主要行业方向分析 一、核心主线方向 芯片(半导体) • 涨停家数:24家(当日最强方向)。 • 驱动逻辑&…...
【Linux】TCP_Wrappers+iptables实现堡垒机功能
规划 显示jumpserver的简单功能,大致的网络拓扑图如下 功能规划 & 拓扑结构 JumpServer(堡垒机)主要功能: 对访问目标服务器进行统一入口控制(例如 nginx、mysql、redis)。使用 iptables 做 NAT 转…...
git仓库中.git文件夹过大的问题
由于git仓库中存放了较大的文件,之后即使在gitignore中添加,也不会导致.git文件夹变小。 参考1 2 通过 du -d 1 -h查看文件大小 使用 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail…...
ssh 登录报错集合(FQA)
1、使用root登录失败(远程主机不允许root登录) 问题:通过 ssh 连接远程主机( ubuntu )时报错,Permission denied 如下: 解决方法:确认root的登录密码没错,且可以正常与远…...
NO.89十六届蓝桥杯备战|动态规划-分组背包-混合背包-多维费用背包|通天之分组背包|排兵布阵|樱花|L国的战斗间谍(C++)
P1757 通天之分组背包 - 洛谷 因为⼀个组⾥⾯最多只能挑⼀个元素,所以我们就以⼀个组为单位。 状态表⽰: dp[i][j]表⽰从前i 组中挑选物品,总重量不超过j 的情况下,最⼤的价值。 那么dp[n][m]就是最终结果。状态转移⽅程&#x…...
NVIDIA H100 vs A100:新一代GPU架构性能对比分析
一、核心架构演进对比 Ampere架构(A100)采用台积电7nm工艺,集成540亿晶体管,配备6,912个CUDA核心和432个第三代Tensor Core,支持FP16、TF32和INT8精度计算。其显存子系统采用HBM2e技术,80GB版本带宽可…...
使用Mybatis时在XML中SQL高亮显示的方法
如图所示,上方的SQL代码很像是一个字符串,那么如何把上方的SQL改成和下方一样的SQL,使得IDEA可以识别SQL方言呢? 1.选中SQL中的一部分代码,此时左侧会出现一个黄色的灯泡图案,点击2.选择这个注入语言或者引用...
机场跑道异物检测数据集VOC+YOLO格式33793张31类别
数据集分辨率都是300x300,都是贴近地面拍摄,具体看图片 据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):33793 标注数量(xml文件…...
掌握C语言文件操作:从理论到实战指南
文件操作是C语言编程中不可或缺的一部分,它使得程序能够持久化存储数据,并在需要时高效读写。本文将从基础概念到实战技巧,系统讲解C语言文件操作的核心知识点,并结合代码示例帮助读者深入理解。 一. 为什么需要文件操作…...
如何进行预算考核
✅ 一、预算考核体系总体架构 模块内容说明考核内容1. 预算目标/指标完成情况2. 预算编制/执行情况双轮驱动,目标 + 执行双考核考核对象高层、中层、基层、后台支持分层分类考核考核周期月度(滚动)+ 季度(校验)+ 年度(决算)提高适应性和准确性考核工具指标体系、差错率评…...
在 Linux 上安装 MongoDB Shell
1. 下载 MongoDB Shell Download | MongoDB wget https://downloads.mongodb.com/compass/mongosh-2.5.0-linux-x64.tgz 2. tar -zxvf mongosh-2.5.0-linux-x64.tgz 3. copy 命令 sudo cp mongosh /usr/local/bin/ sudo cp mongosh_crypt_v1.so /usr/local/lib/ 4. …...
数据结构-复杂度详解
前言:大家好!本文带来的是数据结构-复杂度的讲解,一起来看看吧! 1.算法的时间复杂度和空间复杂度 1.1算法的效率 复杂度:衡量一个算法的好坏(效率),从两个维度衡量,时…...
安宝特新闻丨Vuzix Core™波导助力AR,视角可调、高效传输,优化开发流程
Vuzix Core™ 光波导技术 近期,Vuzix Core™光波导技术赋能AR新视界!该系列镜片支持定制化宽高比调节及20至40视场角范围,可灵活适配各类显示引擎。通过创新的衍射光波导架构,Vuzix Core™实现了光学传输效率与图像质量的双重突破…...
【SQL】常见SQL 行列转换的方法汇总 - 精华版
【SQL】常见SQL 行列转换的方法汇总 - 精华版 一、引言二、SQL常见的行列转换对比1. 行转列 Pivoting1.1 CASE WHEN 聚合函数1.2 IF 聚合函数1.3 PIVOT操作符 2.列转行 Unpivoting2.1 UNION ALL2.2 EXPLODE函数(Hive/Spark&#…...
【原创】vue-element-admin-plus完成确认密码功能,并实时获取Form中表单字段中的值
前言 我第一句就想说:vue-element-admin-plus真是个大坑货!就一个确认密码功能都值得我单开一页博客来讲这么一个简单的功能 布局和代码 布局如图所示,我需要密码和确认密码,确认密码需要和密码中的内容一致,不然会返…...
Vue3中watch监视reactive对象方法详解
在Vue3中,使用watch监视reactive对象时,需根据监视的目标选择合适的方法。以下是详细的步骤和说明: 1. 监视整个reactive对象 自动深度监视:直接监视reactive对象时,Vue3会默认启用深度监视,无需设置deep:…...
PyTorch实现多输入输出通道的卷积操作
本文通过代码示例详细讲解如何在PyTorch中实现多输入通道和多输出通道的卷积运算,并对比传统卷积与1x1卷积的实现差异。 1. 多输入通道互相关运算 当输入包含多个通道时,卷积核需要对每个通道分别进行互相关运算,最后将结果相加。以下是实现…...
MySQL---数据库基础
1.数据库概念 文件保存数据有以下几个缺点: 文件的安全性问题 文件不利于数据查询和管理 文件不利于存储海量数据 文件在程序中控制不方便 数据库存储介质: 1.磁盘 2.内存 为了解决上述问题,设计出更加利于管理数据的东西 —— 数据库。…...
leetcode68.左右文本对齐
思路源自 leetcode-字符串篇 68题 文本左右对齐 难度高的模拟类型题目,关键点在于事先知道有多少单词要放在本行并且还要知道本行是不是最后一行(最后一行需要全部单空格右对齐,不是最后一行就空格均摊),非最后一行的空…...
