十本 Linux 核心開發書籍介紹

简介: 我相信絕大部分 Linux 開發者都會告訴你,Driver 的開發比 Linux Application 容易許多,即便寫驅動程式聽起來莫名偉大,其實也不過是一段 C/assembly 的組合程式碼。

我相信絕大部分 Linux 開發者都會告訴你,Driver 的開發比 Linux Application 容易許多,即便寫驅動程式聽起來莫名偉大,其實也不過是一段 C/assembly 的組合程式碼。有別於桌面應用程式,Linux kernel API 較少因爲不同的新軟硬體規格,而進行大幅度 API 更動 (參數的簡化倒是十分常見),且由傑出的軟體開發者撰寫的核心架構,穩定性已經十分可靠。

相較與 userland 高度複雜的設定機制,Linux Kernel 暴露的界面十分簡單,在硬體穩定的前提之下,你也難得碰到 API 反應與預期不符合的處境。一般開發者對於核心驅動程式上手的時間,應該不會比開發桌面軟體來的更久。花費時間較多應該是研讀硬體手冊,以及不嚴謹的開發習慣造成臭蟲而所需的除錯時間。

對於深具經驗的開發者,在學習開發 Linux kernel driver 時,最快的方法莫過於直接解開 Kernel tarball, 切進欲開發的 subsystem 目錄,拿出 global, vim, LXR 直接把現成程式碼當作範例學習,很快就可以理解程式結構。不過,偶爾還是需要參考書來驗證對於架構得理解是否正確,另外接觸新的 subsystem 時先閱讀入門文章也可以減少無謂的撞牆期。

所幸,幾位 Linux kernel hacker 也是傑出的文件作者。在 Linux kernel sourc tree 中已有一些各子系統的架構、操作參考文件,涵蓋了基本的 coding style、設計哲學等。另外,像是 Robert Love, Greg Kroah-Hartman (PCI, USB maintainer) 等開發者也出版了完整的書籍,很值得參考。

不過市面上針對 Linux kernel 開發的書籍也不少,那一本是適合你的呢?這類的技術書籍,通常設定不同的讀者羣來設定內容,有的偏重知識,有的偏重操作實務。且出版版次也會影響所介紹的 API 差異,造成無法編譯其範例,但並非舊書,所談之理論就不正確。

以下分享不才對於市面上 2005 年之後出版的核心開發書籍的評論,希望對於想擴充團隊圖書館的朋友提供些參考。

Linux Kernel in a Nutshell 是 2006 年年底發行,作者是 GregKH,使用核心為 2.6.18,部分操作方式或指令已經略有更改。GregKH 基於讓更多新手參與開發行列,針對的讀者是從未編譯過 Linux kernel,想瞭解下載、設定、編譯需求等等細節,適合剛從其他平臺進入 Linux 核心開發的朋友,可以較快熟悉核心編譯的操作程序。書內主要介紹通用性知識,因此未提各 distro 間安裝 kernel 的細節 (如 initrd 建制方式)。

LKN 已採 CC BY-SA 2.5 授權。電子書可於 GregKH 的網頁下載

Understanding the Linux Kernel, Third Edition 這本由兩位博士 Daniel P. Bovet 與 Marco Cesati 所撰寫,從 2000 年底出版之後,到 2005 已經是第三版,介紹的核心是 2.6.11。有中譯版

此書結構以流水帳方式帶過各個子系統,但稍嫌膚淺的僅僅介紹表面的細節,未能給予概觀性的理論說明,也未能直指程式核心。篇幅常用於註記資料結構或函式用途,適合想尋著麵包屑理解 Linux kernel 運作的探險家使用。

Professional Linux Kernel Architecture 在2008 年出版,作者是 Wolfgang Mauerer,作者的背景是量子物理學家。在沒有社群內知名開發者的背書與協助下,他完成了一本巨大的書籍,篇幅高達 1368 頁。

有別於 UTLK,也許是為了非科班出生的讀者,作者試著詳盡的敘述作業系統的基本概念,另外一方面也以程式碼告訴讀者 Linux 的運作模式。

如果你讀不下純粹理論導向的作業系統教科書,而想透過 Linux理解一個作業系統的設計原理,這是適合你的書。本書基於 Linux kernel 2.6.24.

身為知名的 kernal hacker, Robert Love Linux Kernel Development (3rd Edition) 一書中為讀者拆解 Linux kernel source tree, 直接從設計理念切入,酌以程式碼輔助,讀者需要有作業系統理論素養以及 Linux 開發經驗,才能消化理解筆者的解剖。最新第三版發表於 2010 年初版,更新到 2.6.34.

簡體中譯版 Linux 内核设计与实现 翻譯自 Linux Kernel Development 第二版。正體中文版有維科圖書有限公司出版沈中庸, 沈彥男翻譯的 Linux 核心開發指南, 2/e

Linux Network Internals 的作者是 Christian Benvenuti,發表於 2005 年。少數專談 Linux Network stacks 的書籍,作者循序的從設定工具、核心啟動開始,逐一介紹 封包傳送接受、Bridging、IPv4、Neighboring Subsystem 與 Routing。本書基於 2.6.12.

書中涵蓋了 Layer 2, Layer 3 等協定, 可惜遺漏了 IPv6, IGMP, PIM, Traffic Control, Netfilter, Virtual devices (802.1Q, bonding, IPIP, GRE) 等等重要原件。讀者需要基本開發能力與網路協定常識。此書有中譯版

The Linux TCP/IP Stack: Networking for Embedded Systems 第一版發表與 2004 年,最新第二版 2006 年,針對的版本是 2.6.16,作者是 Thomas F. Herbert。此書對於讀者的定位不明。雖然意圖以一個章節討論嵌入式系統中的 TCP/IP Stack,但除了說明一般嵌入式系統需求外,缺乏實際有用資訊。

書籍想涵蓋各種 TCP/IP Stack 所涵蓋的項目,但章節設計雜亂,從基本的 Network Stack 開始介紹,對於 API 部分又缺乏系統性描述。既無法瞭解網路協定,或撰寫網路程式或作業系統核心架構。

書中時常夾雜敘述與程式碼,令讀者難以連貫消化,讀者需要開啟原始程式碼才能領會作者的。這是一本關於網路協定的原始碼註記,適合已具核心開發經驗的開發者參考使用,考量其版本日期,書籍的功能可能比自行追蹤程式碼的效用還差。另外,若你想瞭解嵌入式系統,這也不是你該買的書。

Linux Device Drivers, 3rd Edition 的作者是 Jonathan Corbet (LWN創辦人)、Alessandro RubiniGreg Kroah-Hartman。即便 LDD3 已經出版許久,還是所有想寫 Linux kernel driver 的第一優先入門參考書阿。此書有中譯版

LDD3 務實的從實做範例開始,帶領讀者理解各種 subsystem,含括了入門操作與基本觀念,對於初次開發 lkm 的開發者提供了燈塔般的指引。

LDD3 授權採 CC BY-SA 2.0,線上版可於此下載 http://lwn.net/Kernel/LDD3/。但由於書籍年代較久,針對的核心版本為 2.6.10,書中範例需要一點調整才能正常運作。已有同好改了幾份擺在  github (jesstess, martinezjavier).

Essential Linux Device Drivers 的作者是長期在 IBM 工作的 Sreekrishnan Venkateswaran,參與 Linux Watch, PDA, Nurse Call Systems, Merlin Patient Care System 等等開發專案。有正體中譯版 Linux驅動程式開發實戰 以及簡體中譯版 精通Linux驅動程序開發

這本書是作者的實務工程筆記,出版於 2008 年,針對核心為 2.6.23/2.6.24,透過此書新手可以從中漫遊一個深具經驗的開發者,如何從原始碼迷霧之中理解 Linux device  driver,老手或可從雜亂的描述中再次驗證自己的理解。

雖然篇幅高達 744 頁,卻被引用程式碼佔了許多頁面。這本書不足以提供開發者撰寫驅動程式的基本觀念,也無法協助理解作業系統概觀。

作者另有一小冊 Debugging Linux Systems 電子書短短九十頁,帶過幾個常見的核心除錯工具與技巧,很有實務參考價值。

《The Linux(R) Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures》 出版於 2005 年,作者是 Claudia Salzberg Rodriguez, Gordon Fischer, Steven Smolski。有中文版,但評價頗差

書名讓人非常期待總算有一本核心介紹書籍 x86 外的硬體平臺,畢竟 RISC vs CISC 架構的不同, endianness, alignment, calling convention 等,應當有許多寫核心驅動程式應該注意得事項。但是整本書只在 2.2 節稍微說一下寫 Assembly 時,PowerPC, x86 的指令差異,剩下的細節根本沒提!

整本書還是著重在一般核心的結構介紹。

而書中除了少量的插圖之外,根本沒有沒有多少邏輯上的說明跟描述。通篇拆解程式碼,對資料結構作註解。這些資訊任何有點基礎的工程師都可自行閱讀程式碼及程式碼註解。新入門工程師還可能因爲書中解釋而疑惑。

除非你想寫沒有價值的書評,否則不建議購買。

Linux(R) Debugging and Performance Tuning: Tips and Techniques 出版於 2005, 作者是 Steve Best。此書少見的從除了應用程式之外,還從核心切入的除錯、效能測試書籍,因爲這方面的技術資訊總是一下就超過保鮮期。

作者試著含括基本的 Profiling 實務開始,介紹 gdb, 應用程式記憶體管理,再講核心的各種資訊界面。很可惜,以一本專講除錯與效能測試的書來說,範例與介紹過於粗淺,以第十二章 Dynamic Probes 為例,其介紹深度可能還比不上 Documents/kprobes.txt 中的概念介紹與 IBM developerWorks 的範例介紹

適合剛切換到 Linux 的開發者,可概略學得各種基本開發工具者的入門資訊。

2011-03-17 18:00 更新

增列相關中譯版本連接,感謝 ansoncat 告知資訊。

2011-05-15 18:00 更新

修正 UTLK 版本為 2.6.11, 補充 ULNI 版本為 2.6.12. 感謝讀者 Wayling 指出錯誤。

目录
相关文章
|
4月前
|
存储 网络协议 Ubuntu
【Linux开发实战指南】基于UDP协议的即时聊天室:快速构建登陆、聊天与退出功能
UDP 是一种无连接的、不可靠的传输层协议,位于IP协议之上。它提供了最基本的数据传输服务,不保证数据包的顺序、可靠到达或无重复。与TCP(传输控制协议)相比,UDP具有较低的传输延迟,因为省去了建立连接和确认接收等过程,适用于对实时性要求较高、但能容忍一定数据丢失的场景,如在线视频、语音通话、DNS查询等。 链表 链表是一种动态数据结构,用于存储一系列元素(节点),每个节点包含数据字段和指向下一个节点的引用(指针)。链表分为单向链表、双向链表和循环链表等类型。与数组相比,链表在插入和删除操作上更为高效,因为它不需要移动元素,只需修改节点间的指针即可。但访问链表中的元素不如数组直接,通常需要从
272 2
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
90 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
3月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
44 6
|
3月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
50 5
|
3月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
114 3
|
4月前
|
Web App开发 缓存 Linux
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
《FFmpeg开发实战》书中第10章提及轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适合生产环境。推荐使用SRS或ZLMediaKit,其中SRS是国产开源实时视频服务器,支持多种流媒体协议。本文简述在华为欧拉系统上编译安装SRS和FFmpeg的步骤,包括安装依赖、下载源码、配置、编译以及启动SRS服务。此外,还展示了如何通过FFmpeg进行RTMP推流,并使用VLC播放器测试拉流。更多FFmpeg开发内容可参考相关书籍。
111 2
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
|
4月前
|
Linux
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
《FFmpeg开发实战》书中介绍了直播的RTSP和RTMP协议,以及新协议SRT和RIST。SRT是安全可靠传输协议,RIST是可靠的互联网流传输协议,两者于2017年发布。腾讯视频云采用SRT改善推流卡顿。以下是Linux环境下为FFmpeg集成libsrt和librist的步骤:下载安装源码,配置、编译和安装。要启用这些库,需重新配置FFmpeg,添加相关选项,然后编译和安装。成功后,通过`ffmpeg -version`检查版本信息以确认启用SRT和RIST支持。详细过程可参考书中相应章节。
101 1
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
|
4月前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。
|
5月前
|
编解码 Linux
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
XviD是开源的MPEG-4视频编解码器,曾与DivX一起用于早期MP4视频编码,但现在已被H.264取代。要集成XviD到Linux上的FFmpeg,首先下载源码,解压后配置并编译安装libxvid。接着,在FFmpeg源码目录中,重新配置FFmpeg以启用libxvid,然后编译并安装。成功后,通过`ffmpeg -version`检查是否启用libxvid。详细步骤包括下载、解压libxvid,使用`configure`和`make`命令安装,以及更新FFmpeg配置并安装。
88 2
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
下一篇
无影云桌面