長久以來,對於任何想要在 Linux 作業系統下支援電腦週邊、想要在 Linux 下跑新式硬體、或只是有興趣探討 Linux 核心程式設計觀念的工程師,《Linux 驅動程式》已成為必讀的經典之作。關於如何設計各式各樣驅動程式的知識,原本深藏於原始程式註解的字裡行間,或是只能靠口語相傳,而《Linux 驅動程式》給你有條理的解釋與示範。
本書的作者群都是 Linux 開發圈子裡的領導者。Jonathan Corbet 是廣受好評的 LWN.net 新聞資訊網站的執行編輯,他偶爾也貢獻程式碼給 Linux 核心。 Alessandro Rubini 也貢獻程式給 Linux 核心,他更是熱情的義大利 Linux 社群的精神領袖。Greg Kroah-Hartman 目前是 Linux 2.6 核心中的 USB、PCI 與 Driver core 等子系統的維護者。
驅動程式必須依照核心提供的軟體介面來設計,核心改版,驅動程式也必須跟著改變。相較於 2.4 版核心,Linux 2.6 有著相當大幅度的改變,以往許多一般性的工作,像是 PnP、sysfs 檔案系統與 user-space 之間的互動、以及多種標準匯流排上的裝置管理,現在都已被合理化與簡化。本書這次改版,主要是以 Linux 2.6.10 版核心為準,而這幾乎等於重新改寫了整本書。
要享受本書帶來的饗宴,你不必先成為 Linux 核心的專家,只要你會 C 語言,而且對 UNIX 系統呼叫有些基本概念,就可藉由本書的引導,為你的硬體裝置寫出驅動程式。你將學到如何設計多種類型的驅動程式,包括字元裝置、區塊裝置、以及網路介面;本書提供了完整功能的範例,你不必準備特殊硬體就是編譯並測試範例程式,並將它們當成你的驅動程式的基本骨幹。此外,本書另闢專章探討 PCI、 USB 與 tty 子系統,同時也提供了關於作業系統觀念的知識,包括位址空間、 I/O、非同步事件。
內容重點:
* 完整的字元、區塊、網路介面驅動程式
* 除錯技術
* 時序
* SMP 系統的因應之道(共時性與各種鎖定機制)
* 記憶體管理與 DMA
* 中斷
* Linux 裝置模型與 sysfs
* 熱插拔裝置
* 常見匯流排的特殊需求,包括 SCSI、PCI、USB、IEEE1394
目錄
序
導讀
第 1 章 裝置驅動程式概論
1.1 驅動程式的角色
1.2 核心概論
1.3 裝置與模組的分類
1.4 安全顧慮
1.5 版本編號
1.6 授權約定
1.7 參與核心開發團隊
1.8 本書架構
第 2 章 模組
2.1 設定你的測試系統
2.2 Hello World 模組
2.3 核心模組 vs 應用程式
2.4 模組的編譯與裝載
2.5 核心符號表
2.6 前置宣告
2.7 模組的生與死
2.8 模組參數
2.9 User-Space 驅動程式
2.10 速查參考
第 3 章 字元裝置驅動程式
3.1 scull 的設計藍圖
3.2 主編號與次編號
3.3 重要的資料結構
3.4 註冊字元裝置
3.5 open 與 release
3.6 Scull 的記憶體用法規劃
3.7 read 與 write
3.8 玩玩新玩意兒
3.9 速查參考
第 4 章 偵錯技術
4.1 核心對於偵錯的支援
4.2 訊息偵錯法
4.3 查詢偵錯法
4.4 觀測偵錯法
4.5 排除重大系統失誤
4.6 偵錯工具
第 5 章 共時情境與相競現象
5.1 scull 裡的陷阱
5.2 共時情境與其控管方法
5.3 權狀(Semaphores)與獨佔權(Mutexes)
5.4 完工通知
5.5 迴旋鎖
5.6 鎖定機制的使用心法
5.7 鎖定技術的替代方案
5.8 速查參考
第 6 章 字元驅動程式的進階作業
6.1 ioctl
6.2 Blocking I/O
6.3 輪詢作業(poll 與 select)
6.4 臨時通知(Asynchronous Notification)
6.5 定位作業
6.6 裝置檔的存取控制
6.7 速查參考
第 7 章 時序
7.1 測量時隔
7.2 攝取「目前時刻」
7.3 延遲執行
7.4 核心計時器
7.5 Tasklet
7.6 工作佇列
7.7 速查參考
第 8 章 配置記憶體
8.1 kmalloc 的來龍去脈
8.2 前瞻快取(Lookaside Caches)
8.3 get_free_page() 系列函式
8.4 vmalloc() 與其相關函式
8.5 個別 CPU 的從屬變數
8.6 獲取大量記憶體
8.7 速查參考
第 9 章 硬體操作
9.1 「I/O 埠」與「I/O 記憶體」
9.2 I/O 埠的用法
9.3 I/O 埠的實例
9.4 使用 I/O 記憶體
9.5 速查參考
第 10 章 中斷處置
10.1 關於並列埠的準備工作
10.2 安裝 ISR
10.3 實作 ISR
10.4 ISR 的上下半段
10.5 中斷共享
10.6 中斷驅動式 I/O
10.7 速查參考
第 11 章 核心裡的資料型別
11.1 使用標準的 C 型別
11.2 有明確長度的資料項
11.3 介面專屬型別
11.4 移植性的顧慮
11.5 鏈結串列
11.6 速查參考
第 12 章 PCI 驅動程式
12.1 PCI 介面
12.2 回顧:ISA
12.3 PC 電腦上的其它匯流排
12.4 SBus
12.5 NuBus
12.6 外接式匯流排
12.7 速查參考
第 13 章 USB 驅動程式
13.1 USB 裝置的基本概論
13.2 USB 與 Sysfs
13.3 USB Urb
13.4 設計 USB 裝置驅動程式
13.5 不使用 URB 的 USB 傳輸
13.6 速查參考
第 14 章 Linux 裝置模型
14.1 Kobject、Ksets 與子系統
14.2 低階的 Sysfs 作業
14.3 熱插拔事件的產生
14.4 匯流排、裝置、驅動程式
14.5 類別
14.6 全部湊在一起
14.7 熱插拔(Hotplug)
14.8 韌體的更新
14.9 速查參考
第 15 章 MMAP 與 DMA
15.1 Linux 的記憶體管理
15.2 mmap 作業方法
15.3 直接 I/O
15.4 直接記憶體存取(DMA)
15.5 速查參考
第 16 章 區塊驅動程式
16.1 註冊
16.2 區塊裝置作業
16.3 傳輸要求的處理程序
16.4 補充細節
16.5 速查參考
第 17 章 網路介面驅動程式
17.1 snull 的設計理念
17.2 與核心相連
17.3 詳解 net_device 結構
17.4 開啟與關閉
17.5 封包傳送
17.6 封包接收
17.7 中斷處置
17.8 NAPI
17.9 連線狀態的變化
17.10 sk_buff 結構
17.11 MAC 位址查解
17.12 自訂的 ioctl 命令
17.13 統計資訊
17.14 群播
17.15 補充題材
17.16 速查參考
第 18 章 TTY 驅動程式
18.1 一個迷你 TTY 驅動程式
18.2 tty_driver 的作業方法
18.3 TTY 線路參數
18.4 ioctl 作業
18.5 TTY 裝置的 proc 與 sysfs 節點
18.6 tty_driver 結構的細節
18.7 tty_operations 結構的細節
18.8 tty_struct 結構的細節
18.9 速查參考
參考書目
索引
序
導讀
第 1 章 裝置驅動程式概論
1.1 驅動程式的角色
1.2 核心概論
1.3 裝置與模組的分類
1.4 安全顧慮
1.5 版本編號
1.6 授權約定
1.7 參與核心開發團隊
1.8 本書架構
第 2 章 模組
2.1 設定你的測試系統
2.2 Hello World 模組
2.3 核心模組 vs 應用程式
2.4 模組的編譯與裝載
2.5 核心符號表
2.6 前置宣告
2.7 模組的生與死
2.8 模組參數
2.9 User-Space 驅動程式
2.10 速查參考
第 3 章 字元裝置驅動程式
3.1 scull 的設計藍圖
3.2 主編號與...