萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 核心模組程式設計:任務排程機制、定時器佇列與模組卸載安全問題

任務排程兩種方案

方案一:crontab 喚醒模組(低效)

crontab 放置進程,定時透過系統呼叫(如開啟檔案)喚醒核心模組。缺點:需啟動新進程、載入執行檔,僅為喚醒已駐留記憶體的模組。

方案二:定時器中斷任務(高效)

  1. 建立 tq_struct 結構,含目標函數指標
  2. queue_task 將任務放入 tq_timer 列表,下個定時器中斷執行
  3. 函數執行完畢後,重新放回 tq_timer 實現週期性執行

模組卸載時的致命隱憂

rmmod 移除模組前檢查引用計數器,為零則呼叫 cleanup_module 清除模組記憶體。但系統不會檢查定時器任務列表是否仍有該模組函數指標。

極短時間後定時器中斷觸發,嘗試呼叫已不存在的函數指標 → 輕則報錯,重則跳入其他程式碼導致災難性後果。且無簡單方法從任務列表註銷任務。

解決方案:清理模組同步等待

  1. 卸載前設定全域變數,通知定時器函數停止重新入隊
  2. 呼叫 sleep_on(或 module_sleep_on)讓 rmmod 進程睡眠
  3. 下一次定時器中斷,函數不再入隊,列表最終清除該指標
  4. rmmod 進程被喚醒,確認安全後完成卸載
copyright © 萬盛學電腦網 all rights reserved