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開發小組也沒有打算去處理這個問題。