驅動程序 基本知識

什麼是驅動程序

驅動程序就是使硬件工作的一種特殊軟件,它運行在操作系統的內核空間(虛擬地址0xC0000000到0xFFFFFFFF),封裝硬件細節,服務於系統調用。

 

驅動程序和應用程序的區別

1.應用程序運行在用戶空間,驅動程序運行在內核空間。

2.應用程序可使用標準的庫函數,而驅動程序連接到內核,只能使用內核導出的符號和函數。

3.應用程序錯誤,一般只會殺死進程,而驅動程序錯誤,會造成系統不穩定,或者崩潰。

4.應用程序擁有很大的棧空間,而內核棧很小,一般只有4KB。

5.驅動程序類似事件驅動編程,它初始化時候,註冊一些設施,服務於系統調用。

 

驅動程序是這樣被使用的

1.應用程序使用標準庫提供的open函數,打開dev目錄下的設備文件。

2.庫函數根據參數,執行軟件中斷指令,引起CPU異常,從而進入內核模式。

3.內核異常處理函數,根據參數找到相應的驅動程序,並返回一個文件句柄給應用程序。

4.應用程序使用文件句柄,操作相應的設備,執行read和write等函數。

 

驅動程序的編寫流程

1.查看原理圖、數據手冊,瞭解設備參數和操作設備的方法。

2.以內核相近的驅動爲模板,進行開發。

3.實現驅動的初始化函數:申請設備號、初始化設備結構、申請中斷號並註冊中斷處理函數、最後使用申請到的設備號連同file_oprations結構一併向內核註冊。

4.實現file_oprations結構中的函數和中斷服務函數。

5.將驅動程序編譯進內核或者動態加載。

 

中斷的體系與結構:內核對所有中斷進行統一的編號,使用中斷描述符irq_desc描述中斷的名稱、狀態、標記底層中斷管理函數。用戶靜態或者動態申請中斷號時,request_irq根據中斷號找到中斷描述符irq_desc數組項,在它的Action鏈表中添加中斷處理函數。

 

中斷的處理流程

1.硬件中斷髮生時,cpu跳轉到中斷向量。

2.中斷向量,讀取中斷控制器計算中斷號,當參數調用中斷總入口函數asm_do_IRQ

3.asm_do_IRQ根據中斷號找到對應的irq_desc結構

4.從而逐個調用用戶申請中斷號時候,在Action中註冊的中斷處理函數。

 

併發的來源:smp、可搶佔內核、硬件中斷、可延遲機制(work_queue、tasklet、timer)。

併發解決機制:信號量、自旋鎖、原子變量、循環緩衝區。

避免死鎖:擁有鎖的代碼不能休眠;當需要多個鎖的時候,以同樣地順序去獲取。


驅動程序的識別

1.平臺設備platform_device結構描述設備的名稱,ID,佔用的端口與內存。內核初始化階段,將bsp裏的平臺設備添加到系統的設備鏈表。

2.平臺驅動platform_driver結構描述操作設備的函數。它和平臺設備通過設備名字進行比配。

 

IO端口和IO內存

它們和普通內存相同點是通過地址總線和數據總線,進行訪問和數據的傳輸;不同點是IO端口和IO內存有邊際效應,通過使用內存屏障函數來防止,指令被重新排序。


發佈了48 篇原創文章 · 獲贊 12 · 訪問量 1141萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章