2011-10-05 65 views
16

這種情況總是困擾我:如何刪除發生故障的內核模塊

我寫了一個內核模塊,有時它有一個bug(取消引用NULL指針)。在我insmod hello.ko之後,它顯示了一些內核錯誤。 然後我更改代碼,並嘗試刪除模塊並重新安裝。 現在的問題是:我不知道如何刪除內核模塊。

$ rmmod hello

ERROR: module hello in use

$ rmmod -f hello

ERROR: removing hello: device or resource busy

我總是重新啓動機器,以便移除模塊,這需要很長時間。有沒有人有更好的解決方案呢?感謝您的任何意見。

回答

10

使用虛擬機。

一旦你產生一個NULL解引用或其他這樣的錯誤,你就會把內核置於未知狀態。即使您設法刪除模塊(這是不太可能的;內核OOPS殺死調用線程,所以它永遠不會有機會減少引用計數 - 模塊將永遠不可移除),但仍可能存在腐敗留下,而你的新「固定」模塊也有可能陷入困境。

更好地使用快速重新啓動虛擬機 - 也許有快照,使恢復速度更快。

2

正如bdonlan指出的那樣,用虛擬機最好。

不過,如果你真的想要做你的方式,你必須:

  1. 檢查你的內核配置啓用CONFIG_MODULE_FORCE_UNLOAD
  2. 寫另一個模塊,設置破模塊的引用計數歸零。查看kernel/module.c中的delete_module系統調用