「Ok,你買了幾本 Linux 驅動程式的書,然後呢?」
在學習一個新技術時,往往會期待先從一些簡單的例子出發,再逐漸延伸。
不過,如果這個新技術跟 Linux 核心相關,「一些簡單的例子」可能沒那麼簡單。
如果直接從核心改起,從一些作業系統課常見的名詞出發:行程管理、同步機制、記憶體等,往往會因為更動帶來的影響遍佈整個作業系統,而不知該如何下手。而如果從裝置驅動程式開始,個人電腦的硬體往往缺乏彈性,嵌入式系統則需要另外準備軟、硬體實驗環境、交叉編譯工具鏈等等,也很有可能需要另外使用 QEMU 之類的模擬器除錯。
要開始寫程式,才能驗證所學。但似乎很難找到簡單實驗環境與例子,那該怎麼辦呢?
別擔心!這本書就是來回答這個問題!
本書內容改編自第12屆iT邦幫忙鐵人賽IoT組冠軍系列文章──《Modern Maker : 從那些 Maker 的大小事看 Linux 核心》。本書旨在替理解 Linux 內部提供一個略為不同的切入點,使用創客手邊的 Raspberry Pi 與 Arduino,搭配最普遍使用的 Ubuntu,作為實驗 Linux 核心功能的環境。除此之外,本書援引近五年來的諸多研討會作為第一手材料。手上拿著這本書的你,不用買更多材料,今天回家就可以立刻實驗!
本書內容
Chapter 1:Ftrace 與 eBPF ,介紹 Linux 中的兩個動態追蹤機制:由「即時」分支來的 ftrace ,與近幾年討論度極高的 eBPF。這些工具使得讀者僅使用命令列,就能觀察 Linux 內部的運作。這樣做也容易有「外溢」的效果:如果你在追蹤結果中一直看到某些東西重複出現,自然會好奇這是什麼。於是你就有了一個學新東西的好情境。
Chapter 2:裝置樹與 Linux 裝置框架,介紹裝置樹與 Linux 裝置模型。一方面是更貼近 Maker 的經驗:Maker 們可能常 常在一些感測器、ADC、觸控螢幕的硬體供應商提供說明中,看到疊加裝置樹的指示。介紹裝置樹對於 Maker 來說,可以更深入理解這件事的目的,是非常有幫助的知識。另一方面,核心模組也可以因為結合裝置模型,許多函式可以使用自動資源管理的版本,也有助於讓程式更精簡。
Chapter 3:GPIO ,介紹如何在核心中使用 GPIO 。有了 GPIO 之後,就能在 Chapter 4:IRQ 中使用 GPIO 觸發各種 IRQ,搭配 Chapter 1 的動態追蹤工具,讓讀者可以親自實驗中斷上半部與下半部機制的執行機制、執行前後文、發生時機等等。本書涵蓋的下半部機制包含了 workqueue、softirq、tasklet 與 threaded IRQ。在理解 IRQ 之後,相信讀者在閱讀核心文件時,碰到如「該函式無法在不能休眠的情境使用」之類的敘述時,就不會容易感到困惑。
Chatper 5:I2C ,在介紹核心與使用者空間的 I2C 相關功能之後,Chatper 6:與使用者交換資料中,介紹了字元驅動程式,並且把前述的 I2C 的傳輸包裝成字元驅動程式。 最後則是介紹了專為感測器設計的 IIO 子系統。多數的 ADC、加速規、距離感測器等,有不少可以在 IIO 子系統中找到驅動程式。
本書使用的硬體
這本書使用 Raspberry 4B 與 Arduino Uno。當然,還需要幾條杜邦線。除此之外,為了不讓使用 3.3V 邏輯電壓的 Raspberry Pi 4B 被使用 5V 邏輯電壓的 Arduino Uno 破壞,部分實驗需要使用到邏輯準位轉換器(logic level shifter)。以及在最後的 IIO 實驗中,還需要一個 TCRT5000 紅外線距離感測器,但實際上也可以 Arduino Uno 替代。除此之外,你不需要更多硬體了。
Ok,準備好了,我們就直接開始吧!
作者
林有容
臺灣大學機械工程學系畢業,常用的暱稱是 0xff07。
除了玩貓之外,也是個筆記控。平常喜歡把學過的東西整理在 HackMD上,內容從在學時的必修課,到研討會的影片整理都有。
如果想看看我最近在弄什麼,歡迎來我的 HackMD 個人頁面看看。 hackmd.io/@0xff07。或者也可以由 0xff[email protected] 找到我。
目錄
前言
CHAPTER 1 – Ftrace 與 eBPF
前言
實驗一:使用 Ftrace 追蹤核心內部
實驗二:使用 bpftrace 追蹤
CHAPTER 2 – 裝置樹與 Linux 裝置框架
前言
實驗三:核心的規格書小抄— 裝置樹
實驗四:Linux Driver Model (LDM)
CHAPTER 3 – GPIO
前言
實驗五:在裝置樹中描述 GPIO
實驗六:在核心模組中使用 GPIO
CHAPTER 4 – IRQ
實驗七:Hard IRQ 與 Soft IRQ
實驗八:以 GPIO 觸發 IRQ
實驗九:Threaded IRQ
CHAPTER 5 – I2C
實驗十:I2C — 由 User 到 Kernel
CHAPTER 6 – 與使用者交換資料
實驗十一:以字元驅動程式包裝 I2C 傳輸
實驗十二:IIO 子系統簡介
附錄 – 環境與開發工具安裝
附錄一:在樹莓派安裝 Ubuntu 20.04
附錄二:使用 cscope 與 ctags 搜尋原始程式碼