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 体系结构与进程管理

文章核心内容与 ⭐ 结合阅读
操作系统概述:内核态与用户态、系统调用原理内核态/用户态隔离、特权级(Ring 0-3)、系统调用 ABI(int 0x80 / syscall/sysret)、系统调用与库函数的区别⭐ CS: 进程与线程
进程与线程:从 PCB 到内核调度实体进程控制块 PCB、线程的多种实现(1:1 / N:1 / M:N)、Linux 的 task_struct、CFS 调度器、futex 快速用户态互斥、协程的 OS 视角⭐ CS: 进程与线程
CPU 调度算法:从 FCFS 到 CFS 完全公平调度器FCFS / SJF / RR / 优先级调度 / 多级反馈队列 / CFS 红黑树调度实体、负载均衡、CPU 亲和性、eBPF 调度器扩展⭐ CS: CPU 调度

1.2 内存管理

文章核心内容与 ⭐ 结合阅读
虚拟内存与分页机制:从 MMU 到 TLB虚拟地址空间、页表结构(单级/多级/反置页表)、MMU 地址转换、TLB 缓存、缺页中断(Page Fault)处理流程⭐ CS: 内存管理
内存分配与回收:从 malloc 到 slab 分配器brk/mmap 系统调用、ptmalloc/jemalloc/tcmalloc 对比、内核 slab/slub 分配器、内存碎片(内/外部)、内存映射文件(mmap)Linux glibc 源码
Linux 内存子系统:OOM、Swap 与 cgroup 内存限制overcommit_memory 策略、OOM Killer 打分机制、Swap 分区与 zswap、cgroups v2 内存限制与统计、内存水位(watermark)systemd-cgls 实践

1.3 文件系统与 IO

文章核心内容与 ⭐ 结合阅读
文件系统原理:inode、目录结构与 VFS 抽象层超级块 / inode / dentry / page cache、ext4 索引结构、日志与崩溃一致性、Copy-on-Write(Btrfs/ZFS)、VFS 统一的 file_operations⭐ CS: 文件系统与 IO
Linux IO 栈深度解析:从 VFS 到块设备缓冲 IO vs 直接 IO vs 内存映射 IO、Page Cache 回刷策略(pdflush/flush)、IO 调度算法(Noop/CFQ/Deadline/BFQ)、NVMe 协议与多队列fio 压测实践
现代高性能 IO:epoll、io_uring 与异步 IOselect/poll 的 O(n) 瓶颈、epoll 机制(红黑树 + 就绪链表)、io_uring 零拷贝与共享内存环、与 Reactor/Proactor 模式的映射Go netpoll 源码关联
NVMe 存储栈深入:PCIe 队列对、多队列调度与 io_uring 的结合PCIe 事务与队列对模型、NVMe 多队列与 MSI-X、blk-mq 块层、IO 调度器(none/mq-deadline/kyber)、io_uring IOPOLL 与 SPDK 内核绕过、ZNS 分区命名空间fio io_uring 压测

1.4 同步与死锁

文章核心内容与 ⭐ 结合阅读
同步原语:信号量、互斥锁、条件变量与读写锁内核态 mutex vs 用户态 futex、信号量的 PV 操作、读写锁公平策略、自旋锁(Spinlock)适用场景、RCU 读-拷贝-更新机制⭐ CS: 死锁与同步
死锁:条件、检测、预防与银行家算法死锁四必要条件、资源分配图、银行家算法、哲学家就餐问题、Linux 的 lockdep 死锁检测工具⭐ CS: 死锁与同步

二、Linux 系统编程

2.1 核心系统调用

文章核心内容典型示例
Linux 进程管理:fork、exec、wait 与进程间通信fork 的 Copy-on-Write 实现、exec 系列调用、进程终止与僵尸进程、POSIX 共享内存 / 消息队列 / 信号量、UNIX Domain Socket守护进程编写
Linux 信号机制:从 kill -9 到可靠信号标准信号表、信号发送/递达/处理时序、信号集操作、sigaction 与信号处理函数、信号在并发中的陷阱(非异步信号安全)优雅退出实现
Linux 网络编程基础:Socket API 与 TCP 连接生命周期Socket 创建的完整流程、TCP 三次握手/四次挥手的系统调用映射、SO_REUSEADDR 与端口复用、 SCTP 简介Echo Server 实现

2.2 内核与调试

文章核心内容工具链
Linux 内核编译与模块开发入门内核源码获取与配置(Kconfig)、模块 Makefile、内核模块加载/卸载、printk 日志级别、字符设备注册VMware/物理机
系统性能诊断与调优:strace、perf、bpftracestrace 系统调用跟踪、ltrace 库调用、perf PMU 事件采样、bpftrace 动态追踪、eBPF 程序编写基础线上问题排查
eBPF 可观测与内核追踪:从 BPF 程序模型到生产调试与安全审计BPF 指令集与验证器、程序类型与挂载点(tracepoint/kprobe/uprobe)、BPF Map、bpftrace/BCC/libbpf+CO-RE 三路径、TCP 重传/调度延迟/容器逃逸审计实战bpftrace / bpftool / libbpf

三、体系结构与硬件交互

文章核心内容关联方向
中断与异常处理:从硬件中断到软中断中断向量表、IRQ 与 ISR、中断上下文 vs 进程上下文、NMI 不可屏蔽中断、软中断(softirq / tasklet / workqueue)、IRQ 亲和性与均衡高性能网络驱动
多处理器与缓存一致性:MESI 协议与内存屏障对称多处理器 SMP、NUMA 架构、Cache Line 伪共享、MESI 缓存一致性协议、内存屏障(mb/rmb/wmb)、Store Buffer 与 Invalidate QueueC++ 原子操作关联
系统启动全流程:从 BIOS/UEFI、GRUB 到内核与 systemdBIOS/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 趋势:容器、虚拟化与 UnikernelNamespace/Cgroups 的 OS 视角、KVM/Hyper-V 虚拟化扩展、Unikernel(MirageOS/IncludeOS)、Rust-for-Linux、seL4 形式化验证云原生基础设施
虚拟化与容器隔离:从 KVM/QEMU 到 namespace 与 cgroupKVM/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、时间与内核可观测

文章核心内容关联方向
NUMA 架构与内存亲和性:节点拓扑、访问延迟与 numactl 绑核实战NUMA 节点与本地/远端内存访问延迟、SLIT/SRAT 拓扑表、自动与手工绑核(numactl/taskset)、内存策略(interleave/preferred)、跨节点带宽瓶颈与数据库调优高性能计算与数据库
时间子系统与时钟源:jiffies、hrtimer、clocksource 与 NTP/PTP 校时jiffies 与 HZ、tickless 无滴答内核、hrtimer 高精度定时器、clocksource/clockevent 抽象、TSC 与 HPET 时钟源选择、NTP 与 PTP 校时及时间跳变对程序的影响分布式系统时钟
页缓存与回写机制:脏页、writeback 线程、fsync 语义与脏页限流page cache 与脏页产生、writeback 内核线程与回写周期、dirty_ratio/background_ratio 限流、fsync/fdatasync 与持久化语义、write barrier 与掉电一致性、常见 I/O 抖动排查数据库持久化
futex 与内核同步原语底层:等待队列、唤醒机制与 PI mutexfutex 用户态快路径与内核慢路径、FUTEX_WAIT/WAKE 语义、等待队列与哈希桶、优先级继承 mutex、虚假唤醒与惊群、glibc pthread mutex 与 C++ std::mutex 的底层映射并发编程与性能
ftrace 与内核追踪:tracepoint、kprobe、function_graph 与 perf 联动ftrace 框架与 tracefs 接口、function/function_graph tracer、tracepoint 与 kprobe/uprobe 动态插桩、事件过滤与触发、trace-cmd 与 perf 联动、追踪开销控制与生产使用边界内核可观测性
Linux 审计子系统:auditd、审计规则、系统调用审计与日志分析audit 框架与 auditd、审计规则(-w/-a/-S)与 syscall 过滤、用户与权限变更审计、审计日志格式与 ausearch/aureport 分析、性能开销评估、与 SELinux/合规基线(等保、CIS)的配合安全合规与审计

六、调度、并发、回收与硬件架构纵深

从「知道有这套机制」推进到「读得懂实现、定位得了问题」——调度器演进、内核并发原语、内存回收、eBPF 开发、网络栈与 ARM64:

文章核心内容关联方向
Linux 调度器实现:从 CFS 到 EEVDFCFS 到 EEVDF 的演进、vruntime 与虚拟截止时间、调度类与调度域、PELT 负载跟踪与负载均衡、CPU 亲和性与隔离(isolcpus/cpuset)、sched_ext 用户态调度器、schedstat/perf sched 实测性能调优与实时性
内核并发原语与 RCU 机制原子操作与内存屏障、spinlock/rtmutex/读写锁语义、seqlock、per-CPU 变量、RCU 宽限期与回调机制、lockdep 死锁检测、并发 bug 排查方法内核开发与并发正确性
内存回收机制:LRU、水位与 OOMLRU active/inactive 链表与多代 LRU、kswapd 与内存水位(min/low/high)、直接回收与分配慢路径、swap/zswap/zram、PSI 内存压力、cgroup 回收与 OOM、meminfo/vmstat 实战内存问题定位
eBPF 开发实战:CO-RE 与 libbpfCO-RE 与 BTF 原理、libbpf 骨架生成(bpftool gen skeleton)、Map 类型与 ring buffer、kprobe/tracepoint/fentry 挂载、内核与用户态通信、验证器限制排查与生产部署可观测性与安全审计
内核网络栈:sk_buff、NAPI 与 XDPsk_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 年)

  1. 操作系统概述 — 建立系统框架认知
  2. 进程与线程 — 理解调度的基本单位
  3. CPU 调度算法 — 理解系统为什么会"卡"
  4. 虚拟内存与分页机制 — 理解为什么 32GB 内存也会 OOM
  5. 文件系统原理 — 理解 ls、cat 背后的数据结构
  6. Linux IO 栈深度解析 — 理解为什么有时候 SSD 比 HDD 还慢(配置问题)
  7. Linux 进程管理 — 实战 fork/exec/wait 编程

路线 B:系统编程与内核理解(2-5 年)

  1. 内存分配与回收 — 深入 malloc 实现
  2. Linux 内存子系统 — cgroups 与容器内存限制原理
  3. 现代高性能 IO — 掌握 epoll / io_uring
  4. 同步原语 — 用户态与内核态锁的实现对比
  5. 死锁 — 设计阶段规避并发陷阱
  6. Linux 信号机制 — 信号在异步编程中的正确使用
  7. Linux 网络编程基础 — Socket 编程与性能调优
  8. 系统性能诊断与调优 — perf / bpftrace 工具链

路线 C:内核开发与性能专家(5 年+)

  1. 中断与异常处理 — 理解系统响应延迟来源
  2. 多处理器与缓存一致性 — 多核并发的硬件基础
  3. Linux 内核编译与模块开发 — 动手写一个内核模块
  4. 操作系统对比 — 拓宽内核设计视野
  5. 现代 OS 趋势 — 跟踪操作系统前沿

相关专题推荐


持续更新计划


最后的话:操作系统是所有上层技术的地基。理解 OS 后,你会发现数据库、分布式系统、容器、编译器——它们共同的话题始终是"怎么管理资源"和"怎么保证正确性"。这门课值得反复学。

全部文章 Books game Java Indie golang 客户端开发 Minigame Saas rust Python
os

操作系统安全加固与可信计算:LSM、内核加固、TPM 与容器逃逸防护

操作系统安全的本质是纵深防御:从内核自身的加固(KASLR、栈保护、模块签名),到强制访问控制层 LSM(SELinux/AppArmor),再到硬件信任根(TPM 可信启动与远程证明),以及容器场景的逃逸防护(seccomp、Capabilities、最小权限)。本文先画出攻击面全景,再逐层拆解每一道防线的工作原理与配置方法,最后给出生产环境可落地的加固清单与逃逸事件处置路径。

9 分钟阅读
操作系统 安全 Linux
os

实时操作系统:RTOS 内核设计、优先级反转与 Linux PREEMPT_RT

实时系统关注的不是吞吐,而是「在规定时间之前完成」的确定性。本文从硬实时与软实时的定义出发,拆解 RTOS 内核的任务模型与抢占式调度设计,深入经典难题优先级反转及优先级继承/天花板两种解法,再分析 RMS 与 EDF 的可调度性理论,最后落到 Linux PREEMPT_RT 的演进、实时调度策略(SCHED_FIFO/RR/DEADLINE)、PI-futex 与 cyclictest 实测,给出工业控制与音视频场景的选型建议。

10 分钟阅读
操作系统 Linux
os

NVMe 存储栈深入:PCIe 队列对、多队列调度与 io_uring 的结合

NVMe 通过 PCIe 直连与高深度的多队列把闪存盘的随机 IO 性能推向数百万级 IOPS,但这要求整条存储栈——从驱动队列、块层 blk-mq、IO 调度器到用户态 io_uring——都以极低延迟协作。本文从 PCIe 事务与队列对模型讲起,深入 NVMe 多队列映射、blk-mq 与 IO 调度器,再剖析 io_uring 与 NVMe 结合后的轮询与内核绕过路径,最后给出生产环境压测与调优清单。

10 分钟阅读
操作系统 Linux
os

eBPF 可观测与内核追踪:从 BPF 程序模型到生产调试与安全审计

eBPF 让开发者无需修改内核代码,就能在内核事件发生处动态注入安全受限的程序,是现代可观测性、性能诊断与安全审计的事实标准。本文从 BPF 指令集与验证器出发,拆解程序类型与挂载点(tracepoint/kprobe/uprobe),讲解 BPF Map 的数据通道,再对比 bpftrace、BCC 与 libbpf/CO-RE 三条开发路径,最后给出 TCP 重传追踪、阻塞唤醒分析、execsnoop 审计等真实生产场景的完整脚本。

9 分钟阅读
操作系统 Linux 可观测性
os

虚拟内存与分页机制:从 MMU 到 TLB

虚拟内存是操作系统中最精妙的设计之一。它让程序可以方便地使用连续地址空间进行编码,而无需关心复杂多变的物理内存布局。同时,它也为操作系统调度、进程隔离和内存安全提供了底层支撑。从最早的段页式管理,到现代 x86-64 的多级页表,虚拟内存始终是操作系统与硬件交互最核心的环节之一。

10 分钟阅读
操作系统 Linux 内存管理
os

系统性能诊断与调优:strace、perf、bpftrace

性能问题往往没有统一的标准答案,但 Linux 提供了一套完整的工具链,可以从不同层面揭示系统的运行状况。本文系统介绍从系统调用跟踪到内核动态追踪的常用工具,帮助开发者在面对高 CPU、高延迟或资源瓶颈时快速定位根因。strace:系统调用跟踪 strace 是最基础也是使用率最高的诊断工具之一。

8 分钟阅读
操作系统 Linux 性能优化
os

同步原语:信号量、互斥锁、条件变量与读写锁

在多核处理器成为主流的当下,并发编程已是必备技能。然而,并发带来的竞态条件(Race Condition)和数据不一致问题要求我们借助同步原语来协调多个执行单元对共享资源的访问。本文从底层实现出发,逐一剖析 Linux 中最常用的同步机制:互斥锁、信号量、条件变量、读写锁、自旋锁和 RCU,并给出选

8 分钟阅读
操作系统 Linux 并发