- 教程
【免费下载链接】lowlevelprogramming-university
How to be low-level programmer
本文围绕开源仓库 lowlevelprogramming-university 的路线图文档展开,系统梳理"什么是底层编程"、计算机体系结构与操作系统两大理论基石、汇编 / C / Rust 三种底层语言的进阶路径,以及硬件固件、Linux 内核与设备驱动、存储与安全等主流应用方向,并给出作者亲身实践的循序渐进行动清单。读完本文,你将获得一条可直接落地的底层程序员成长路径,以及从阅读补丁、构建内核到融入 Linux 内核社区的一整套实战方法。
这究竟是一份什么样的文档?
Low-Level Programming University 是一份面向底层程序员与 Linux 内核工程师的学习路线图。作者在文中明确表示,其灵感来自广为人知的 google-interview-university 系列,动机是分享自己的经验并展示成为底层程序员的路线图——因为他发现这些技能已不像过去那样常见,同时也有许多学生和初学者向他请教"如何成为底层程序员"与"如何成为 Linux 内核工程师"。
它是路线图,不是链接收藏夹
作者反复强调一个关键定位:这份页面只是一个给初学者的 roadmap,不可能囊括所有链接、书籍和课程。例如文档介绍了 Arduino,但并没有给出关于 Arduino 和嵌入式系统的详细资料——这一步需要读者自己去探索。作者的逻辑很朴素:你已经拥有了"Arduino"这个关键词,下一步应该是去搜索 Arduino、买一套开发套件、亲自动手做点东西,而不是把链接和免费书籍收藏起来。
同时,底层编程是计算机科学的一个分支,作者建议在开始之前最好先接受系统的计算机科学教育,文中明确指向了 OSSU 社区提供的免费自学教育路线。
使用前的三条前置提醒
原文档开篇列有三条注意事项,其中包含了对行业现状非常坦诚的提醒:
- 转载约定:请不要把本页内容复制到个人博客;可以分享本页,但请附上原始链接,以此表达对优秀文档与开源项目作者的尊重。
- 行业现实:底层编程已不在趋势中心,目前雇佣底层语言开发者的公司并不多,作者坦言在这一领域找工作正变得越来越困难。如果你尚未开始职业生涯,建议审慎考虑其他领域。
- 快速入口:如果想直接开始,请跳到文末的"如何开始"章节。
仓库形态:一份纯文档型的开源课程
与通常的"代码仓库 + README"不同,本仓库没有任何源代码,全部价值都承载于文档本身:根目录下的 README.md(英文原版)及其十余种语言翻译版(包括 README_id.md 印尼语版、README_cn.md 简体中文版、README_tw.md 繁体中文版等)共同构成了课程本体;_config.yml 中仅有theme: jekyll-theme-hacker一行,说明文档站点采用 Jekyll Hacker 主题渲染;LICENSE 为 GPL-3.0。另据英文原版首页标注,作者因收到过多垃圾信息已将仓库暂时设为只读——这一点也从侧面印证了仓库的"文档共建"属性:社区主要通过提交翻译 PR 参与贡献。
什么是底层编程?
作者将底层编程(Low-Level Programming)界定为:非常接近机器本身的编程,使用 C 或汇编这类较低层级的语言;与之相对的是用户空间应用程序常见的上层编程,使用 Python、Java 等高阶语言。
底层编程与**系统编程(System Programming)**是两个非常接近的概念,但并非完全重合:本文的覆盖范围还包括了系统编程通常不涉及的硬件设计与固件开发。
因此,这份文档覆盖的层次跨度非常大——从最底层的硬件组件一路延伸到 Linux 内核。作者坦言,单页文档永远不可能覆盖所有层次的细节,所以本文的定位是:作为底层编程的起点,帮你建立全局地图,然后自己去填充每一层。
理论基础:计算机体系结构与操作系统
底层编程背后有两大理论支柱,缺一不可:
- 计算机体系结构(Computer Architecture)
- 操作系统(Operating Systems)
学理论:课程优先,理解大局即可
作者认为学习理论最好的方式是跟着课程走,读整本书也并非坏事,但过于耗时耗力。Coursera、edX 等在线大学平台上有很多优质课程,例如 Saylor 的 CS401: Operating Systems。同时作者也给出了务实的预期:理论只是理论,你不需要在课程中拿到 A+,把握整体图景即可,水平会随着经验积累逐步提升。
经典书目清单
以下是作者亲自读过、并普遍被大学用作教材的书目,按主题归类:
| 主题 | 书目 |
|---|---|
| 计算机体系结构 | Computer Architecture, Fifth Edition: A Quantitative Approach |
| 计算机体系结构 | Computer Systems: A Programmer's Perspective(CSAPP) |
| 计算机体系结构 | Computer Organization and Design, Fourth Edition: The Hardware/Software Interface |
| 操作系统 | The Magic Garden Explained: The Internals of UNIX System V Release 4 an Open Systems Design |
| 操作系统 | The Design of the UNIX Operating System |
| 操作系统 | Operating Systems: Internals and Design Principles by William Stallings |
作者特别指出:世界上好书无穷无尽,不必读很多本,精读一本并吃透即可。每当学到一个理论,就用代码去实现它的仿真——文中给出了贯穿全篇的信条:
实现一个东西,比知道一百个理论更好。
通用编程技能:SICP
作为通用编程技艺的训练,作者推荐了《Structure and Interpretation of Computer Programs》(SICP)。它的价值在于教你如何成为一名好的软件程序员——编程不只是理论,更是一种手工艺(craftwork);如果学会了 Lisp/Scheme,学习其他语言的速度会快很多。作者自述已完成约 80% 的习题,并强烈建议每一道练习都值得亲自做一遍。
硬件设计实践:亲手搭一台 8086 套件
在硬件设计方面,作者给出了一个极具分量的建议:亲手构建一台 8086 微处理器套件。其理由是:
- 不亲手搭建硬件电路板,就难以真正理解什么是"物理内存映射设备"(physical memory-mapped device);
- 现代应用处理器(AP)集成了大量 IP,开发者根本没有机会看清 CPU 核心与外设之间是如何连接的;
- 当你自己搭建 8086 套件时,可以把每个外设放到物理内存的指定位置,亲眼观察 BUS、IRQ、Clock、Power 等主要硬件组件如何工作。
作者在大学的这门课被他评价为"最有价值的课程之一",并建议:硬件越老、越简单越好,因为你需要亲手完成的事情更多;在搜索引擎中检索"8086 kit"即可找到售卖硬件原理图、零件与手册的站点。
三大底层语言的学习路径
汇编(Assembly):二选一,不必追新
作者的建议非常明确:在 x86 与 ARM 中选择其一即可,不需要都学。甚至不掌握汇编语言也没有关系——关键是要理解 CPU 和计算机的内部原理。因此完全没必要在新款 CPU 上练习汇编,选择 8086 或 Cortex-M 即可。
围绕汇编学习,文档推荐了以下资源:
- 8086 汇编编程(配合 emu8086):覆盖 CPU 与计算机体系结构的基础概念,以及 C 语言的基础概念,适合入门;
- 64 位汇编编程(翻译进行中):覆盖现代 CPU 与计算机体系结构的基础概念,以及 C 代码反汇编与调试的基础概念;
- 面向 linux-x64 的汇编学习:涵盖纯 64 位汇编编程(NASM)与 GCC 内联汇编;
- ARM Architecture Reference Manual(第 2 版):ARM 编程的完整参考手册;
- 《计算机组成与设计》(Computer Organization and Design):提供 MIPS、ARM、RISC-V 三个版本。这套学术书籍从零开始解释计算机的每个组件如何工作,详细拆解构成计算机体系结构的各个概念;它并不以教会你某种特定汇编语言为目标,MIPS 与 ARM 版本主题相同、只是剖析不同的架构,且两个版本都包含 x86 世界的实例。
C 语言:没有捷径,读完整本书、做完全部练习
C 语言部分作者没有给出任何捷径:"没有捷径,读完整本书并解决所有练习。"
推荐书目与用途如下:
| 资源 | 定位与用途 |
|---|---|
| C Programming: A Modern Approach, 第 2 版 | 经典系统化教材 |
| The C Programming Language, 第 2 版(K&R) | 经典入门书,须尽力完成每一个练习 |
| Modern C(Jens Gustedt, Manning, 2019) | 面向 C 新标准的阅读材料 |
| Is Parallel Programming Hard, And, If So, What Can You Do About It?(perfbook) | 用 C 实现同步的原生代码,是大型 C 编程(尤其是内核编程)的必备读物 |
| C Project Based Tutorials? | 读完一两本 C 书后必须动手做东西 |
| C and other languages based projects(build-your-own-x 系列) | 发现更多基于 C 及其他语言的项目灵感 |
| Michael Abrash's Graphics Programming Black Book, Special Edition | 用 C 和少量 x86 汇编做优化的参考书,从 8088 一路讲到当代,专注低层图形优化 |
| Framework and plugin design in C | 讲解如何在大型软件中用 C 开发框架与插件,并给出阅读 Linux 内核源码所需的基础编程技巧 |
作者在 C 项目实践上给出了一个非常重要的工作方法:先自己写出代码,再去和别人的源码对比——只有当你能读到他人源码并学到更优方法时,技能才会提升。他总结为一句犀利的话:"书是死的,源码是活的(Books are dead and source is live)"。
如果想成为 C 编程专家,作者建议去 LeetCode 刷题练习,并送上祝福。
Rust:作者眼中系统编程的下一个语言
作者在文档中明确表达了自己的判断:"我确信,系统编程的下一个语言将是 Rust",并引用了 Linus Torvalds 关于 Rust 将进入 Linux 6.1 的公开表态。
Rust 的学习资源清单如下:
- The Rust Programming Language(The Book):很好的入门读物,但缺少示例与练习;
- Rust by Example:在读 The Book 的同时可以参考示例;不过可自行练习的习题不多,仅有的"照做式"练习也很简单;
- Programming Rust(第 2 版):更深入的入门书,但同样缺少示例与练习;
- Exercism 的 Rust 练习轨道:训练 Rust 各项特性的优秀练习题;提交解答后可借助 "Community solutions" 标签页对比他人的解法(自 Exercism V3 起提供);大量简单级别的练习针对 map / filter / any 等函数式特性;
- Easy Rust:用浅显易懂的英文写成的书籍,并配有 YouTube 视频材料;
- Let's Get Rusty:作者最欣赏的 Rust 视频课程,持续更新 Rust 最新动态;
- Rust for Linux:查看示例源码,了解 Rust 是如何进入 Linux 内核的。
此外,英文原版 README.md 中作者还收录了自己在撰的Linux Device Drivers in Rust项目(进行中),尝试用 Rust 语言重写《Linux Device Drivers》一书中的示例——这条线索清晰地表明:作者押注 Rust 的核心原因,正是它能成为开发 Linux 设备驱动的新语言。
应用方向:从硬件到内核,再到存储与安全
硬件与固件(Hardware & Firmware)
如果想成为嵌入式系统工程师,作者的建议是从一个简单的硬件套件开始,而不是从最新的 ARM 芯片组起步:
- Arduino 入门套件(Arduino Start Kit):Arduino 系列繁多,但入门套件搭载的 ATmega328P(8 位内核)处理器与配套指导书最为简单,是数字电路设计与固件开发的良好起点。你不需要会画原理图、做布局、焊接芯片,但必须会读原理图、理解芯片之间的连接关系——固件开发者应当具备读懂原理图、并搞清如何向目标设备发送数据的能力,然后跟着指导书一步步做。
- 8086 手册:如果你是 x86 架构新手,8086 系列手册同样是学习处理器架构与 80x86 汇编的绝佳指南。
- 80386 手册:学习 80x86 处理器保护模式与分页机制的最佳资料。
完成上述基础之后,就可以开始接触最新的 ARM 与 x86 处理器了,比如 Raspberry Pi、BeagleBoard、Intel Edison 等平台。以树莓派为例,其 Cortex-A53 处理器支持 64 位指令集,可以让你切身体验现代处理器架构。
不过作者提出了一个非常现实的警告:"是的,你可以买一块板子……但买来做什么呢?"如果没有明确的目标项目,板子大概率会被扔进抽屉,和其他买过的小 gadget 一起被遗忘。
为此,作者推荐了一个方向性项目:制作自己的内核(参考 OSDev 的 Getting Started 以及 r/osdev 社区),以及一个具体的渐进式教材——基于 Linux 内核与树莓派学习操作系统开发(raspberry-pi-os)。后者每节课都先讲解某个内核特性在树莓派 OS 中如何实现,再演示同样的功能在 Linux 内核中如何工作。
作者本人也公开了自己制作的 toy kernel(caos),它支持 64 位长模式(long mode)、分页(paging)与非常简单的上下文切换(context switching)。作者认为,做一个小内核是理解现代计算机体系结构与硬件控制的绝佳途径。
更重要的是,作者强调了一个"零成本"的事实:你其实已经拥有最新款的处理器与硬件——就是你的笔记本电脑和台式机。什么都不用买,qemu 模拟器就能模拟最新的 ARM 处理器与 Intel 处理器。只需安装 qemu,写一个能启动、能开启分页、能打印若干消息的小内核即可。其他可参考的 toy kernel 还有 littleosbook 与 os01。
Linux 内核与设备驱动(Linux Kernel and Device Driver)
作者的观点很鲜明:你不需要亲手实现一个完整的操作系统,加入 Linux 社区、参与开发即可。文档按"从入门到进阶"组织了内核与驱动开发的资源。
书籍:按顺序阅读
- The Design of the UNIX Operating System:Unix 的基本概念适用于所有操作系统,是理解操作系统核心概念的绝佳起点;
- Linux Device Drivers(LDD):要求亲手做完全部示例;
- Linux Kernel Development:目标是理解 Linux 内核的设计;
- Understanding the Linux Kernel:边读这本书边对照 v2.6 内核源码。作者特别叮嘱:不要一开始就用最新版本,v2.6 就足够了!同时给出两条配套实战路径:
- 用 qemu 和 gdb 逐行运行内核源码,观察执行过程;
- 用 busybox 制作一个只需约 1 秒即可启动的最简文件系统,降低调试摩擦。
免费资源
- Linux device driver labs:非常实用的指南与练习,几乎覆盖了所有关键的内核 API;
- The Eudyptula Challenge:一份"像私人导师一样"的挑战任务。遗憾的是该挑战目前已不再接收新的挑战者(维护者正在规划新形式),但作者建议:可以自行搜索网上他人公布过的题目,独立尝试解答后再与他人解法对比;
- 基于 Linux 内核与树莓派学习操作系统开发(raspberry-pi-os):项目尚未完成,但作者始终认为"做一个与 Linux 内核相似的内核,是理解 Linux 内核的最佳方式";
- 块层与设备驱动(book_linuxkernel_blockdrv):从一个简单的多队列模式块设备驱动示例(Ramdisk)开始,一路深入块层(block layer);英文翻译已完成;
- Linux 内核 md 驱动:讲解 mdadm 工具如何工作、如何调用 md 驱动,以及 md 驱动内部的工作原理;
- 带大量注释的 Linux 内核源码:对应古老的 Linux v0.12,注释极为详尽。作者建议从古老、简单的 OS 入手;同类参考还有带源码的《Lions' Commentary on UNIX 6th Edition》。
参考索引
当你需要查阅具体问题时,文档还推荐了两个按需检索的入口:Free-electrons 的幻灯片资料(尤其适合 ARM-Linux 主题),以及 Julia Evans 的经典文章"You can be a kernel hacker!"(内核编程入门指引)。
其他应用方向
并非所有人都会对 Linux 或固件感兴趣,底层编程还有更多应用场景:
- Windows 系统编程与设备驱动
- 安全(Security)
- 逆向工程(Reverse engineering)
作者坦言自己对上述方向没有深入的知识,并欢迎社区提供面向初学者的信息。
此外作者特意强调:内核与驱动并不是底层编程的全部。另一个重要的底层应用方向是软件定义存储(software-defined storage)或分布式文件系统。其详细描述超出了本文范围,但文档提供了一个动手入口:MIT 6.824 课程,以及配套的 yfs 简单分布式文件系统参考实现,可以动手尝试实现一个简单的分布式文件系统。
底层编程的未来趋势
作者开诚布公地表示"我不知道未来",但他保持着对 Rust 的高度关注,并勾勒了几条值得观察的技术脉络:
- Rust 进入系统编程:作者认为 Rust 是"当前可以用于开发 Linux 设备驱动的最新语言",并提及了基于 Rust 编写 Linux 驱动的实验性项目(rust.ko);
- IoT 实时操作系统:IoT 是新兴趋势,值得调研其使用的 OS。ARM、Samsung 等厂商都有自己的实时 OS,但大多闭源;而 Linux 基金会提供了开源方案Zephyr;
- Unikernel / library OS:典型云服务器拥有多层软件栈——宿主机 OS、KVM 驱动、qemu 进程、客户机 OS、应用服务。容器已经提供轻量虚拟化,而在作者看来,不久的将来一种被称为 library OS 或 Unikernel 的新型 OS 概念可能取代传统的虚拟化软件栈;
- 软件定义存储与分布式存储集群:大数据与云计算对存储容量的需求持续膨胀,直连服务器的磁盘在容量、稳定性和性能上逐渐力不从心,业界正在研究由高速网络连接大量存储机器构成的巨型存储系统——过去聚焦于构建单一超大存储卷,如今则面向众多虚拟机提供专用卷。这一趋势对应的底层概念包括软件定义存储、集群文件系统,以及 Ceph 一类的分布式存储软件。
如何开始?——作者的循序渐进行动清单
由于收到很多"如何开始"的邮件,作者在文档中给出了自己当年走过的顺序化路径,并强调:这只是"不知道怎么办"时的参考示例,做过一步就跳过一步,并不存在通往王座的捷径。完整路线如下:
- 读操作系统理论书:至少读完《The Design of the UNIX Operating System》(Maurice J. Bach 著);
- 学习汇编与 C:
- 用 8086 汇编(配合 emu8086)理解汇编编程的概念即可,不需要做太多实操;
- 读《The C Programming Language》第 2 版,尽全力完成每一个练习;
- 配合《C Programming: A Modern Approach》第 2 版;
- 用 C 做实际项目:
- 从 C 项目实践类教程中挑一两个感兴趣的项目,做出自己的作品;
- 如果找不到感兴趣的项目,退而求其次专注数据结构与算法(例如 LeetCode);
- 做一个硬件项目:
- 树莓派或 Arduino 都可以,关键是获得只用 C(仅 C!)直接控制硬件的经验;
- 作者建议购买一块 ATmega128 套件,写固件实现:开关 LED、检测按键输入、在文本 LCD 上显示消息;电机控制(例如 line tracer 循迹小车)也是非常好的项目;
- 不要使用任何库——除了程序下载器之外,一切都要自己实现;
- 打好 Linux 内核基础:
- 底层编程与操作系统关系极其密切,必须了解 OS 内部;
- 从驱动入手:读《Linux Device Drivers》,完成 Linux device driver labs,尝试 The Eudyptula Challenge;
- 再读《Linux Kernel Development》理解内核内部机制;
- 进入专业领域:
- 成为 Linux 内核开发者的路径:
- 必须读《Understanding the Linux Kernel》;
- 然后动手做一个 toy kernel(参考 raspberry-pi-os 与 OSDev 的 Getting Started),并把内核的 GitHub 链接写进简历——别忘了在 commit message 中写详细描述;
- 关注 LWN 的最新议题并参与:查看 "Recent kernel patches",找出自己感兴趣的补丁,努力读懂源码——这当然很难,但每次尝试都会让你离目标更近一步;
- 在自己的系统上构建并测试内核:例如用 LTP 做性能测试与稳定性测试,或使用内核自带的静态代码分析工具;
- 发现任何问题(编译警告/错误、性能下降、kernel panic/oops 等)就上报;
- 如果工作正常,附上你的系统规格说明上报,补丁作者会在补丁中写下带有你名字的 "Reviewed-by" 标签——最终你可以在内核的 git log 里找到自己的名字;
- 或者选择其他主题:底层工程师的舞台远不止内核,还包括安全、编译器、固件、机器人/汽车等方向。
- 成为 Linux 内核开发者的路径:
文档生态与作者背景
多语言翻译生态
这份路线图被社区翻译成了多种语言,仓库根目录中即存放着各语言版本,读者可对照阅读:
- 英文原版:README.md
- 简体中文:README_cn.md
- 繁体中文:README_tw.md
- 印尼语:README_id.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
作者欢迎通过 Pull Request 方式为页面添加新的翻译。值得一提的是,不同语言版本的内容完整度存在差异:以 README_id.md 为代表的较新版本包含了 Rust 语言章节与完整的"How to start"行动清单,而部分早期翻译版本(如 README_cn.md)则只覆盖到汇编与 C 语言部分——建议读者优先参考内容更完整的版本,或交叉对照英文原版阅读。
作者背景
作者自述拥有超过 10 年的底层编程经验,覆盖了从汇编、固件、系统编程到内核开发的完整链路:
- 80x86 汇编编程
- 基于 Atmel 芯片的硬件设备与固件开发
- Unix 下的 C 语言系统编程
- Linux 设备驱动开发
- Linux 内核:页分配(page allocation)
- Linux 内核:块设备驱动与 md 模块
这套经验背景恰好呼应了路线图的整体结构——从汇编到 C、从硬件固件到内核驱动,作者把自己的真实成长轨迹提炼成了一份可复制的学习路径。对于任何希望进入底层编程领域的读者,这份文档的价值不在于收藏了多少链接,而在于它用极简的原则(精读一本书、实现一个东西、只用自己的代码驱动硬件)指明了正确的前进方向。
- 教程
【免费下载链接】lowlevelprogramming-university
How to be low-level programmer
相关推荐
Low-Level Programming University:通往底层程序员与 Linux 内核工程师的完整学习路线图
Low Level Programming University:通往底层程序员与 Linux 内核工程师的完整学习路线图 本文以开源仓库 lowlevelpr
教程底层程序员学习路线图:Low-Level Programming University 从硬件到 Linux 内核的自学指南
底层程序员学习路线图:Low Level Programming University 从硬件到 Linux 内核的自学指南 本指南以仓库中文版路线图 READ
教程Low-Level Programming University 底层程序员自学路线图:从汇编与 C 到 Linux 内核的系统成长指南
Low Level Programming University 底层程序员自学路线图:从汇编与 C 到 Linux 内核的系统成长指南 本指南围绕开源仓库 l
教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考