从事系统软件与 Linux 内核开发已有二十余年,与 Linux 的缘分断断续续。期间先后就职于国内外多家知名企业,做过交换芯片等器件的驱动,开发过网络协议栈,也在无数个日夜中为客户解决过各类 Linux 问题。回首这些岁月,令我受益颇深的,既有实践中的锻炼,也有那一本本读过的技术书籍。本文梳理了这一路上对我有影响的书单,按学习阶段排列,并附上个人的阅读体会与建议。希望能为正在这条路上跋涉的朋友,提供一份可参考的入门地图与进阶导航。
夯实地基C 语言
Linux 内核 99% 以上的代码由 C 语言写成,少量涉及汇编。因此,扎实的 C 语言功底是进入内核领域的先决条件,没有捷径可走。

|
说到 C 语言入门,绕不开谭浩强老师的《C 程序设计》。这本书或许没有其他 C 语言书籍那般声名显赫,但个人认为,它是最易上手的一本入门读物。高校期间,我主要用它配合数据结构等理论课夯实基础。不过,真正将 C 语言融会贯通,还需要在实际项目中不断历练、打磨。 |

|
有了初步的 C 语言实践基础后,在实践中难免遇到各种 bug 与缺陷,对语言特性的理解也未必透彻。于是,深入研究 C 语言的进阶知识便提上了日程。而指针,正是 C 语言的精髓与关键所在。《C 和指针》对指针进行了深入的探讨,讲解了多种指针用法,包括指针的指针、指向数组的指针和指针的数组的区别等,并通过文字和图示帮助读者理解指针和数组,特别是多维数组等知识点。这些都是 C 语言中理解和使用上的难点,也是容易出问题的地方。 |

|
《C 和指针》也是个大块头,直接读起来会觉得有些厚重,可以考虑读《C 陷阱与缺陷》,我把它称为轻量版《C 和指针》。这本书分别从词法分析、语法语义、链接、库函数、预处理器、移植性缺陷等几个方面分析了 C 编程中可能遇到的问题,可以大大提高我们的 C 代码的质量和规范性。 |

|
读完《C 和指针》之后,C 语言基础在普通程序员层面已然相当扎实。若对技术深度和代码效率有更高追求,不妨进一步钻研编译、链接等底层知识,这便来到了《C 专家编程》的领地。这本书启发我们对 C 语言进行更多、更深入的思考和探索。可以把它作为参考书,在项目中一边实践一边看书、思考。 |
走进Linux内核

|
有了 C 语言基础之后(不必读完所有 C 语言书籍,只要具备一定的编程能力与实践经验,便可开始阅读《深入理解Linux 内核》这本经典著作),个人于 2006 年初读此书。前半部分关于 x86 体系结构的内容(内存寻址、保护模式、页表)相当密集,需要一定的体系结构基础才能顺畅阅读;尽管本人是计算机科班出身,但回想当年初读这一部分时,依然感到晦涩难啃。幸好后来遇到了《Linux 内核完全剖析》,此书前几章详细地讲解了这部分知识,有效弥补了这块短板。至于后半部分,除内存管理章节之外,其余各章均为独立的子系统模块,可结合自己专注的细分领域选择性学习。(附:其实这也是在后来的学习和实践中知道的,只要发信给Intel技术支持,Intel就会寄来全套的x86体系结构手册。) |

|
值得一提的是,偏好先动手实践后理论的朋友,不妨考虑将《Linux 设备驱动》与项目实践相结合,边读边练,这样能更快建立起对 Linux 内核、尤其是驱动层的直观认识。 |

|
《Linux 内核完全剖析》从内核组成结构出发,对内核编程中涉及的汇编语言与 x86 体系结构进行了通俗易懂的诠释。如果读者对 Linux 启动代码及相关汇编代码感兴趣,这本书是极佳的参考书;对于从事嵌入式开发、涉及Bootloader 等底层内容的工程师而言,也有着不可忽视的借鉴价值。 |

|
在反复研读《深入理解 Linux 内核》和内核代码的过程中,始终有一种感觉:每个章节读来似乎都能理解,却总觉得少了些什么,宛如盲人摸象。直到有幸结识《深入 Linux 内核架构》一书,2008 年初读时,尚为英文原版,但读来如他乡遇知音。它以更宏观的视角俯瞰整个内核,将进程、内存、文件系统、网络等子系统纳入一个统一的框架加以诠释。读完此书,内核的全景图在脑海中第一次真正清晰起来。若说《深入理解 Linux 内核》是"拆解引擎零件",那《深入 Linux 内核架构》则是"展示整台发动机如何运转"。两本书互为补充。 |
不可绕过的底层:汇编与体系结构

|
在阅读Linux代码与内核图书的过程中,大量汇编代码与相关概念是绕不开的门槛。很多汇编语言的图书写的都和实际使用的x86有一定的差异,即使是科班出身的人读起来依然不是很舒服。而这本汇编语言专著,条理清晰,由浅入深,通俗易懂,可作为学习与查阅汇编知识的理想参考书。 |
调试是必修课

|
只要写 Linux 代码,就免不了与各种 Bug 和问题打交道。这本关于 Linux 调试的书,涵盖了用户程序的 GDB 调试方法,以及内核各类 Crash 的排查手段,是日常开发中相当实用的工具书。是入门和掌握调试技术一本不错的图书。 |
深入细分领域网络

|
有了上述基础之后,若对某一领域有浓厚兴趣或专长,便可进一步深耕。以网络方向为例,推荐按以下顺序阅读相关图书,同时在项目中实践。个人对 Linux 内核网络了解最深。当时我们有一个项目,需要将 Linux 适配到网络交换机/路由器。Linux 的网络设备模型主要面向服务器和 PC 网卡,对交换机等设备的支持并不直接。于是,我们对 Linux 内核网络中的 device、bridge、vlan、routing、arp(neighbour)等数据结构及诸多控制平面的代码做了大量修改。Linux 的数据转发平面因存在 Qdisc 等复杂的包处理和过滤流程,远远达不到网络产品要求的线速性能。因此,我们参考交换芯片的转发流程,在 Linux 旁路实现了一个快速转发模块——这或许是DPDK、XDP 等快速包转发的最早雏形吧。《深入理解 Linux 网络技术内幕》是我在修改完内核网络代码之后读的,想更全面、深入地理解这些模块,同时审视自己写过、改过的代码是否合理。这本书是 Linux 内核网络模块广受好评的经典之作,从内核设备系统到 二层、三层,有着系统而全面的概述,在代码与原理层面阐释深刻。读过之后,确实对 Linux 内核网络及相关功能模块有了更深的认识。 |

|
如果认为《深入理解 Linux 网络技术内幕》细节过多、内容厚重,不妨搭配《精通 Linux 内核网络》一起阅读。这本书对 Linux 内核网络代码架构的梳理比较出色,当时读它主要是因为工作涉及一些 InfiniBand 和 RDMA,拿来做个参考。它应该也是国内较早初步总结Linux内核下 InfiniBand 和RDMA 相关知识的图书。 |

|
《Linux TCP/IP 架构与代码分析》将代码流程与代码解析做了恰到好处的融合。本书在梳理子模块架构的基础上逐步深入讲解 TCP/IP 代码实现,从宏观架构到具体细节,为 Linux TCP/IP 代码学习提供了极具价值的参考路径。 |

|
如果在学习 Linux TCP/IP 代码时遇到协议层面的困难,可以参考读一下《TCP/IP 协议族》。个人认为这本书相比经典的《TCP/IP 详解》更通俗、详细,也更易于理解。 |

如果读了 TCP/IP 相关的书,对网络还是有一种模糊的距离感,不妨读一读《数据与通信网络》。这本书从物理层、链路层到网络层、传输层,帮助读者建立俯瞰网络全景的视角。 |
嵌入式编程

|
学习 Linux 终究要落到具体场景。刚参加工作时,机缘巧合进入嵌入式领域,从视频终端、3G 手机,到网络交换机、路由器,工作中频繁接触 PCI、Flash、SoC、SRAM、DRAM、BSP、CPLD、I²C、SPI 等硬件。涉及具体硬件时,通常只能先啃硬件设计文档,再零星地向硬件同事请教,对嵌入式系统始终缺乏系统性的理解。直到后来读到《Programming Embedded Systems in C and C++》,这些知识才让我对工作中的嵌入式软硬件有了更深的理解。当然,嵌入式软硬件不是一本书就能完全掌握的,还需要在理论与实践中不断迭代。当时也读了不少嵌入式方面的电子书,可惜前几年因一次意外,大多都丢失了,这是印象最深的一本。此外,这本书在学习 C 语言阶段也值得一读。 |
以上便是我过去Linux内核与嵌入式开发历程中的书单与心得。书单本身并不神圣,适合自己的风格和节奏、能落地到实际项目的阅读方式,才是最好的方式。技术在变,内核在迭代,但个人认为底层的原理与思维方式是相对稳固的。希望这份书单,能为正在这条路上跋涉的你,少走一些弯路,提供一盏指路的灯。欢迎留言交流读书心得,也期待前辈来聊。