学习指南¶
如何使用本学习系统
作者: 誌 更新日期: 2026-01-29
📚 文件结构说明¶
底层系统/
├── README.md # 总览和学习路线
├── LEARNING_GUIDE.md # 本文件:学习指南
│
├── 01-计算机系统概述/ # 第一阶段:建立全局认知
│ ├── 01-计算机是如何工作的.md
│ └── 02-从代码到执行的旅程.md
│
├── 02-编译原理基础/ # 第二阶段:编译过程详解
│ ├── 01-编译器的工作原理.md
│ ├── 02-预处理与词法分析.md
│ ├── 03-语法分析与AST.md
│ ├── 04-中间代码与优化.md
│ ├── 05-目标代码生成.md
│ └── 06-链接器与可执行文件.md
│
├── 03-程序运行原理/ # 第三阶段:程序如何运行
│ ├── 01-程序加载与进程创建.md
│ ├── 02-内存布局详解.md
│ ├── 03-函数调用与栈帧.md
│ ├── 04-系统调用机制.md
│ └── 05-动态链接与共享库.md
│
├── 04-CPU与指令执行/ # 第四阶段:CPU层面
│ ├── 01-CPU架构基础.md
│ ├── 02-指令集与汇编语言.md
│ └── 03-CPU架构对比与发展趋势.md
│
├── 05-GPU并行计算/ # 第五阶段:GPU层面
│ ├── 01-GPU架构概述.md
│ ├── 02-GPU编程模型.md
│ ├── 03-CUDA编程入门.md
│ ├── 04-并行计算原理.md
│ └── 05-内存模型与数据传输.md
│
├── 06-操作系统交互/ # 第六阶段:操作系统原理与追踪
│ ├── 01-操作系统核心概念.md
│ └── 02-eBPF与系统调用追踪.md
│
├── 07-实战项目/ # 第七阶段:动手实践
│ ├── 01-手写一个简单的编译器.md
│ └── 02-实现一个内存分配器.md
│
├── images/ # 图片资源
│ └── systems-learning-guide.svg
│
└── templates/ # 代码模板
├── c_examples/
└── python_examples/
🚀 快速开始¶
第一步:了解学习路线¶
从 README.md 开始,了解整个学习路径和各阶段目标。
第二步:检查前置知识¶
本教程假设你已经具备: - ✅ C++基础语法(变量、函数、指针、类) - ✅ Python基础语法 - ✅ 基本的命令行操作 - ✅ 使用过IDE或文本编辑器
如果你还不具备这些基础,建议先学习 算法/ 和 python/ 中的基础内容。
第三步:准备工具环境¶
Windows用户: 1. 安装 MSYS2 或 WSL2 2. 安装 GCC:pacman -S mingw-w64-x86_64-gcc 3. 安装 GDB:pacman -S mingw-w64-x86_64-gdb 4. 安装 Python(已安装则跳过)
Linux/Mac用户:
# Ubuntu/Debian
sudo apt-get install gcc g++ gdb python3
# Mac
xcode-select --install
brew install gcc gdb python3
验证安装:
第四步:开始学习¶
- 打开
01-计算机系统概述/01-计算机是如何工作的.md - 阅读概念和示例
- 运行代码示例
- 完成实验任务
第五步:记录进度¶
在 progress.md 中记录你的学习进度。
📖 学习方法¶
三遍学习法¶
对于每个主题,建议学习三遍:
第一遍:理解概念 - 阅读理论解释 - 理解核心思想 - 看懂示例代码
第二遍:动手实验 - 亲自运行代码 - 使用工具观察 - 修改参数看效果
第三遍:深入思考 - 回答章节问题 - 尝试解释给他人 - 总结核心要点
实验方法¶
每个实验的标准流程:
实验记录模板:
## 实验X:实验名称
### 实验目的
[描述你想验证什么]
### 实验步骤
1. [步骤1]
2. [步骤2]
### 预期结果
[你预测会发生什么]
### 实际结果
[实际发生了什么]
### 差异分析
[如果有差异,分析原因]
### 实验结论
[学到了什么]
使用工具观察¶
Compiler Explorer (godbolt.org)
GDB调试
# 编译时添加调试信息
gcc -g -o program program.c
# 启动GDB
gdb ./program
# 常用命令
(gdb) break main # 在main函数设置断点
(gdb) run # 运行程序
(gdb) next # 单步执行(不进入函数)
(gdb) step # 单步执行(进入函数)
(gdb) print variable # 打印变量值
(gdb) info registers # 查看寄存器
(gdb) x/10x $rsp # 查看内存
(gdb) continue # 继续执行
(gdb) quit # 退出
objdump查看可执行文件
# 查看可执行文件结构
objdump -h program
# 反汇编
objdump -d program
# 查看符号表
objdump -t program
# 查看所有信息
readelf -a program
strace跟踪系统调用
perf性能分析
# 记录性能数据
perf record ./program
# 查看报告
perf report
# 查看缓存命中率
perf stat -e cache-misses,cache-references ./program
使用AI工具的正确姿势¶
❌ 不要: - 直接让AI解释整个概念 - 复制AI的回答而不思考 - 跳过实验直接问AI结果
✅ 应该: - 先自己阅读教程内容 - 遇到不理解的具体问题再问AI - 让AI帮你检查实验结果 - 让AI出变式题目检验理解
示例对话:
❌ 错误用法:
用户:给我解释一下编译原理
AI:(长篇大论)
用户:(看完就忘)
✅ 正确用法:
用户:我学习了词法分析,Token这个概念我理解是程序的最小单元。
但我有个疑问:为什么 "int" 和 "main" 是不同类型的Token?
AI:这是因为...
用户:哦,原来关键字和标识符有区别。那 "intmain" 会被分成几个Token?
AI:...
📅 学习计划¶
每日学习建议¶
工作日(每天1-2小时): - 30分钟:阅读学习资料 - 30分钟:运行示例代码 - 30分钟:完成实验任务
周末(每天2-3小时): - 60分钟:复习本周内容 - 60分钟:完成较复杂的实验 - 60分钟:总结整理笔记
学习周期¶
| 阶段 | 时间 | 内容 |
|---|---|---|
| 阶段一 | 1周 | 计算机系统概述 |
| 阶段二 | 2周 | 编译原理基础 |
| 阶段三 | 1.5周 | 程序运行原理 |
| 阶段四 | 1.5周 | CPU与指令执行 |
| 阶段五 | 1.5周 | GPU并行计算 |
| 阶段六 | 1.5周 | 操作系统交互 |
| 阶段七 | 持续 | 实战项目 |
总计:约9-10周完成基础学习,之后持续进行实战项目。
🎯 学习检查点¶
每完成一个章节,问自己:¶
- 理解检查:我能用自己的话解释这个主题吗?
- 实验检查:我完成了所有实验吗?结果符合预期吗?
- 工具检查:我能独立使用相关工具吗?
- 联系检查:我能说出这个主题与其他主题的联系吗?
如果以上都是"是",恭喜你掌握了!可以进入下一个章节。
💡 学习技巧¶
技巧1:画图理解¶
遇到难理解的概念,画图!
示例:程序内存布局
高地址
┌─────────────────┐
│ 内核空间 │ ← 操作系统使用
├─────────────────┤
│ 栈 (Stack) │ ← 向下增长
│ ↓ │
│ │
│ │
│ ↑ │
│ 堆 (Heap) │ ← 向上增长
├─────────────────┤
│ 数据段 │ ← 全局变量、静态变量
├─────────────────┤
│ 代码段 │ ← 程序指令
├─────────────────┤
低地址
技巧2:对比学习¶
对比相似概念,记住区别。
示例:编译型语言 vs 解释型语言
| 特性 | C/C++ | Python |
|---|---|---|
| 执行方式 | 编译后执行 | 解释执行 |
| 速度 | 快 | 慢 |
| 调试 | 需要重新编译 | 直接修改运行 |
| 类型检查 | 编译时 | 运行时 |
技巧3:从现象反推原理¶
观察现象,反推底层原理。
示例: - 现象:程序访问越界数组时崩溃 - 反推:操作系统有内存保护机制 - 深入:页表、段错误信号
技巧4:建立知识图谱¶
将学到的知识连接起来。
源代码
↓
编译器(词法→语法→语义→优化→代码生成)
↓
汇编代码
↓
汇编器
↓
目标文件
↓
链接器(符号解析→重定位)
↓
可执行文件
↓
加载器(创建进程→分配内存→加载代码)
↓
CPU执行(取指→译码→执行→访存→写回)
技巧5:记录"为什么"¶
不仅记录"是什么",更要记录"为什么"。
笔记模板:
📝 笔记建议¶
记什么?¶
- 核心概念:用自己的话解释
- 关键过程:分步骤记录
- 实验记录:实验步骤和结果
- 工具命令:常用命令速查
- 问题与解决:遇到的问题和解决方法
怎么记?¶
使用Markdown格式,便于检索:
## 主题名称
**核心思想**:
- 要点1
- 要点2
**关键过程**:
1. 第一步
2. 第二步
**实验记录**:
- 实验1:[结果]
- 实验2:[结果]
**常用命令**:
```text
# 命令1
gcc -o output input.c
# 命令2
objdump -d program
```
**问题记录**:
| 问题 | 解决 | 日期 |
|-----|------|------|
| 问题1 | 解决1 | 2026-01-29 |
🔗 推荐资源¶
在线工具¶
- Compiler Explorer (godbolt.org)
- 在线查看编译后的汇编代码
-
支持多种编译器和优化级别
-
Python Tutor (pythontutor.com)
- 可视化Python代码执行过程
-
理解变量、内存、调用栈
-
x86-64参考
- Felix Cloutier's x86 Instruction Reference
-
完整的x86-64指令参考
-
OSDev Wiki
- 操作系统开发知识库
- 深入理解操作系统原理
视频课程¶
- CMU 15-213: Introduction to Computer Systems
- 深入理解计算机系统配套课程
-
英文,B站有字幕版
-
Stanford CS107: Programming Paradigms
- 编程范式,包含汇编和系统编程
-
英文
-
MIT 6.004: Computation Structures
- 从逻辑门到操作系统
- 英文
实践平台¶
- Linux内核源码
- 阅读真实操作系统代码
-
从简单模块开始
-
xv6操作系统
- 教学用简化版Unix
-
适合学习操作系统实现
-
LLVM项目
- 现代编译器基础设施
- 学习编译器实现
🎓 进阶建议¶
学完基础后¶
- 专项深入:选择一个方向深入研究
- 编译器优化
- 操作系统内核
- 高性能计算
-
嵌入式系统
-
阅读源码:阅读经典项目源码
- Linux内核
- GCC/LLVM
-
Redis/Nginx
-
参与开源:贡献开源项目
- 从小任务开始
- 修复文档、简单bug
持续学习¶
- 每周:完成1-2个实验
- 每月:复习一个阶段的内容
- 每季度:尝试一个实战项目
💬 学习社区¶
推荐社区¶
- Stack Overflow:技术问答
- GitHub:开源项目和技术博客
- Reddit r/programming:编程讨论
- 知乎:中文技术讨论
交流技巧¶
- 分享你的理解:教别人是最好的学习
- 提问具体:不要问"为什么我的程序错了",要问"这个段错误可能是什么原因"
- 记录总结:形成自己的知识体系
📞 遇到问题怎么办?¶
问题排查流程¶
- 重读教程:检查是否遗漏关键信息
- 检查环境:确认工具安装正确
- 简化问题:用最简单的代码复现问题
- 搜索资料:Google/Stack Overflow
- 使用工具:用调试器、日志等定位问题
- 请教AI:描述具体问题(不是直接要答案)
- 社区求助:在技术社区提问
提问模板¶
## 问题描述
我正在学习XX主题,遇到了XX问题
## 我的理解
我认为...(描述你的理解)
## 我的尝试
我尝试了...(描述你的尝试)
代码如下:
```text
// 你的代码
```
## 实际结果
[实际发生了什么,错误信息是什么]
## 我的困惑
我不明白为什么...(具体问题)
## 我已经尝试过的方法
1. ...
2. ...
🎉 最后的建议¶
成功要素¶
- 坚持:底层知识需要时间消化
- 实践:光看不动手是学不会的
- 思考:多问"为什么"
- 记录:好记性不如烂笔头
心态调整¶
- ❌ 不要:追求速度,囫囵吞枣
-
✅ 应该:追求理解,稳扎稳打
-
❌ 不要:遇到困难就放弃
-
✅ 应该:分解问题,逐个击破
-
❌ 不要:只学不练
- ✅ 应该:边学边练,学以致用
祝你学习顺利!加油!💪
如有问题,随时查看本指南或查阅相关资料。
记住:底层学习是一个长期过程,不要急于求成。每理解一个底层原理,你的技术能力就提升一个层次!