2012-12-12 435 views
5

我正在處理一個涉及內核和用戶空間代碼的大型嵌入式軟件(ARM處理器,嵌入式Linux 2.6.31,busybox)。通常首先加載一個內核模塊,守護進程和模塊建立netlink套接字。無法「模塊化」模塊

這裏的問題是,殺死守護之後,我不再能夠從內存中卸載該模塊:

% rmmod _module.ko 
% rmmod: _module.ko: Resource temporarily unavailable 

分析表明錯誤(返回值是-11,即EAGAIN?)返回try_stop_module()在系統調用delete_module()中調用kernel/module.c定義。函數try_stop_module()反過來調用stop_machine(),這是我卡住的地方,因爲我不確定那裏發生了什麼。我認爲根本原因是在守護進程中的某個地方打開連接到模塊,顯然是別的東西,並沒有正確關閉/清理退出(顯然有些引用/鎖不釋放?)

有沒有人任何想法還有什麼要看和探討?

+0

只是一個愚蠢的想法... rmmod -f ...迫使卸載? –

回答

1

首先你應該是一個超級用戶來做到這一點。你也可以使用rmmod -f,但是這個選項可能是非常危險的:除非編譯內核時設置了CONFIG_MODULE_FORCE_UNLOAD,否則它不起作用。使用此選項,您可以刪除正在使用的模塊,或者不打算移除的模塊,或已標記爲不安全的模塊。

也讀man rmmod

+0

感謝您的意見。我知道'強制'模式,但是在我的平臺上,busybox的rmmod沒有用這個選項編譯,我的目標是找出哪些描述符仍然保留並修復它,這顯然是模塊中的一個錯誤,或者/和守護進程。 – Mark

+2

還有一件事 - 這裏的主要問題是模塊引用的數量,即多少個進程正在使用該模塊(/ proc/net/modules的第三個字段),不是零,因此該模塊可以不會被卸載。 在運行守護進程之前,參考計數器爲0,守護進程啓動後,計數器上升到6,但我期望只有3,因爲它打開了三個套接字。所以,殺死該死者後,櫃檯降至3,因此模塊不能卸載。有什麼方法可以捕捉其他描述符等被保持打開的方式嗎? – Mark

1

檢查是否所有與你的模塊相關的接口不是'up'。

如果任何與您的模塊相關的接口是'up',那麼rmmod將會失敗並返回-11。

所以在打電話給rmmod之前, 使用'netcfg'命令檢查活動接口。 然後使用ifconfig,使您的接口關閉爲'ifconfig <interface_name> down'

然後嘗試運行rmmod <module_name>。 它會工作!

1.netcfg <lists out all interfaces> 
2.ifconfig <interface_name> down 
3.rmmod <module_name>