Linux系統中裝置分類
一般來說,Linux把裝置驅動程式分為4種:字元裝置,塊裝置,網路裝置及其他裝置。其中字元裝置和塊裝置可以像檔案一樣被訪問。例如:驅動程式通常會實現open, close, write, read, seek等操作。網路裝置在Linux系統中是一類比較特殊的裝置,它不像字元裝置或者塊裝置那樣對應裝置檔案節點訪問,核心也不再通過read,write等呼叫去訪問網路裝置。
驅動程式是核心程式碼的一部分,其地址空間是核心的地址空間。應用程式通過作業系統的系統呼叫執行相應的驅動程式函式,中斷則直接執行相應的中斷程式程式碼。當裝置驅動程式的file_operation結構體的地址被註冊到核心的裝置連結串列中之後,塊裝置和字元裝置以裝置檔案的方式建立在檔案系統的/dev目錄下,而且每個裝置都有一個主裝置號和一個次裝置號。
關於主裝置號與次裝置號:
在傳統的裝置管理中,除了裝置型別外,核心還需要主裝置號和從裝置號兩個引數,才能唯一的確定並標識某個裝置。
如圖所示,如果第一個字母是c,就代表字元設;如果是b,就代表是塊裝置;如果是d,就代表是個目錄,第五組代表主裝置號,第六組代表次裝置號。
在同一個系統中,一類裝置的主裝置號是唯一的。次裝置號只是在驅動程式內部使用,系統核心直接把次裝置號傳遞給應用程式,由驅動程式管理。為了保證驅動程式的通用性,避免驅動程式移植過程中出現主裝置號衝突,理想的方式是給每個裝置驅動動態的分配主裝置號。
裝置檔案系統(devfs)與udevfs:
裝置型別、主次裝置號是核心與驅動程式通訊時所使用的,但是對於開發應用程式的使用者來說難於理解和記憶,所以linux中使用裝置檔案的形式來統一對裝置的訪問介面。在引入裝置檔案系統(devfs)之前,linux將裝置檔案放在/dev下,裝置的命名一般為“裝置名+數字或者字母表示的子類”,例如,/dev/hd0,/dev/hd1等。
在linux2.4核心版本中引入了裝置檔案系統(devfs),將所有的裝置檔案掛載在同一個檔案系統下,可以被檔案系統統一的管理。同時,命名規則也發生了一些變化,一般為主裝置建立一個目錄,在講具體的子裝置建立在此目錄下。
值得注意的是,