linux裝置驅動原理與本質
任何計算機系統都是軟體和硬體的結合體,如果只有硬體而沒有軟體,則硬體是沒有靈魂的軀殼;如果只有軟體沒有硬體,則軟體就是一堆無用的字元。在底層硬體的基礎上,作業系統覆蓋一層驅動,遮蔽底層硬體的操作,通過特定的軟體介面去操作底層硬體,使用者在使用者空間可以很容易的把軟體設計目標放在策略與需求上,可以很方便的遮蔽掉底層實現,從而很好的完成客戶功能需求。計算機系統是軟體和硬體的結合體。而軟體又分為應用層軟體和驅動層軟體。驅動層軟體是應用層軟體和底層硬體的紐帶。通過驅動層軟體實現對底層硬體遮蔽。
在裸機時代,比如微控制器系統,程式設計師往往是直接操作硬體暫存器,直接設定硬體。而在Linux作業系統中,硬體驅動程式中實現對硬體直接操作,而使用者空間,通過通用的系統呼叫介面,實現對硬體操作,應用程式沒有直接操作底層裝置,通過posix標準,應用程式的系統呼叫往往是被規定和限值,使用者只能通過規定的介面實現對底層硬體的操作,導致了應用程式在類UINIX作業系統具有非常好的可移植性。
圖2.1 直接操作硬體程式
上圖2.1 是裸機時代,應用程式和硬體操作糅合在一起,應用程式和硬體操作高度耦合的框圖,上述程式碼一般很難有良好的程式碼互用和移植性。往往從一個平臺移植到另一個平臺,甚至是同一平臺不同硬體配置都要求很大的程式碼改動,另外從應用層來說,應用與驅動高度耦合,應用程式也幾乎難以移植,甚至說是沒有應用程式概念,原因在於應用與驅動的糾纏不清。
圖2.2 無作業系統應用程式和裝置驅動程式關係
上圖2.2所示,良好的裸機程式碼框架,裝置驅動層和應用層之間有良好的分層思想,使用者可以較好的實現策略和需求,例如:客戶要求實現流水燈程式,程式設計師在底層機制實現(硬體操作)的基礎下,可以充分在使用者應用程式中把主要精力方法流水燈的實現,即策略。但是在良好的裸機程式設計,程式碼移植性可能從一個平臺移植到另外一平臺只需要修改少量的底層驅動,例如:LED_ON()的實現。但是在使用者空間,沒有系統呼叫概念,函式介面千差萬別。應用程式移植性差。
圖2.3 Linux系統呼叫框圖
作業系統中,需求決定應用程式,通過系統呼叫,呼叫底層驅動,此外,在驅動程式中,把一部分公用的驅動介面抽象出來,如此,程式設計師只需修改很少量的驅動資源,形成特定的驅動框架。導致使用者只需新增專用的硬體屬性作為平臺資源,在核心中獲取資源,大大解放了裝置驅動開發,提高了裝置驅動的通用型。在使用者空間,由於遵循posix標準,類UNIX作業系統中,所有操作介面基本一樣,從而方便了應用程式的移植,應用程式幾乎不要做修改。如圖2.3所示。
Linux作業系統對於所有的硬體都是當做一個檔案來操作:一切裝置皆檔案。Linux裝置檔案一般分為字元裝置,塊裝置,網路裝置。在Linux系統中,除了網路裝置之外,所有的裝置都被對映到Linux的檔案系統中。如圖2.4所示。
圖2.4 Linux作業系統與應用程式關係