---
title: 系统编程：从程序启动到 I/O 的学习路线
url: https://doc.liz6.com/systems-programming/00-learning-path
locale: zh
area: systems-programming
tags:
- 系统编程
date: 2026-09-12
modified: 2026-09-12
description: 把源代码、二进制、运行时、系统调用与外部效果连起来，能解释缓冲、错误和持久化边界，并用工具验证。
---

# 系统编程：从程序启动到 I/O 的学习路线

适合能读写 C 或 Rust、知道指针与进程概念的读者。准备一个可编译和调试小程序的 Linux 环境；先用所在机器的体系结构阅读 ABI 示例，其他架构用于对照。此路线不要求先编译内核。

## 学完要能做什么

把源代码、二进制、运行时、系统调用与外部效果连起来，能解释缓冲、错误和持久化边界，并用工具验证。

## 必读顺序与阶段自检

1. [ELF 文件格式](01-elf-and-binary-formats/01-elf-file-format.md) → [加载与启动：从 ELF 入口到 main](01-elf-and-binary-formats/03-loading-and-startup-start-main.md) → [进程内存布局](03-processes-and-memory/01-process-memory-layout.md)。

   编译一个最小程序，查看 ELF 入口与运行时内存映射。自检：区分文件偏移和虚拟地址，解释 main 之前还有哪些工作；每个观测注明架构与构建选项。

2. [Linux x86-64 系统调用 ABI](02-system-call-abi/01-x86-64-system-call-abi.md) → [缓冲 I/O（stdio）](05-io-and-file-systems/01-buffered-i-o-stdio.md)。

   跟踪程序输出，从库缓冲走到 write。ARM64 机器改读同目录 ARM64 篇。自检：解释 printf、fflush、write 与持久化的不同边界，能复现并处理一次延迟暴露的 I/O 错误。

3. [管道与 socketpair](06-ipc-and-synchronization/02-pipes-and-socketpair.md) → [epoll 与事件驱动](05-io-and-file-systems/03-epoll-and-event-driven-programming.md) → [Valgrind 与 Sanitizers 实战](08-performance-and-debugging/02-valgrind-and-sanitizers-in-practice.md)。

   给程序加入管道或 socketpair，再处理短读写、EOF、阻塞和非阻塞。自检：就绪不等于完整消息到齐，错误检查和资源关闭覆盖每条退出路径。

## 选读与前置边界

[ARM64 ABI](02-system-call-abi/02-arm64-system-call-abi.md)与主线 x86-64 篇二选一；之后按需求读[动态链接](01-elf-and-binary-formats/02-dynamic-linking-and-ld-so.md)、[futex](06-ipc-and-synchronization/01-futex-the-kernel-hop-in-userspace-locks.md)与[io_uring](05-io-and-file-systems/02-io_uring.md)。性能分析在可复现基准和正确结果之后进行。

## 完成主线的交付物

完成一个读取输入并通过管道交给子进程处理的小工具，测试空输入、提前关闭和错误路径。附上一次系统调用跟踪，解释哪里缓冲、哪里阻塞、谁拥有各个描述符。需要理解这些接口背后的实现时接[内核路线](../linux-kernel/00-learning-path.md)。

首次阅读允许跳过长证明和实现细节，但要先完成各阶段自检。出现“知道术语、解释不了结果”时，回到当前例子改变一个条件，再进入下一篇；不需要先通读整个目录。
