應用程式與庫函數、核心、驅動之間的關係
應用程式、庫、核心、驅動程式的關係:應用程式調用應用程式函數庫完成功能、應用程式以檔案形式訪問各種資源、應用程式函數庫、部分函數直接完成功能、部分函數通過系統調用。
由核心完成核心處理系統調用。
調用裝置驅動程式,裝置驅動直接與硬體通訊。
它們之間的關係如所示
裝置類型:
常見的裝置有三類:字元裝置、塊裝置、網路裝置。
字元裝置:對字元裝置發出讀/寫請求時,實際的硬體I/O操作一般緊接著發生。
塊裝置:塊裝置與之相反,它利用系統記憶體作為緩衝區。
網路裝置:網路裝置是一類特殊的裝置,它不像字元裝置或塊裝置那樣通過對應的裝置檔案節點訪問,也不能直接通過read或write進行資料訪問請求。
裝置號
硬體裝置以主裝置號和從裝置號區分。在裝置管理中,除了裝置類型外,核心還需要對被稱為主從裝置號的參數,才能唯一標識一個裝置。主裝置號相同的裝置使用相同的驅動程式,從裝置號用於區分具體裝置的執行個體。在/dev目錄下使用ll命令(ls -l)可以查看各個裝置的裝置類型、主從裝置號等。cat /proc/devices可以查看系統中所有裝置對應的主裝置號。
裝置檔案
裝置類型、主從裝置號是核心與裝置驅動程式通訊時使用的,應用程式使用裝置檔案節點訪問對應裝置。Linux 2.4引入了裝置檔案系統(devfs)所有的裝置檔案作為一個可以掛載的檔案系統,每個主從裝置號確定的裝置都對應一個檔案節點。每個裝置檔案都有其檔案屬性(c代表字元裝置或者b代表塊裝置),都有2個裝置號:1、主裝置號,用於標識驅動程式;2、從裝置號:用於標識同一驅動程式的不同硬體。裝置檔案的主裝置號必須與裝置驅動程式在登記時申請的主裝置號一致。需要注意的是,系統調用是核心與應用程式之間的介面,裝置驅動程式是核心與硬體之間的介面。
驅動程式與應用程式的區別
1、應用程式以main開始,驅動程式沒有main,它以一個模組初始化函數作為入口。
2、應用程式從頭到尾執行一個任務,驅動程式完成初始化之後不再運行,等待系統調用。
3、應用程式可以使用GLIBC等標準C函數庫,驅動程式不能使用標準C庫。
使用者態與核心態
系統運行時一般情況下,分使用者態和核心態,這兩種運行態下的資料互不可見的。驅動程式是核心的一部分,工作在核心態,應用程式工作在使用者態。這樣就存在資料空間訪問的問題:無法通過指標直接將二者的資料地址進行傳遞。問題的解決辦法是:系統提供一系列函數協助完成資料空間轉換:例如,get_user 、put_user 、copy_from_user 、copy_to_user
等函數。
Linux驅動程式功能
驅動程式的一般功能是:對裝置初始化和釋放、把資料從核心傳送到硬體和從硬體讀取資料、讀取應用程式傳送給裝置檔案的資料和回送應用程式請求的資料、檢測和處理裝置出現的錯誤等。