1. 程式人生 > >linux 核心模組之間通訊

linux 核心模組之間通訊

Linux模組間通訊方法非常的多,最便捷的方法莫過於函式符號匯出,然後直接呼叫。

然而在linux2.6.26以後的核心中模組的符號匯出經常會出現問題,一個模組中的匯出符號不能被另外一個模組進行呼叫。這個使得處理有依賴關係的模組非常的頭疼。

1. 符號匯出函式

EXPORT_SYMBOL()

EXPORT_SYMBOL標籤內定義的函式對全部核心程式碼公開,不用修改核心程式碼就可以在您的核心模組中直接呼叫。

EXPORT_SYMBOL_GPL()

EXPORT_SYMBOL_GPL和前面一個類似,但這個範圍只適合GPL許可的模組進行呼叫。

2. 使用方法

加入B中呼叫A中匯出函式

[1] 在模組A中c檔案或者標頭檔案中使用EXPORT_SYMBOL(xxxx) 匯出函式.

有些需要新增編譯選項 -DEXPORT_SYMTAB.

[2] 在模組B中用 "extern" 申明函式(如, extern int xxxx);

申明以後就能夠直接使用匯出的函數了。

另外:在匯出函式以後,可以使用 cat  proc/kallsyms來檢視所有的匯出符號,其中屬性為t的標識是不能被呼叫的,所以如果匯出符號是t型別,那麼無法直接被其他模組使用。

3. 無法匯出問題解決

方法一: 在A模組編譯好後會生成符號表檔案Module_symvers,裡面有函式地址和函式名對應關係,把這個檔案拷貝到需要呼叫的B的原始碼下,替換B的該檔案。

然後重新編譯B模組.這樣就能夠讓B呼叫A的函式,以後載入模組順序也必須先A後B,解除安裝相反。

方法二: 將兩個模組放在一個目錄下,進行編譯。其實和方法一類似。

這樣就能夠成功的實現兩個模組之間的函式呼叫,比如KVM如果需要和驅動模組相互呼叫,就能使用這個方法。如果是兩個模組之間需要相互呼叫,可以讓驅動模組函式匯出,KVM模組將函式指標當做回撥函式傳給驅動,是想雙方的函式呼叫通訊。

記得這個問題出來以後一直沒有很好的解決,而且這個問題也許是一種系統的需要,而且Linux開發小組也沒有打算去處理這個問題。