B站视频链接,请多多关注本人B站 :

目录
- [第2章 Linux系统架构](#第2章 Linux系统架构)
- [2.1 GNU/Linux](#2.1 GNU/Linux)
- [2.2 Bootloader](#2.2 Bootloader)
- [2.3 内核空间](#2.3 内核空间)
- [2.4 用户空间](#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脚本实现自动化测试。
bash
# 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 并行启动,依赖关系自动解析
bash
# 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解决方案。