什麼是驅動程序
驅動程序就是使硬件工作的一種特殊軟件,它運行在操作系統的內核空間(虛擬地址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內存有邊際效應,通過使用內存屏障函數來防止,指令被重新排序。