posts
操作系统深度专题:从内核原理到 Linux 系统编程
操作系统是计算机科学的基石,理解其原理是进行系统编程、性能优化与问题排查的前提。本专题系统覆盖进程与线程模型(PCB、调度算法 CFS/多级反馈队列)、内存管理机制(虚拟内存、页表、MMU、TLB、换页策略)、文件系统与 I/O 栈(VFS、inode、DMA、mmap、epoll/io_uring、NVMe 多队列与 io_uring 结合)、死锁与同步原语(信号量、互斥锁、条件变量、读写锁、RCU)、中断机制与系统调用、Linux 内核源码导读(启动流程、模块编程、内核数据结构)、容器与虚拟化的操作系统支撑(cgroups/namespace/KVM)、eBPF 可观测与内核追踪、实时调度(PREEMPT_RT)与可信安全加固(LSM/TPM),为后端工程师与系统开发者建立扎实的操作系统理论底座。
操作系统是整个计算机系统的基石。不理解操作系统,就无法真正理解程序的内存布局、线程调度、文件读写,更无法做出高性能、高可靠性的系统级设计。
本专题共收录 42 篇深度文章,覆盖操作系统核心理论与 Linux 系统编程实践两大维度。从冯·诺依曼架构到现代多核调度器,从 fork() 到 io_uring,从 BIOS/UEFI 启动到可信计算——帮助你建立从硬件到用户态的完整认知链路。最新六篇继续向「读得懂实现、定位得了问题」推进:EEVDF 调度器实现与负载均衡、内核并发原语与 RCU、内存回收与 OOM、eBPF 开发实战(CO-RE/libbpf)、内核网络栈(sk_buff/NAPI/XDP)与 ARM64 体系结构。此前还补齐了伙伴系统与 SLUB、页面置换算法、系统调用实现、cgroups/namespace 底层、设备驱动模型与内核调试(kgdb/kdump/crash)等内核机制主题。
📌 与 cs-fundamentals 的区别:计算机基础专题覆盖数据结构与网络的算法层;本专题深入系统实现层,聚焦内核机制、系统调用与 Linux 工程实践。
一、操作系统核心理论
1.1 体系结构与进程管理
1.2 内存管理
1.3 文件系统与 IO
1.4 同步与死锁
| 文章 | 核心内容 | 与 ⭐ 结合阅读 |
|---|
| 同步原语:信号量、互斥锁、条件变量与读写锁 | 内核态 mutex vs 用户态 futex、信号量的 PV 操作、读写锁公平策略、自旋锁(Spinlock)适用场景、RCU 读-拷贝-更新机制 | ⭐ CS: 死锁与同步 |
| 死锁:条件、检测、预防与银行家算法 | 死锁四必要条件、资源分配图、银行家算法、哲学家就餐问题、Linux 的 lockdep 死锁检测工具 | ⭐ CS: 死锁与同步 |
二、Linux 系统编程
2.1 核心系统调用
2.2 内核与调试
三、体系结构与硬件交互
| 文章 | 核心内容 | 关联方向 |
|---|
| 中断与异常处理:从硬件中断到软中断 | 中断向量表、IRQ 与 ISR、中断上下文 vs 进程上下文、NMI 不可屏蔽中断、软中断(softirq / tasklet / workqueue)、IRQ 亲和性与均衡 | 高性能网络驱动 |
| 多处理器与缓存一致性:MESI 协议与内存屏障 | 对称多处理器 SMP、NUMA 架构、Cache Line 伪共享、MESI 缓存一致性协议、内存屏障(mb/rmb/wmb)、Store Buffer 与 Invalidate Queue | C++ 原子操作关联 |
| 系统启动全流程:从 BIOS/UEFI、GRUB 到内核与 systemd | BIOS/UEFI 与 Secure Boot 信任链、GRUB 引导加载、内核从实模式到 start_kernel、initramfs 与 switch_root、systemd 并行初始化、systemd-analyze 启动优化 | 可信启动与运维排障 |
四、操作系统对比与前沿
| 文章 | 核心内容 | 技术趋势 |
|---|
| 操作系统对比:Linux vs Windows vs macOS 内核设计哲学 | 宏内核 vs 微内核 vs 混合内核、Linux 的 monolithic + 模块化、Windows NT 混合内核、XNU(Darwin)微内核 + BSD 层、系统调用 ABI 差异 | 内核选择依据 |
| 现代 OS 趋势:容器、虚拟化与 Unikernel | Namespace/Cgroups 的 OS 视角、KVM/Hyper-V 虚拟化扩展、Unikernel(MirageOS/IncludeOS)、Rust-for-Linux、seL4 形式化验证 | 云原生基础设施 |
| 虚拟化与容器隔离:从 KVM/QEMU 到 namespace 与 cgroup | KVM/QEMU 硬件虚拟化(VMX/SVM、EPT、virtio)、8 大 namespace、cgroup v2、runc/overlayfs、虚拟机 vs 容器对比与逃逸风险 | 云原生基础设施 |
| 实时操作系统:RTOS 内核设计、优先级反转与 Linux PREEMPT_RT | 硬/软实时、抢占式固定优先级调度、优先级反转与继承/天花板协议、RMS/EDF 可调度性、PREEMPT_RT、SCHED_FIFO/RR/DEADLINE、cyclictest 实测 | 工业控制与音视频 |
| 操作系统安全加固与可信计算:LSM、TPM 与容器逃逸防护 | LSM(SELinux/AppArmor)、内核加固(KASLR/CFI/模块签名)、TPM 可信启动与远程证明、seccomp/Capabilities 容器逃逸防护 | 零信任与安全审计 |
五、进阶主题:NUMA、时间与内核可观测
六、调度、并发、回收与硬件架构纵深
从「知道有这套机制」推进到「读得懂实现、定位得了问题」——调度器演进、内核并发原语、内存回收、eBPF 开发、网络栈与 ARM64:
| 文章 | 核心内容 | 关联方向 |
|---|
| Linux 调度器实现:从 CFS 到 EEVDF | CFS 到 EEVDF 的演进、vruntime 与虚拟截止时间、调度类与调度域、PELT 负载跟踪与负载均衡、CPU 亲和性与隔离(isolcpus/cpuset)、sched_ext 用户态调度器、schedstat/perf sched 实测 | 性能调优与实时性 |
| 内核并发原语与 RCU 机制 | 原子操作与内存屏障、spinlock/rtmutex/读写锁语义、seqlock、per-CPU 变量、RCU 宽限期与回调机制、lockdep 死锁检测、并发 bug 排查方法 | 内核开发与并发正确性 |
| 内存回收机制:LRU、水位与 OOM | LRU active/inactive 链表与多代 LRU、kswapd 与内存水位(min/low/high)、直接回收与分配慢路径、swap/zswap/zram、PSI 内存压力、cgroup 回收与 OOM、meminfo/vmstat 实战 | 内存问题定位 |
| eBPF 开发实战:CO-RE 与 libbpf | CO-RE 与 BTF 原理、libbpf 骨架生成(bpftool gen skeleton)、Map 类型与 ring buffer、kprobe/tracepoint/fentry 挂载、内核与用户态通信、验证器限制排查与生产部署 | 可观测性与安全审计 |
| 内核网络栈:sk_buff、NAPI 与 XDP | sk_buff 结构与生命周期、收发路径(NAPI/软中断/GRO)、netfilter 与 conntrack、socket 层与拥塞控制接口、XDP/AF_XDP 快速路径、netns 与 veth/bridge、丢包定位 | 高性能网络与云原生 |
| ARM64 体系结构与内核实现 | 异常级别 EL0-EL3 与 AArch64 寄存器、页表与地址翻译(TTBR/TCR)、设备树 DTS、启动流程与 PSCI、GIC 中断控制器、cache 一致性与内存屏障、交叉编译与 QEMU 调试、与 x86_64 的差异 | 嵌入式与服务器架构 |
补充收录
以下六篇为既有文章,此前未收录于本索引,现按主题补齐:
| 文章 | 核心内容 | 关联方向 |
|---|
| 伙伴系统、SLAB/SLUB 与 Linux 内存分配器 | 伙伴系统 2 的幂拆分与合并、SLAB/SLOB/SLUB 三种对象分配器演进、CMA 连续内存分配、per-CPU 页分配器、kmalloc 与 vmalloc 的区别与调试特性 | 内核内存分配 |
| 页面置换算法:FIFO、LRU、Clock、LFU 与工作集模型 | 缺页中断处理流程、FIFO/LRU/Clock/LFU 经典算法、Belady 异常与栈算法特征、工作集模型、Linux LRU 平衡策略与 thrashing 预防 | 虚拟内存与性能 |
| 系统调用实现:从 glibc 到内核态切换 | 系统调用号与 sys_call_table、glibc 封装、INT 0x80 与 SYSCALL 快速路径演进、vDSO 用户态优化、参数传递寄存器约定、pt_regs 与内核态进出流程 | 系统编程基础 |
| cgroups v2 与命名空间底层实现 | cgroup v1/v2 层级差异、cpu/memory/io/pids 控制器原理、PID/IPC/Net/Mount/UTS/User/cgroup 七种命名空间隔离机制、unshare 与 systemd 集成 | 容器与资源隔离 |
| Linux 设备驱动模型:字符设备、块设备与 sysfs | 主次设备号、字符设备注册与 file_operations、ioctl 命令规范、块设备请求队列与 I/O 调度、sysfs 动态节点、udev 规则、platform driver 总线匹配 | 驱动开发与硬件交互 |
| 内核调试:kgdb、kdump、crash 与动态追踪 | kgdb 远程调试与串口连接、panic/oops 日志分析、kdump 与 vmcore 收集、crash 工具、printk 日志级别与 dynamic debug、ftrace 函数追踪、bpftrace/kprobe 动态追踪 | 内核调试与故障定位 |
推荐学习路径
路线 A:操作系统入门与 Linux 日常使用(0-2 年)
- 操作系统概述
— 建立系统框架认知
- 进程与线程
— 理解调度的基本单位
- CPU 调度算法
— 理解系统为什么会"卡"
- 虚拟内存与分页机制
— 理解为什么 32GB 内存也会 OOM
- 文件系统原理
— 理解
ls、cat 背后的数据结构 - Linux IO 栈深度解析
— 理解为什么有时候 SSD 比 HDD 还慢(配置问题)
- Linux 进程管理
— 实战 fork/exec/wait 编程
路线 B:系统编程与内核理解(2-5 年)
- 内存分配与回收
— 深入
malloc 实现 - Linux 内存子系统
— cgroups 与容器内存限制原理
- 现代高性能 IO
— 掌握 epoll / io_uring
- 同步原语
— 用户态与内核态锁的实现对比
- 死锁
— 设计阶段规避并发陷阱
- Linux 信号机制
— 信号在异步编程中的正确使用
- Linux 网络编程基础
— Socket 编程与性能调优
- 系统性能诊断与调优
— perf / bpftrace 工具链
路线 C:内核开发与性能专家(5 年+)
- 中断与异常处理
— 理解系统响应延迟来源
- 多处理器与缓存一致性
— 多核并发的硬件基础
- Linux 内核编译与模块开发
— 动手写一个内核模块
- 操作系统对比 — 拓宽内核设计视野
- 现代 OS 趋势 — 跟踪操作系统前沿
相关专题推荐
- C++ 系统编程:https://plumephp.com/posts/cpp/ — C++ 进程/线程/内存管理与 OS 原语的映射关系
- 数据结构与算法:https://plumephp.com/posts/cs-fundamentals/ — 调度算法、同步算法的理论基础
- 计算机网络:https://plumephp.com/posts/network/ — 网络协议在 Linux TCP/IP 栈中的实现
- 分布式系统:https://plumephp.com/posts/distributed-systems/ — 分布式共识与容错建立在单机 OS 基础之上
- 容器与 Kubernetes:https://plumephp.com/posts/kubernetes/ — Namespace、Cgroups 是容器的 OS 根基
- 计算机图形学:https://plumephp.com/posts/graphics/ — 显存管理、DMA、中断与 GPU 渲染管线的底层关联
- 高性能计算 HPC:https://plumephp.com/posts/hpc/ — Slurm 调度、NUMA 优化、InfiniBand RDMA 与 OS 资源管理的深度结合
- C++ 多线程基础:
std::thread、互斥量与条件变量
— 从 OS 进程线程到 C++ 用户态线程编程 - C++ 内存模型深度解析:从栈堆到对象生命周期
— OS 内存管理在 C++ 语言层面的映射
- C++ 原子操作与内存序:从无锁编程到内存屏障
— MESI 缓存一致性与 C++
std::atomic 的衔接 - CUDA 编程入门:从 Hello GPU 到线程网格模型
— GPU 体系结构与 OS 设备管理的关联
- CUDA 内存管理与性能优化:Bank Conflict 与合并访问
— GPU 显存优化与 OS 内存子系统的对比学习
持续更新计划
- eBPF 深入:从
bpftrace 脚本到 CO-RE/BTF 可移植 eBPF 程序开发 - Linux 内核新版本特性:sched_ext 用户态调度器、io_uring 新操作码
- Rust-for-Linux:用 Rust 编写安全内核模块的实践路径
- 内存分层技术:CXL 内存扩展、持久内存(PMem)与
mmap 的结合 - 实时操作系统:PREEMPT_RT 补丁、实时调度策略与工业控制应用
最后的话:操作系统是所有上层技术的地基。理解 OS 后,你会发现数据库、分布式系统、容器、编译器——它们共同的话题始终是"怎么管理资源"和"怎么保证正确性"。这门课值得反复学。