設備管理是操作系統五大管理中最復雜的部分。與Unix系統一樣,Linux系統采用設備文件統一管理硬件設備,從而將硬件設備的特性及管理細節對用戶隱藏起來,實現用戶程序與設備無關性。在Linux系統中,硬件設備分為兩種,即塊設備和字符設備。
1、特別文件
用戶是通過文件系統與設備接口的,所有設備都作為特別文件,從而在管理上就具有一些共性。
(1)每個設備都對應文件系統中的一個索引節點,都有一個文件名。設備的文件名一般由兩部分構成,第一部分是主設備號,第二部分是次設備號。
主設備號代表設備的類型,可以惟一地確定設備的驅動程序和界面,如hd表示IDE硬盤,sd表示SCSI硬盤,tty表示終端設備等;次設備號代表同類設備中的序號,如hda表示IDE主硬盤,hdb表示IDE從硬盤等。
(2)應用程序通常可以通過系統調用open( )打開設備文件,建立起與目標設備的連接。
?。?)對設備的使用類似于對文件的存取。打開設備文件以后,就可以通過read( )、write( )、ioctl( )等文件操作對目標設備進行操作。
?。?)設備驅動程序都是系統內核的一部分,它們必須為系統內核或它們的子系統提供一個標準的接口。例如,一個終端驅動程序必須為Linux內核提供一個文件I/O接口;一個SCSI設備驅動程序應該為SCSI子系統提供一個SCSI設備接口,同時SCSI子系統也應為內核提供文件I/O和緩沖區。
?。?)設備驅動程序利用一些標準的內核服務,如內存分配等。另外,大多數Linux設備驅動程序都可以在需要時裝入內核,不需要時可以卸載下來。
處于應用層的進程通過文件描述字fd與已打開文件的file結構相聯系。在文件系統層,按照文件系統的操作規則對該文件進行相應處理。
對于一般文件(即磁盤文件),要進行空間的映射—從普通文件的邏輯空間映射到設備的邏輯空間,然后在設備驅動層做進一步映射—從設備的邏輯空間映射到物理空間(即設備的物理地址空間),進而驅動底層物理設備工作。
對于設備文件,則文件的邏輯空間通常就等價于設備的邏輯空間,然后從設備的邏輯空間映射到設備的物理空間,再驅動底層的物理設備工作。
2、設備驅動程序和內核之間的接口
Linux系統和設備驅動程序之間使用標準的交互接口。無論是字符設備、塊設備還是網絡設備的驅動程序,當內核請求它們提供服務時,都使用同樣的接口。
Linux提供了一種全新的機制,就是“可安裝模塊”??砂惭b模塊是可以在系統運行時動態地安裝和拆卸的內核模塊。利用這個機制,可以根據需要在不必對內核重新編譯連接的條件下,將可安裝模塊動態插入運行中的內核,成為其中一個有機組成部分,或者從內核卸載已安裝的模塊。設備驅動程序或與設備驅動緊密相關的部分(如文件系統) 都是利用可安裝模塊實現的。
在應用程序界面上,利用內核提供的系統調用來實現可安裝模塊的動態安裝和拆卸。但通常情況下,用戶是利用系統提供的插入模塊工具和移走模塊工具來裝卸可安裝模塊。插入模塊的工作主要如下:
(1) 打開要安裝的模塊,把它讀到用戶空間。這種“模塊”就是經過編譯但尚未連接的.o文件。
(2) 必須把模塊內涉及對外訪問的符號(函數名或變量名)連接到內核,即把這些符號在內核映像中的地址填入該模塊需要訪問這些符號的指令及數據結構中。
(3) 在內核創建一個module數據結構,并申請所需的系統空間。
(4) 最后,把用戶空間中完成了連接的模塊映像裝入內核空間,并在內核中“登記”本模塊的有關數據結構(如file_operations結構),其中有指向執行相關操作函數的指針。
如前所述,Linux系統是一個動態的操作系統。用戶根據工作中的需要,會對系統中設備重新配置,如安裝新的打印機、卸載老式終端等。這樣,每當Linux系統內核初啟時,它都要對硬件配置進行檢測,很有可能會檢測到不同的物理設備,就需要不同的驅動程序。
在構建系統內核時,可以使用配置腳本將設備驅動程序包含在系統內核中。在系統啟動時對這些驅動程序初始化,它們可能未找到所控制的設備,而另外的設備驅動程序可以在需要時作為內核模塊裝入到系統內核中。
為了適應設備驅動程序動態連接的特性,設備驅動程序在其初始化時就在系統內核中進行登記。Linux系統利用設備驅動程序的登記表作為內核與驅動程序接口的一部分,這些表中包括指向有關處理程序的指針和其它信息。