2012年11月5日 星期一

How to become a Linux Device Driver Programmer

本文只是想就自己的經驗與資料作個整理,讓一些有志開發 LDD (Linux Device Driver) 的新手可以有跡可循,畢竟這些只是自己跌跌撞撞的經驗,說不上參考,但還是希望能夠幫助到某些人。

第一步,作為使用者來學習 Linux。
這其實是個蠻大的門檻,我覺得在這之中有以下兩點特別重要:
  • Linux kernel 是什麼,它又負責做什麼事情?
  • 檔案與目錄管理,包含權限的了解
這部分可以參考「鳥哥的 Linux 私房菜」網站,該站有非常豐富的資源,講解也是簡單易懂!

第二步,學習 C,並嘗試在 Linux 底下開發可以在 Linux 執行的程式。
有了 Linux 的基礎之後,接下來就是自己嘗試開發程式,這時候開發的程式屬於 User space 範疇,我建議可以在此時多多使用各種 IO 相關的 Linux C API。

這部分我推薦閱讀 K&R 的「The C Programming Language」,這本書其實不太適合程式設計新手,所以可能還要另外找一本自己看得順眼的 C 入門書輔助閱讀。其實 LDD 的開發並沒有什麼太難的 C 語法,能夠通盤理解 K&R 的 C 語言聖經本就已經是非常熟稔 C 語言了。

第三步,開發 kernel module。
這一步我自己走的有點亂,也還沒整理好自己的經驗,不過我推薦以下幾本好書,讀者一定能從其中得到收穫。(之後有空再來重寫這段 XD)

Linux Device Driver 3rd Edition, O'REILLY 出版
Linux 裝置驅動程式之開發詳解 第二版, 松崗出版
Linux Device Driver Programming, 博碩出版

第四步,作為 kernel 開發者來學習 Linux。
之所以要走這一步的原因是因為開發 LDD 跟 kernel 息息相關,kernel 定義了許多介面要求 LDD 開發者遵守,並也提供了大量的 API 供 LDD 開發者使用。這樣有一個好處是分層可以分得很明確,User space program 跟 driver之間就沒有 dependency 的問題。另外,kernel 是由許多的 subsystem 組成,一個 LDD 不可能不跟這些 subsystem 互動,所以理解 kernel 的組成也是很重要的知識。

這部分我推薦閱讀 Robert Love 寫的「Linux kernel Development」,這本書由一種較宏觀的角度來介紹 kernel,細節沒有觸碰得太多,對於 kernel 初學者來說應該是比較好吸收的一本書。另外就是,除了實作需要之外,LDD 開發者也不太需要整個 kernel 都瞭若指掌,用到的時候再深入理解我覺得會比較符合人性,畢竟 kernel 是一隻蠻恐怖的大怪獸。

沒有留言:

張貼留言