裝置驅動程式簡介
更多內容請參考Linux裝置驅動程式學習----目錄
1. 簡介
Linux系統的優點是,系統內部實現細節對所有人都是公開的。Linux核心由大量複雜的程式碼組成,裝置驅動程式可以作為進入Linux核心世界大門的切入口。
裝置驅動程式在Linux核心中,是一個個獨立的黑盒子,在呼叫內部介面時某個特定硬體做出響應,這些介面隱藏了裝置的工作細節。使用者的操作通過獨立於特定驅動程式的一組標準化呼叫執行,將這些呼叫對映到作用於實際硬體的裝置特有操作上,是裝置驅動程式的任務。
模組化的特點使得Linux驅動程式的編寫非常方便簡單。
2. 裝置驅動程式的作用
裝置驅動程式的作用在於提供機制,而不是提供策略。
區分機制和策略是Unix設計背後隱含的最好思想之一。大部分程式設計問題都可以分成兩部分:
機制:需要提供什麼功能
策略:如何使用這些功能
我們應當儘可能做到讓驅動程式不帶策略。
編寫驅動程式時,特別注意:編寫訪問硬體的核心程式碼時,不要給使用者強加任何特定策略。因為不同的使用者有不同的需求,驅動程式應該處理如何使硬體可用的問題,而將怎樣使用硬體的問題留給應用程式。
驅動程式可以看作是應用程式和實際裝置之間的一個軟體層。
驅動程式設計要綜合考慮下面三個問題的因素:提供給使用者儘量多的選項、編寫驅動程式要佔用的時間、儘量保持程式簡單。
3. 核心功能劃分
根據核心完成任務的不同,核心功能分為如下幾個部分:
程式管理
負責建立和銷燬程式,並處理它們和外部世界之間的連線。如程式之間的通訊,控制程式如何共享CPU的排程器等。
記憶體管理
記憶體是計算機的主要資源之一,用來管理記憶體的策略是決定系統效能的一個關鍵因素。核心在有限的可用資源上為每個程式建立一個虛擬地址空間。
檔案系統
Unix中的每個物件幾乎都可以當作檔案來看待。核心可以在沒有結構的硬體上構造結構化的檔案系統。
裝置控制
幾乎每一個系統操作最終都會對映到物理裝置上。幾乎所有裝置操作都由驅動程式來完成。核心必須為系統中的每個外設嵌入相應的驅動程式。
網路功能
大部分網路操作和具體程式無關,網路功能必須由作業系統管理。系統負責在應用程式和網路介面之間傳遞資料包,並根據網路活動控制程式的執行。所有的路由和地址解析都由核心處理。
可裝載模組
Linux有個很好的特性,核心提供的特性可在執行時擴充套件,即系統啟動並執行時,可以以模組的形式,向核心新增、移出功能。
4. 裝置和模組分類
Linux系統將裝置分為三種基本型別,字元裝置模組、塊裝置模組、網路裝置模組。
字元裝置
字元裝置是個能像位元組流一樣被訪問的裝置,類似檔案。比如:字元終端(/dev/console)和串列埠(/dev/ttys0)
裝置檔案和普通檔案的唯一差別是,對普通檔案的訪問可以前後移動訪問位置,而大多數字符裝置是一個個只能順序訪問的資料通道。除個別例外。
塊裝置
塊裝置是按照塊進行讀寫的裝置,一次只能傳輸一個或多個完整的塊,一個塊一般是512位元組,或2的更高次冪位元組的資料。
塊裝置上能夠容納檔案系統。
網路裝置
網路裝置是一個能夠和其他主機交換資料的裝置,通常,介面是個硬體裝置,也可能是個純軟體裝置,比如迴環介面(loopback)。
網路裝置由核心中的網路子系統驅動,負責傳送和接收資料包。
除了裝置驅動程式外,核心中其他一些功能,不管是硬體還是軟體功能,都模組化了。如常見的檔案系統。。。
5. 安全問題
系統中的所有安全檢查都是由核心程式碼進行的,如果核心有安全漏洞,則整個系統就有安全漏洞。
驅動程式編寫者應當儘量避免在程式碼中實現安全策略。
驅動程式編寫者應當避免由於自身原因引入安全方面的缺陷。
任何從使用者程式得到的輸入只有經過核心嚴格驗證後才能使用。必須小心對待未初始化的記憶體,任何從核心中得到的記憶體,都必須在提供給使用者程式或者裝置之前清零或者以其他方式初始化,否則可能發生資訊洩露。
Linux核心也可編譯為不支援模組方式,從而可以關閉任何模組相關的安全漏洞。此時,所有需要的驅動程式必須直接編譯到核心中。
6. 版本編號
對核心來講,偶數編號的核心版本(如2.6.x)是用於正式發行的穩定版本,而奇數編號的版本(如2.7.x)則是開發過程中的一個快照。
更多內容請參考Linux裝置驅動程式學習----目錄