2013-03-29 53 views
8

我有兩個Linux內核模塊,其中一個可能會爲另一個提供一些功能。但是使用該功能並不重要,即使第一個模塊不存在,第二個模塊也可能(也應該)工作。Linux內核之間的模塊間通信

如果我只是從第一個模塊導出函數並在第二個模塊中使用它,則第二個模塊依賴於該符號,如果沒有第一個模塊就不能加載。

其中一個解決方案是讓用戶腳本查看第一個模塊中函數的/ proc/kallsym,如果它存在,腳本將其地址作爲參數傳遞給第二個模塊,指針掉了。但由於顯而易見的原因,我不喜歡這種解決方案。

如果有更多的正確和優雅的解決方案,將允許第二個模塊去獲取第一個模塊中的某個符號的地址,但避免硬依賴?

回答

1

我認爲如果模塊B依賴於模塊A,模塊B不能成功加載沒有模塊A首先加載。

實際上,只有先插入模塊A後,模塊B需要從模塊A導出的符號纔會出現在/ proc/kallsym文件中。

您的情況的解決方案:在模塊B中,module_init()函數應該有一些代碼來檢查模塊A是否已經存在或不存在,如果沒有,先載入A.即使用request_module()來加載A,或者使用try_then_request_module()創建一個更花哨的方法。

+0

即使根本沒有模塊A,模塊B也需要工作(假設A提供了某個機器上不存在的某種硬件加速器的接口)。 – Eugene

+0

2.4中有query_module()接口,幾乎完全符合我的需求,但它在2.6中被刪除。我想知道是否有一些替代品... – Eugene

5

最後我找到了解決方案:kernel有symbol_get()和symbol_put(),它讓我有機會在另一個模塊中查找任意符號(當然它需要導出),並防止模塊卸載,而我使用它的符號。

1

有更優雅的解決方案,但需要更改內核。基本上,內核被增強以容納模塊註冊。當一個模塊被加載並想要將自己暴露給其他模塊時,他將使用衆所周知的int註冊到內核中 - 這只是內核數組的索引,用於存儲對已註冊模塊的引用。現在,任何想要獲得對另一個模塊的引用的模塊都只需要內核對這個模塊的新引用 - 使用相同的,熟知的int。這些新的參考文獻必須短暫存在(即您得到一個參考文獻,但將其放回到相同的上下文中)。爲了允許長時間連接,你必須在兩者之間建立一個協議,這樣當任何一個模塊卸載時,他/她都知道如何通知另一個模塊他將要離開。