2.5. 核心符號表
insmod使用公共核心符號表來解析模組中未定義的符號。公共核心符號表包含所有的全域性核心項(函式和變數)的位址,這是實現模組化驅動程式所必需的。當模組被裝入核心後,這個模組匯出的任何符號都會變成核心符號表的一部分。通常情況下,模組只需實現自己的功能,而無需匯出任何符號。但是,如果其它模組需要從某個模組中獲得好處時,也可以匯出符號。
新模組可以使用由自己的模組匯出的符號,這樣,可以在其它模組上層疊新的模組。模組層疊技術也使用在很多主流的核心源**中。例如,msdos檔案系統依賴於由fat模組匯出的符號。模組層疊技術在複雜的專案中非常有用。如果以裝置驅動程式的形式實現乙個新的軟體抽象,則可以為硬體相關的實現提供乙個插頭。例如,video-for-linux 驅動程式組劃分了乙個通用模組,它匯出的符號可供下層與具體硬體相關的驅動程式使用。根據所安裝的硬體的不同,載入通用的video模組以及與具體硬體相關的特定模組。另外,並口支援以及大量可插拔裝置的處理(比如usb核心子系統)都使用類似的層疊方法。圖2-2給出並口子系統中的層疊方式,箭頭顯示模組之間和核心程式設計介面之間的通訊情況。
圖2-2並口驅動程式模組的層疊
modprobe是處理層疊模組的乙個實用命令。modprobe的功能在很大程度上和insmod類似,但是modprobe除裝入指定模組外還同時裝入指定模組所依賴的其它模組。因此,乙個modprobe命令有時相當於呼叫幾次insmod命令。通過層疊技術,可以將模組劃分為多個層,通過簡化每個層可縮短開發時間。
linux核心標頭檔案提供了乙個方法來管理符號(函式、變數)對模組外部的可見性,從而減少可能造成的名字空間的汙染,並且適當隱藏資訊。如果乙個模組需要向其他模組匯出符號,應該使用巨集。
export_symbol(name);
export_symbol_gpl(name);
分析:這兩個巨集用於將給定的符號(函式、變數)匯出到模組外部。export_symbol_gpl使得要匯出的模組只能被gpl許可證下的模組使用。符號必須在模組檔案的全域性部分匯出,這是因為這兩個巨集將被擴充套件為乙個特殊變數的宣告,而該變數必須是全域性的。該變數將在模組可執行檔案的特殊部分(elf段)中儲存,在裝載時,核心通過這個段來尋找模組匯出的變數。
Linux裝置驅動之第 2 章 預備知識
2.6.預備知識 核心是乙個特定的環境,對需要和它介面的 有自己的一些要求。大部分核心 中都要包含相當數量的標頭檔案,以便獲得函式 資料型別和變數的定義。有幾個標頭檔案是用於模組的,必須出現在每個可裝載的模組中。所有的模組 中都包含下面兩行 include include linux module....
Linux裝置驅動第 2 章之 模組引數
2.8.模組引數 由於系統的不同,驅動程式需要的引數也許會發生變化。這包括裝置編號以及其它一些用來控制驅動程式操作方式的引數。例如,scsi介面卡的驅動程式經常要處理一些選項,這些選項用來控制標記命令佇列的使用,而整合裝置電路驅動程式允許使用者控制dma操作。如果驅動程式用來控制一些早期的硬體,也許...
Linux核心 2 裝置驅動實驗
今天做了linux課設關於裝置驅動的實驗。實驗採用模組的方法編寫乙個可以進行簡單讀寫的字元裝置驅動,該裝置可以儲存一定長的字串,寫入裝置即可以將字串存入裝置,讀出即可以獲取該字串,並編寫了測試程式對其測試。1 首先新建並編寫了字元驅動裝置chardev.c檔案,檔案 如下 建立乙個字元裝置 讀寫 必...