> 技术文档 > Linux系统架构核心全景详解

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)

每层职责分明,通过“系统调用”桥接用户与内核,内核再通过驱动与硬件交互。
Linux系统架构核心全景详解


2. 用户空间与系统调用

用户空间作用:

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

系统调用的意义:

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

代码示例(open 文件)

#include #include 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 #include 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 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 #include 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 #include 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 的异同,能针对不同业务选择最优接口
  • 推荐每个环节都实际写代码+分析内核源码,加深认知