跳转至

学习指南

底层系统学习指南结构图

如何使用本学习系统

作者: 誌 更新日期: 2026-01-29


📚 文件结构说明

Text Only
底层系统/
├── 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用户

Bash
# Ubuntu/Debian
sudo apt-get install gcc g++ gdb python3

# Mac
xcode-select --install
brew install gcc gdb python3

验证安装

Bash
gcc --version
gdb --version
python3 --version

第四步:开始学习

  1. 打开 01-计算机系统概述/01-计算机是如何工作的.md
  2. 阅读概念和示例
  3. 运行代码示例
  4. 完成实验任务

第五步:记录进度

progress.md 中记录你的学习进度。


📖 学习方法

三遍学习法

对于每个主题,建议学习三遍:

第一遍:理解概念 - 阅读理论解释 - 理解核心思想 - 看懂示例代码

第二遍:动手实验 - 亲自运行代码 - 使用工具观察 - 修改参数看效果

第三遍:深入思考 - 回答章节问题 - 尝试解释给他人 - 总结核心要点

实验方法

每个实验的标准流程

Text Only
1. 阅读实验说明
2. 预测实验结果
3. 执行实验步骤
4. 观察实际结果
5. 对比预测与实际
6. 分析差异原因
7. 记录实验结论

实验记录模板

Markdown
## 实验X:实验名称

### 实验目的
[描述你想验证什么]

### 实验步骤
1. [步骤1]
2. [步骤2]

### 预期结果
[你预测会发生什么]

### 实际结果
[实际发生了什么]

### 差异分析
[如果有差异,分析原因]

### 实验结论
[学到了什么]

使用工具观察

Compiler Explorer (godbolt.org)

C++
// 1. 打开 godbolt.org
// 2. 左侧输入C++代码
// 3. 右侧查看生成的汇编
// 4. 尝试不同的编译器优化级别 (-O0, -O1, -O2, -O3)

GDB调试

Bash
# 编译时添加调试信息
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查看可执行文件

Bash
# 查看可执行文件结构
objdump -h program

# 反汇编
objdump -d program

# 查看符号表
objdump -t program

# 查看所有信息
readelf -a program

strace跟踪系统调用

Bash
# 查看程序的所有系统调用
strace ./program

# 只查看文件操作
strace -e trace=file ./program

perf性能分析

Bash
# 记录性能数据
perf record ./program

# 查看报告
perf report

# 查看缓存命中率
perf stat -e cache-misses,cache-references ./program

使用AI工具的正确姿势

不要: - 直接让AI解释整个概念 - 复制AI的回答而不思考 - 跳过实验直接问AI结果

应该: - 先自己阅读教程内容 - 遇到不理解的具体问题再问AI - 让AI帮你检查实验结果 - 让AI出变式题目检验理解

示例对话

Text Only
❌ 错误用法:
用户:给我解释一下编译原理
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. 理解检查:我能用自己的话解释这个主题吗?
  2. 实验检查:我完成了所有实验吗?结果符合预期吗?
  3. 工具检查:我能独立使用相关工具吗?
  4. 联系检查:我能说出这个主题与其他主题的联系吗?

如果以上都是"是",恭喜你掌握了!可以进入下一个章节。


💡 学习技巧

技巧1:画图理解

遇到难理解的概念,画图!

示例:程序内存布局

Text Only
高地址
┌─────────────────┐
│    内核空间      │  ← 操作系统使用
├─────────────────┤
│    栈 (Stack)   │  ← 向下增长
│       ↓         │
│                 │
│                 │
│       ↑         │
│    堆 (Heap)    │  ← 向上增长
├─────────────────┤
│    数据段       │  ← 全局变量、静态变量
├─────────────────┤
│    代码段       │  ← 程序指令
├─────────────────┤
低地址

技巧2:对比学习

对比相似概念,记住区别。

示例:编译型语言 vs 解释型语言

特性 C/C++ Python
执行方式 编译后执行 解释执行
速度
调试 需要重新编译 直接修改运行
类型检查 编译时 运行时

技巧3:从现象反推原理

观察现象,反推底层原理。

示例: - 现象:程序访问越界数组时崩溃 - 反推:操作系统有内存保护机制 - 深入:页表、段错误信号

技巧4:建立知识图谱

将学到的知识连接起来。

Text Only
源代码
编译器(词法→语法→语义→优化→代码生成)
汇编代码
汇编器
目标文件
链接器(符号解析→重定位)
可执行文件
加载器(创建进程→分配内存→加载代码)
CPU执行(取指→译码→执行→访存→写回)

技巧5:记录"为什么"

不仅记录"是什么",更要记录"为什么"。

笔记模板

Markdown
## 概念名称

**是什么**:[定义]

**为什么**:[设计原因/解决的问题]

**怎么做**:[实现方式]

**例子**:[具体例子]

📝 笔记建议

记什么?

  1. 核心概念:用自己的话解释
  2. 关键过程:分步骤记录
  3. 实验记录:实验步骤和结果
  4. 工具命令:常用命令速查
  5. 问题与解决:遇到的问题和解决方法

怎么记?

使用Markdown格式,便于检索:

Markdown
## 主题名称

**核心思想**- 要点1
- 要点2

**关键过程**1. 第一步
2. 第二步

**实验记录**- 实验1:[结果]
- 实验2:[结果]

**常用命令**```text
# 命令1
gcc -o output input.c

# 命令2
objdump -d program
```

**问题记录**| 问题 | 解决 | 日期 |
|-----|------|------|
| 问题1 | 解决1 | 2026-01-29 |

🔗 推荐资源

在线工具

  1. Compiler Explorer (godbolt.org)
  2. 在线查看编译后的汇编代码
  3. 支持多种编译器和优化级别

  4. Python Tutor (pythontutor.com)

  5. 可视化Python代码执行过程
  6. 理解变量、内存、调用栈

  7. x86-64参考

  8. Felix Cloutier's x86 Instruction Reference
  9. 完整的x86-64指令参考

  10. OSDev Wiki

  11. 操作系统开发知识库
  12. 深入理解操作系统原理

视频课程

  1. CMU 15-213: Introduction to Computer Systems
  2. 深入理解计算机系统配套课程
  3. 英文,B站有字幕版

  4. Stanford CS107: Programming Paradigms

  5. 编程范式,包含汇编和系统编程
  6. 英文

  7. MIT 6.004: Computation Structures

  8. 从逻辑门到操作系统
  9. 英文

实践平台

  1. Linux内核源码
  2. 阅读真实操作系统代码
  3. 从简单模块开始

  4. xv6操作系统

  5. 教学用简化版Unix
  6. 适合学习操作系统实现

  7. LLVM项目

  8. 现代编译器基础设施
  9. 学习编译器实现

🎓 进阶建议

学完基础后

  1. 专项深入:选择一个方向深入研究
  2. 编译器优化
  3. 操作系统内核
  4. 高性能计算
  5. 嵌入式系统

  6. 阅读源码:阅读经典项目源码

  7. Linux内核
  8. GCC/LLVM
  9. Redis/Nginx

  10. 参与开源:贡献开源项目

  11. 从小任务开始
  12. 修复文档、简单bug

持续学习

  • 每周:完成1-2个实验
  • 每月:复习一个阶段的内容
  • 每季度:尝试一个实战项目

💬 学习社区

推荐社区

  1. Stack Overflow:技术问答
  2. GitHub:开源项目和技术博客
  3. Reddit r/programming:编程讨论
  4. 知乎:中文技术讨论

交流技巧

  • 分享你的理解:教别人是最好的学习
  • 提问具体:不要问"为什么我的程序错了",要问"这个段错误可能是什么原因"
  • 记录总结:形成自己的知识体系

📞 遇到问题怎么办?

问题排查流程

  1. 重读教程:检查是否遗漏关键信息
  2. 检查环境:确认工具安装正确
  3. 简化问题:用最简单的代码复现问题
  4. 搜索资料:Google/Stack Overflow
  5. 使用工具:用调试器、日志等定位问题
  6. 请教AI:描述具体问题(不是直接要答案)
  7. 社区求助:在技术社区提问

提问模板

Text Only
## 问题描述
我正在学习XX主题,遇到了XX问题

## 我的理解
我认为...(描述你的理解)

## 我的尝试
我尝试了...(描述你的尝试)
代码如下:
```text
// 你的代码
```

## 实际结果
[实际发生了什么,错误信息是什么]

## 我的困惑
我不明白为什么...(具体问题)

## 我已经尝试过的方法
1. ...
2. ...

🎉 最后的建议

成功要素

  1. 坚持:底层知识需要时间消化
  2. 实践:光看不动手是学不会的
  3. 思考:多问"为什么"
  4. 记录:好记性不如烂笔头

心态调整

  • ❌ 不要:追求速度,囫囵吞枣
  • ✅ 应该:追求理解,稳扎稳打

  • ❌ 不要:遇到困难就放弃

  • ✅ 应该:分解问题,逐个击破

  • ❌ 不要:只学不练

  • ✅ 应该:边学边练,学以致用

祝你学习顺利!加油!💪

如有问题,随时查看本指南或查阅相关资料。

记住:底层学习是一个长期过程,不要急于求成。每理解一个底层原理,你的技术能力就提升一个层次!