- 教程
【免费下载链接】lowlevelprogramming-university
How to be low-level programmer
本指南以仓库中文版路线图 README_cn.md 为核心骨架,系统拆解"如何成为一名底层(low-level)程序员"的完整路径:先讲清底层编程的定义边界,再沿"理论 → 汇编/C 语言 → 硬件与固件 → 自制内核 → Linux 内核与设备驱动 → 未来趋势"逐层展开,并补充英文原版 README.md 中"如何开始"的行动顺序。读者读完可获得一张可执行的自学地图,以及每条路径上经过验证的书目、项目与练习建议。
这份路线图是什么:写给想成为底层程序员的人
仓库中的中文版路线图开篇就交代了它的定位与由来。作者受 google-interview-university 学习路线的启发,决定以一名从业者的视角分享自己的经验,并绘制一条"成为底层程序员"的成长路线图——因为这类技能正在变得越来越稀缺,同时也有大量学生和初学者在反复追问同一个问题:怎样才能成为底层程序员,或者 Linux 内核工程师。
作者在文档中自述拥有超过 10 年的底层编程实战经验,覆盖了从处理器指令到内核子系统的多个层次:
- 80x86 汇编编程;
- 基于 Atmel 芯片的硬件与固件开发;
- Unix 环境下的 C 语言系统编程;
- Linux 设备驱动开发;
- Linux 内核内存页分配;
- Linux 内核块设备驱动与 md 模块。
定位:路线图,而不是链接收藏集
文档特别强调了一个方法论层面的观点:它是一条路线图、一份指导,而不是链接/书籍/课程的收藏集。以 Arduino 为例,文档只负责给出"Arduino"这个关键词和它在大图中的位置,不负责展开嵌入式系统细节。读者拿到关键词后,接下来的动作应当是去搜索、购买开发套件,然后自己动手做一些事情——而不是继续收集链接或免费书单。
这一点对初学者极其重要:底层编程是一门手艺,阅读只是入口,亲手实现才是真正提升的路径。仓库英文原版也以一句原话点破了这个原则:"Implementing one thing is better than knowing one hundred theories."(实现一件事,胜过知道一百条理论。)
什么是底层编程?
要规划学习路径,先要明确"底层"的定义边界。中文版文档给出的判定标准非常朴素而可操作:
底层编程是非常接近设备(机器)的编程,使用较底层的语言,例如 C 或汇编。
这与用户空间(user-space)的应用程序形成对照——上层应用通常使用 Python、Java 这类高层语言编写,开发时无需关心机器与硬件的细节。
与系统编程的异同
系统编程(systems programming)是与底层编程非常接近的另一个概念,但二者并不完全重合。中文版文档明确指出:本文还包含硬件设计与固件开发部分,而这部分内容并不属于系统编程的范畴。也就是说,"底层"的外延比"系统编程"更大,向下一直延伸到芯片和电路。
跨度:从硬件到 Linux 内核
从硬件元器件到 Linux 内核,本文覆盖了非常宽泛的层次栈。正因如此,文档坦言"一篇文章无法阐述所有层次的详细内容",它的目标只是告诉你怎么开始成为底层程序员——每个层次的具体深入,需要你在获得起点之后自行推进。
理论:计算机体系结构与操作系统
底层编程有两大背景理论,它们是所有后续实践的地基:
- 计算机体系结构(Computer Architecture)——理解 CPU 如何取指、译码、执行,内存如何寻址,缓存与分页如何运作;
- 操作系统(Operating Systems)——理解进程调度、内存管理、文件系统与设备抽象如何被设计出来。
理论怎么学:把握大方向即可
中文版文档给出的建议是:可以在 Coursera、edX 这类在线教育平台上找到质量很高的课程,但理论只是理论——你不需要在这些课程上拿到 A+,关键是要理解整个课程的大致原理。随着经验的积累,这些理论会逐步内化为工程直觉。
仓库英文原版在理论部分补充了一批作者亲自读过的经典教材,值得按需挑选:
- 计算机体系结构:《Computer Architecture: A Quantitative Approach》(第五版)、《Computer Systems: A Programmer's Perspective》(CSAPP)、《Computer Organization and Design: The Hardware/Software Interface》(第四版);
- 操作系统:《The Magic Garden Explained: The Internals of UNIX System V Release 4》、《The Design of the UNIX Operating System》、William Stallings 的《Operating Systems: Internals and Design Principles》;
- 通用编程素养:《Structure and Interpretation of Computer Programs》(SICP),并配有作者本人完成了约 80% 习题的练习仓库;
- 硬件设计实践:自己动手搭建一套 8086 微处理器套件(Build Your Own 8086 Microprocessor Kit)。英文原版作者把这段大学经历称为"上过的最有价值的课程之一"——亲手把外设定位到物理内存地址上,亲眼看到 BUS、IRQ、Clock、Power 等主要硬件组件如何工作,才能真正理解"物理内存映射设备"意味着什么。
编程语言:汇编与 C
在进入应用层之前,语言是底层程序员的基本功。中文版文档将语言部分划分为两条主线:汇编与 C 语言。
汇编语言
学习汇编的重点并不是"掌握某种具体汇编的语法",而是通过汇编理解 CPU 与计算机的内部机理。英文原版给出了一个非常关键的选择建议:x86 与 ARM 二选一即可,不必两者都学;也不必去练最新 CPU 的汇编指令,选择 8086 或 Cortex-M 这样简单且文档完备的架构反而更合适。
中文版路线图推荐的汇编学习资源如下:
| 资源 | 学习重点 |
|---|---|
| 8086 汇编编程(基于 emu8086) | CPU 和计算机体系结构的基本概念;C 语言的基本概念 |
| 64 位汇编编程(中文翻译中) | 现代 CPU 和计算机体系结构;C 语言的反汇编与调试 |
| ARM Architecture Reference Manual(第 2 版) | ARM 编程的完整参考手册 |
| 《计算机组成和设计》MIPS 版 / ARM 版 | 从零解释计算机各部件如何工作;详细讲解体系结构概念 |
其中《计算机组成和设计》是典型的大学教材,作者对它有几点重要说明:
- 它的目的不是把你训练成某种特定汇编语言的专家,而是讲透计算机体系结构的方方面面;
- MIPS 版与 ARM 版阐述的是同一批主题,只是分别以不同体系结构作为解剖对象;
- 两个版本都包含 x86 世界中的例子,方便对照理解。
C 语言
中文版文档对 C 语言的态度非常直接:学习 C 没有捷径,你要读完整本书,并解决书上的全部练习题。
推荐的 C 语言书单与配套读物包括:
- 《C Programming: A Modern Approach》(第 2 版)——系统性最强的主流 C 教材,适合作为第一本精读书;
- 《The C Programming Language》(第 2 版,K&R)——C 语言之父的经典之作,常被用作大学教材,也是英文原版"如何开始"一节中被要求"尽全力做完每一道习题"的书;
- 《Modern C》(Jens Gustedt)——面向 C 语言新标准的读物,帮助读者跟上标准演进;
- 《Is Parallel Programming Hard, And, If So, What Can You Do About It?》(perfbook)——用 C 语言实现同步(synchronization)的底层教材,是大型 C 程序设计(尤其是 Linux 内核编程)的必备读物;
- 《Michael Abrash's Graphics Programming Black Book》特辑——使用 C 语言和少量 x86 汇编做优化的参考书,内容从 8088 时代一路覆盖到当时的现代系统,特别侧重底层图形优化。
为 Eudyptula Challenge 准备的小项目计划
文档中还有一条特别的条目:"C 语言编程的挑战"。作者最初的想法是仿照 Eudyptula Challenge(见后文 Linux 内核部分)组织一份循序渐进的 C 语言练习计划——完成其中全部小项目之后,你就可以具备开启大型项目的信心与基本功。
读完书之后:必须动手做项目
英文原版在 C 语言部分补充了一个近乎强制的要求:读完一两本 C 语言书之后,你必须动手做点东西。你可以从项目驱动教程中挑一两个感兴趣的项目,先自己独立实现,再拿自己的代码与别人的源码逐行对比——"书是死的,源码是活的"(Books are dead and source is live),只有通过阅读他人的实现并学到更好的方法,你的水平才会真正提升。文档还提到,如果你追求成为 C 语言编程专家,可以用数据结构和算法在线练习平台(如 LeetCode)来持续打磨。
应用层面:从硬件固件到 Linux 内核
掌握了语言与理论之后,路线图进入真正的"应用层"——这也是底层程序员区别于其他方向的核心战场。
硬件与固件
起点:Arduino Start Kit
如果你想做一名嵌入式系统工程师,文档给出的建议是:从一个简单的硬件套件开始,而不是直接从最新的 ARM 芯片起步。
Arduino 系列套件中,"Arduino Start Kit"配备的是最简单的处理器——ATmega328P,并附有参考手册。它具备 8 位核心,是进入"数字电路设计"和"固件开发"两个领域的绝佳起点。关于这个套件,文档给出了非常务实的能力边界:
- 你不需要学会怎么画原理图、怎么布板(layout)、怎么组装芯片;
- 但你必须学会读原理图,并理解各芯片之间是怎么连接的;
- 固件工程师应当具备阅读原理图、并能搞清楚如何向目标设备发送数据的能力;
- 唯一要做的,是跟随参考手册一步一步来。
8086 与 80386 官方手册
在 x86 方向上,两份官方手册被列为必读材料:
- 8086 手册:如果你是 x86 体系结构的初学者,它是对处理器架构和 80x86 汇编语言非常好的入门指导;
- 80386 手册:它是对 80x86 处理器**保护模式(protected mode)和分页机制(paging)**最好的指导——这两个概念正是理解现代操作系统内存管理与虚拟地址转换的钥匙,也提供了可在线阅读的网页版本。
转向现代处理器:树莓派、BeagleBone 与 Intel Edison
完成上述基础之后,你就有能力开始接触最新的 ARM 与 x86 处理器了。中文版文档提到的代表性平台包括树莓派(Raspberry Pi)、BeagleBone 以及通过 Arduino 认证的 Intel Edison 等。
以树莓派为例:其开发板搭载支持 64 位指令集的 Cortex-A53 处理器,可以让你亲身体验现代处理器架构。但文档在这里泼了一盆非常清醒的冷水:你可以买一块开发板,但买来之后要做什么?如果你没有目标项目,大概率的结果是把板子扔进抽屉、然后彻底忘掉。
推荐目标项目:制作自己的内核(toy kernel)
为了避免"买板吃灰",文档推荐了一个具体项目:制作自己的内核(Getting Started,即经典的 OSDev 入门指南),并给出了 r/osdev 作为参考资料。
作者本人就实现过一个教学用的小型内核(toy kernel,即 caos 项目),它支持:
- 64 位长模式(long mode);
- 分页(paging);
- 非常简单的上下文切换(context switching)。
文档认为,制作这样一个简易内核,是理解现代计算机体系结构和硬件控制的一条极佳途径。
零成本起步:你不需要买任何东西
一个被初学者普遍忽略的事实是:你手里已经拥有最新的处理器和最新的硬件设备——你的笔记本电脑、你的台式机,就是全部起点。你不需要购买任何硬件,因为QEMU 仿真器可以仿真最新的 ARM 处理器和 Intel 处理器。
因此,起步条件已经全部齐备:安装 QEMU 仿真器,然后做一个能够启动、开启分页、并打印出一些信息的最小内核即可。此外还有大量现成的简易内核和文档可以参考,例如 Little OS Book、tuhdo 的 OS 系列教程(os01)等。
Linux 内核与设备驱动
路线图明确指出:你没有必要从零开发一个完整的操作系统,更好的路径是加入 Linux 社区,参与内核开发。
仔细阅读:按顺序精读的四本书
中文版文档为内核入门规划了一条严格的阅读顺序:
| 顺序 | 书籍 | 阅读重点 |
|---|---|---|
| 1 | 《The Design of the Unix Operating System》 | Unix 系统的基本概念适用于所有操作系统,是理解操作系统核心概念的最佳入门 |
| 2 | 《Linux Device Drivers》 | 必须亲手实现书中所有示例代码 |
| 3 | 《Linux Kernel Development》 | 理解 Linux 内核的设计原理 |
| 4 | 《Understanding the Linux Kernel》 | 结合内核源码同步阅读 |
关于第四本书,文档给出了三条非常具体、可执行的忠告:
- 读这本书的同时要读 v2.6 的内核源码,不要读最新源码——v2.6 版本足够了。旧版本源码更简洁、更容易建立全局观;
- 使用QEMU 和 GDB把内核代码一行一行地跑起来,通过断点与单步调试真正"看见"内核的执行流;
- 使用busybox制作最简单的文件系统,让系统可以在 1 秒内完成启动,从而把调试周期压缩到最短。
实践导师:Eudyptula Challenge
Eudyptula Challenge 在文档中被形容为"一位令人敬畏的私人老师"——它会以一系列精心设计的小任务告诉你该做什么、按什么顺序做。如果你不知道从何下手,就从这里开始。
块设备层与设备驱动
中文版文档还收录了作者自己的系列著作(目前为翻译中/进行中状态),它们把 Linux 存储栈讲得相当透彻:
- 《Block layer and device driver》:从一个具备多队列(multi-queue)模式的简单块设备驱动(Ramdisk)开始,然后一路深入到块设备层(block layer)的内部机制;
- 《md driver of Linux kernel》:讲解 mdadm 工具的工作流程、它如何调用内核 md 驱动,以及 md 驱动内部是怎么工作的——这是理解 Linux 软 RAID(软件磁盘阵列)实现的关键材料。
参考资源:遇到问题时查阅
内核学习路上会遇到大量细节问题,中文版文档给出的两个常备参考:
- Free-electrons 主页:提供了大量质量很高的技术文档,尤其在 ARM-Linux 方向上非常出色;
- Julia Evans 的博文《You can be a kernel hacker!》:一篇指导如何开始内核编程的经典入门文。
英文原版补充:更多实践路径与其他应用领域
仓库英文原版为内核部分补充了若干高质量免费资源,可一并纳入学习计划:
- Linux Device Driver Labs:一套以 Linux 内核实验室形式组织的设备驱动实践指南,几乎覆盖了内核开发所需的全部核心 API;
- 《Learning operating system development using Linux kernel and Raspberry Pi》:一个逐步教你从零写操作系统内核的项目,且每一课都会把 RPi 内核的实现与 Linux 内核的对应实现进行对照;
- 《Lions' Commentary on UNIX 6th Edition, with Source Code》:UNIX 第六版源码注释经典,是理解 Unix 早期设计哲学的必读材料。
此外,英文原版还提醒读者:内核与驱动并不是底层编程的全部。如果你对 Linux 与固件都不感兴趣,底层编程还有其他应用方向——例如 Windows 系统编程与设备驱动、安全(security)、逆向工程(reverse engineering)。另一个重要的底层应用场景是软件定义存储(software-defined storage)与分布式文件系统,英文原版为此推荐了 MIT 6.824 课程及其配套的简易分布式文件系统参考实现。
底层编程的未来趋势
中文版文档在路线图末尾给出了作者眼中三个值得关注的方向。
Rust:下一代系统编程语言
作者明确表示:"如果我有一周的空闲时间,我会学习 Rust。" 理由是 Rust 是当前可以用于开发 Linux 设备驱动程序的最新的语言之一。英文原版在此处补充了更多佐证与学习材料:Linus Torvalds 曾公开表示 Rust 若无意外将进入 Linux 内核 6.1;英文原版还列出了作者本人的 Rust 学习清单,包括《The Rust Programming Language》、Rust by Example、《Programming Rust》(第 2 版)、Exercism 的 Rust 练习轨道、Easy Rust 英文入门书、Let's Get Rusty 视频频道、Rust for Linux 官方项目,以及作者用 Rust 重写《Linux Device Drivers》示例的进行中项目。
IoT 与 Zephyr
IoT 是新的行业趋势,因此值得研究 IoT 所使用的操作系统。ARM、三星等公司拥有自己的实时操作系统(RTOS),但遗憾的是其中很多是闭源的。Linux 基金会则提供了一个开源解决方案:Zephyr——一个面向资源受限物联网设备的实时操作系统项目。
Unikernel 与 library OS
典型的云服务器在软件栈上有很多层:主机 OS、KVM 驱动、QEMU 进程、客机 OS 以及最上层应用服务程序。为提供轻量级虚拟化,容器(container)技术应运而生;而作者判断,在不久的将来,一种被称为 library OS 或Unikernel的新型操作系统形态,可能会取代当前用于虚拟化的整套软件栈。Unikernel 的思路是把应用与最小化的内核功能直接链接成一个单一地址空间镜像,从而大幅削减传统虚拟化栈的开销。
如何开始:一条可落地的行动顺序
中文版文档没有单设"如何开始"一节,但仓库英文原版为此专门补了一节,正好补全整张地图的最后一环。它的行动顺序如下(已完成的步骤可以跳过):
- 阅读操作系统理论书:至少读完 Maurice J. Bach 的《The Design of the UNIX Operating System》;
- 学习汇编与 C:
- 用 8086 汇编入门教程理解汇编编程的基本概念即可,不必做过多实操;
- 精读 K&R《The C Programming Language》,尽全力做完每一道习题;
- 再读《C Programming: A Modern Approach》作为系统补充;
- 用 C 做点实事:从项目驱动教程中挑一两个感兴趣的项目自己做一遍;若找不到感兴趣的项目,专注数据结构和算法(如 LeetCode)也是不错的选择;
- 做一个硬件项目:树莓派或 Arduino 都可以,关键是获得仅用 C 语言直接控制硬件的经验——推荐购买 ATmega128 套件,实现点灯/灭灯、检测开关输入、在文本 LCD 上显示信息,电机控制(如循迹小车 line tracer)也是很好的项目。特别强调:不要使用任何库,除了程序下载器之外全部自己实现;
- 打 Linux 内核基础:底层编程与操作系统息息相关,必须了解 OS 内部。从驱动入手——读《Linux Device Drivers》、做 Linux Device Driver Labs、尝试 Eudyptula Challenge;再读《Linux Kernel Development》理解内核内部设计;
- 走向专业领域:
- 想成为职业 Linux 内核开发者:精读《Understanding the Linux Kernel》,尝试做一个 toy kernel(参考树莓派 OS 项目与 OSDev 入门指南),把内核的 GitHub 链接写进简历并在提交信息里留下详细描述;
- 关注 LWN.net 的最新内核补丁,挑一个自己感兴趣的补丁努力读懂源码;编译内核并在自己系统上测试(例如运行 LTP 的性能与稳定性测试,以及内核自带的各种测试工具);
- 发现问题(编译警告/错误、性能下降、kernel panic/oops)就汇报,测试正常也附上系统规格回报——补丁作者会为你打上 "Reviewed-by" 标签,你的名字就会出现在内核的 git log 中;
- 当然也可以转向其他领域:安全、编译器、固件、机器人/汽车等,底层工程师的用武之地并不只有内核。
仓库结构:一份文档与它的多语言版本
本仓库本身就是一个"路线图即文档"的极简项目:根目录放置了 _config.yml(声明 Jekyll 的 hacker 主题,说明文档可托管为静态站点),主体则是英文原版 README.md 及其多语言翻译版本。中文版文档结尾处说明:如果你愿意翻译本文,可以提交 PR,翻译版本会被列在此处。仓库目前已有的翻译版本包括简体中文 README_cn.md、繁体中文 README_tw.md、葡萄牙语 README_pt.md、意大利语 README_it.md、捷克语 README_cz.md、俄语 README_ru.md、土耳其语 README_tr.md、波斯语 README_fa.md、西班牙语 README_es.md 与法语 README_fr.md,方便不同语言背景的读者按母语阅读同一张路线图。
最后提醒:正如仓库英文原版开头的声明所说,底层编程在当前并非主流招聘方向,相关岗位正在变少;如果你尚未开始职业生涯,请审慎评估。而如果你已经确定要走这条路,那么请记住这份路线图最核心的方法论——不要只收藏链接,动手实现一件事,胜过知道一百条理论。
- 教程
【免费下载链接】lowlevelprogramming-university
How to be low-level programmer
相关推荐
Low-Level Programming University 底层程序员自学路线图:从汇编与 C 到 Linux 内核的系统成长指南
Low Level Programming University 底层程序员自学路线图:从汇编与 C 到 Linux 内核的系统成长指南 本指南围绕开源仓库 l
教程Low-Level Programming University 全指南:从汇编、C 到 Linux 内核的低层级编程学习路线图
Low Level Programming University 全指南:从汇编、C 到 Linux 内核的低层级编程学习路线图 导读 Low Level Pr
教程如何快速成为底层程序员:lowlevelprogramming-university完整学习指南 🚀
如何快速成为底层程序员:lowlevelprogramming university完整学习指南 🚀 想成为一名底层程序员但不知从何开始? lowlevelp
教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考