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

Linux系统架构核心全景详解


📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry


Linux系统架构核心全景详解

目录

  1. 总览与分层结构图
  2. 用户空间与系统调用
  3. 内核空间各大核心子系统(进程、内存、I/O、文件系统、网络、中断等)
  4. 设备模型与驱动路径
  5. 文件系统 I/O 路径与例子
  6. 网络子系统与例子
  7. 典型硬件层实例
  8. 常见逻辑缺点与优化建议

1. 总览与分层结构图

Linux 系统分为三大层次:

  • 用户空间(User Space)
  • 内核空间(Kernel Space)
  • 硬件层(Hardware Layer)

每层职责分明,通过“系统调用”桥接用户与内核,内核再通过驱动与硬件交互。
在这里插入图片描述


2. 用户空间与系统调用

用户空间作用:

  • 执行应用程序(如shell、GUI、后台服务等)
  • 调用 glibc 等库,提供跨平台API(如 open/read/write/fork/execve 等)

系统调用的意义:

  • 用户空间无法直接操作内核资源(如内存分配、进程调度、文件I/O),只能通过系统调用(syscall)发起请求,由内核决定权限和行为。

代码示例(open 文件)

#include <fcntl.h>
#include <unistd.h>int main() {int fd = open("/tmp/test.txt", O_RDWR|O_CREAT, 0644);write(fd, "hello", 5);close(fd);return 0;
}
  • open/write/close 都是 glibc 的包装,最终进入系统调用

系统调用流程(伪代码/逻辑)

用户空间:fd = open("file")      // 实际为 glibc -> syscall内核空间:sys_open() -> VFS -> 文件系统实现 -> 设备驱动

3. 内核空间各大核心子系统

3.1 进程管理

  • 负责进程调度、创建、终止、信号、IPC
  • Linux内核用 task_struct 管理所有进程

进程创建实例代码(fork)

#include <unistd.h>
#include <stdio.h>
int main() {pid_t pid = fork();if(pid == 0) {printf("child!\n");} else {printf("parent!\n");}
}

内核实现逻辑简述

  • fork() -> sys_fork() -> 内核复制父进程task_struct,设置调度状态

3.2 内存管理

  • 负责虚拟内存分配、物理映射、页表、mmap、swap等
  • 用户空间用 malloc/mmap/brk,内核用 buddy/slab等算法管理

内存分配实例代码

#include <stdlib.h>
int main() {char *p = malloc(1024);// 使用p...free(p);
}
  • malloc 实际调用 brk/mmap 系统调用,由内核分配和管理虚拟空间

3.3 设备与I/O管理

  • 管理所有块设备、字符设备、网络设备(/dev/ttyS0, /dev/sda, /dev/net/…)
  • 提供统一 open/read/write/ioctl 接口

字符设备示例:串口收发

#include <fcntl.h>
#include <unistd.h>
int fd = open("/dev/ttyS0", O_RDWR);
write(fd, "ABC", 3);
read(fd, buf, 3);
close(fd);

内核设备模型简述

  • open() -> 内核查找对应设备驱动结构体 -> 具体 file_operations 实现

3.4 文件系统子系统

  • VFS(虚拟文件系统):为所有文件操作提供统一接口
  • 具体文件系统(ext4, fat, proc, tmpfs…)负责管理实际数据

文件写入完整路径
应用层 open(“/foo/bar.txt”) -> VFS -> ext4实现 -> 块设备驱动 -> 硬盘/SD卡

3.5 网络协议栈

  • 支持 socket、TCP/IP、UDP、以太网等协议
  • 用户用 socket()/send()/recv() 进行数据通信

Socket 通信实例

#include <sys/socket.h>
#include <arpa/inet.h>
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = ...;
bind(sockfd, ...);
listen(sockfd, 5);
accept(sockfd, ...);
// send()/recv()
  • 所有 socket 系统调用均由内核网络子系统实现,最终经过网络驱动发包

3.6 中断与其他子系统

  • 内核管理所有硬件中断、软中断、定时/安全等功能
  • 如网卡中断触发数据收发、定时任务调度等

4. 设备模型与驱动路径

  • 统一用 file_operations 结构描述设备操作(如 read/write/ioctl)
  • 设备树/udev 统一描述设备硬件资源,驱动模块与内核注册挂接

代码片段:字符设备注册

static struct file_operations xxx_fops = {.open = xxx_open,.read = xxx_read,.write = xxx_write,
};
register_chrdev(major, "mydev", &xxx_fops);

驱动调用链举例
应用 open(“/dev/mydev”) -> 内核查找 major/minor -> fops 调用具体函数 -> 控制硬件


5. 文件系统 I/O 路径与例子

应用层读写文件完整路径
open/read/write -> glibc -> 系统调用 -> VFS -> 具体文件系统 -> 块设备驱动 -> 硬盘

代码实例

int fd = open("/data/foo.txt", O_RDWR);
write(fd, "abc", 3);
close(fd);

6. 网络子系统与例子

Socket创建与数据收发全链路
应用层 socket() -> 系统调用 -> 内核协议栈(TCP/UDP/IP)-> 网卡驱动 -> 物理网络

代码实例

int s = socket(AF_INET, SOCK_STREAM, 0);
connect(s, ...);
send(s, buf, len, 0);
recv(s, buf, len, 0);

7. 典型硬件层实例

  • 存储设备:SSD/HDD(块设备)
  • 外设:USB、串口、摄像头(字符设备/网络设备)
  • 网络硬件:以太网、WiFi、4G/5G
  • 内存:DDR/LPDDR(MMU管理)

8. 常见逻辑缺点与优化建议

  1. 误区1:用户空间可直接操作硬件或虚拟内存

    • 正解:所有资源访问必须通过系统调用,由内核统一调度和分配。
  2. 误区2:文件系统和设备驱动没有明确分工

    • 正解:文件系统负责数据结构和管理,设备驱动负责硬件访问。
  3. 误区3:I/O与文件系统的统一性不清晰

    • 优化:I/O通道按设备类型分为块、字符、网络,接口虽然统一(open/read/write),但内核路径与管理方式差别大。
  4. 系统层次划分模糊,职责界限不清

    • 优化:严格区分“API-系统调用-内核子系统-驱动-硬件”,每一层只负责一类逻辑。
  5. 实例代码与内核实现缺乏联动

    • 优化:讲解每条主链路时都给出从应用到硬件的完整路径和内核调用栈。

总结与实战价值

  • 理解 Linux 系统分层,是所有驱动、内核、应用开发的基础
  • 熟练掌握 open/read/write/socket/fork/malloc 背后的系统调用与内核流转,有助于排查疑难、性能调优
  • 知道文件I/O、设备I/O、网络I/O 的异同,能针对不同业务选择最优接口
  • 推荐每个环节都实际写代码+分析内核源码,加深认知
http://www.dtcms.com/a/300147.html

相关文章:

  • 从0到1学Pandas(六):Pandas 与数据库交互
  • KiCad 与 CircuitMaker 使用方法分享:从零开始学电子设计
  • JavaWeb(苍穹外卖)--学习笔记11(Filter(过滤器) 和 Interceptor(拦截器))
  • Windows开发,制作开发软件安装程序(一)
  • MySQL的底层原理--InnoDB数据页结构
  • 关于GateWay网关
  • 基于HMM的词性标注方法详解(HMM+Viterbi,例题分析)
  • 【专业扫盲】电压/电流反馈和串联/并联反馈
  • CSP2025模拟赛2(2025.7.26)
  • 机器人仿真(2)Ubuntu24.04下RTX5090配置IsaacSim与IsaacLab
  • Jenkins持续集成工具
  • swagger基本注解@Tag、@Operation、@Parameters、@Parameter、@ApiResponse、@Schema
  • (1-7-4) MySql 的高级查询
  • 20250726-2-Kubernetes 网络-Service 定义与创建_笔记
  • 【Spring Cloud】微服务学习
  • 超时进行报警例子
  • 在 Windows 系统中实现 WinToGo 的 VHDX 文件切换使用的常见方法
  • 什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?
  • Spring AI Alibaba Video 示例
  • 大型微服务项目:听书——12 数据一致性自定义starter封装缓存操作
  • Java设计模式之行为型模式(中介者模式)实现方式与测试方法
  • 大数据之路:阿里巴巴大数据实践——实时技术与数据服务
  • Reeden:跨平台 AI 电子书阅读器
  • leetcode112, 257:二叉树的路径总和、二叉树的所有路径双题对比
  • 【基础完全搜索】USACO Bronze 2020 December - 雏菊链Daisy Chains
  • AI Agent:自主决策的智能助手
  • Javaweb————HTTP消息体拆分讲解
  • ISIS分片扩展实验案例
  • 精密全波整流电路(四)
  • 2025年02月11日 Go生态洞察:Go 1.24 发布亮点全面剖析