標籤:linux ldd3 drivers 驅動 linux裝置驅動
1. 概述
讀《Linux Device Drivers 3》(影印版)(簡稱 ldd3)已經到第九章了,感覺前面的也忘的差不多了。所以準備把以前讀過的內容做一下筆記,並且主要側重代碼的注釋與理解。因為我也是一個Linux核心新手,所以將一步一步的介紹在學習驅動過程中的每一個細節。希望這些部落格在鞏固知識的同時,能夠協助到其他像我一樣摸索在Linux驅動和核心學習領域的入門新手。
這一篇部落格算是後續系列部落格的開篇,主要介紹一下與Linux的裝置驅動相關的概念以及驅動環境的搭建。
2. Linux驅動簡介
以前還沒有接觸過驅動之前,就聽我的同學說,他以後要做驅動開發,因為驅動處於底層,技術更新比較慢,這樣他就不用整天跟著流行技術跑了。當時就感覺驅動是高大上的技術,下定決心也要學習底層的東西。後來我的同學去了華為,不知道他有沒有在做驅動,反正我是下定決心學習要學習Linux核心。
簡單的說,驅動就是用來管理硬體的核心代碼。驅動程式的本質就是核心代碼,用來為上層的應用程式提供支援。學習了驅動程式之後,才明白了上層的應用到底是如何工作的。驅動程式既可以以模組的形式獨立存在,在需要的時候再被載入到核心中;又可以被編譯到核心中,直接使用。兩種方式各有優缺點,模組化的驅動使得核心的體積更小,而內建的驅動可以不用每次啟動系統後都載入需要的模組。一般來說,如果某個模組是你所經常需要用到的,建議將這個模組編譯到核心中。不過現在模組化已經深入人心,所以ldd3這本書介紹的驅動主要是模組化(module)的。
驅動可以劃分為三類:字元裝置驅動,塊裝置驅動和網路驅動。
字元裝置驅動是最常見的一類驅動,例如寫一個控制LED的驅動程式就屬於字元裝置驅動。這類驅動就像一個檔案一樣,通過檔案系統中的一個節點(存在於/dev目錄之下)進行訪問。字元裝置驅動實現的操作應該包括open,close,read和write,對它的操作是基於位元組流的,就像是在一個操作一個檔案(可能沒有lseek操作)。
塊裝置驅動通常與存放裝置有關,在塊裝置上可以安裝一個檔案系統,例如硬碟等。在大多數unix系統上,塊裝置驅動的操作不是基於位元組流,而是基於塊,一個塊一般為512位元組。不過在Linux系統中,已經掩蓋這個特點,使得塊驅動一次可以傳輸任意的資料,這也就和字元裝置完全一樣了。另外,應用程式對於塊裝置驅動的訪問也是通過/dev下的檔案系統節點來進行的。
網路裝置在這裡就先不介紹了。
3. 驅動開發環境搭建
關於 ldd3 的代碼可以使用下面的命令從 git 倉庫進行拷貝:
git clone https://github.com/duxing2007/ldd3-examples-3.x
將倉庫複製到本地之後,進入到倉庫的目錄,運行 make 命令進行編譯,就可以使用了。這個倉庫包含了 ldd3 每一章介紹的程式碼範例,很有參考價值。關於倉庫中具體模組的使用,以及在編譯過程中出現的錯誤,將會在以後的部落格中介紹。
裝置驅動簡介 -- ldd3讀書筆記