簡體   English   中英

如何調試Linux內核模塊的init_module()調用?

[英]How to debug the init_module() call of a Linux kernel module?

我正在進行Linux內核開發的第一步。 我有一些代碼生成一個.ko內核模塊,我用insmod安裝。 我想要一種方法來調試安裝模塊時會發生什么,但我遇到了一些困難。

  1. 我需要調試對init_module的調用。 我運行insmode時調用了這個函數嗎?

  2. 我嘗試使用insmod "/my/url/fil.ko" -m來調試會發生什么,但每次我收到錯誤-1 Unknown symbol in module而在/cat/log/message我可以看到錯誤unknown parameter -m

  3. 你知道是否有辦法用GDB進行調試?

是的,只要使用insmod將init_module函數加載到內核,就會調用它。 您只需添加一行printk,並在插入模塊后立即驗證是否正在打印。

您不能傳遞諸如-m之類的參數來調試內核模塊。

您只能使用MODULE_PARAMS傳遞要在您編寫的內核模塊中處理的參數。

QEMU + GDB步驟調試module_init

在嘗試使用module_init之前首先獲得內核模塊QEMU + GDB調試一般工作: 如何使用QEMU調試Linux內核模塊?

module_init更難,因為我們不知道內核模塊在它之前會被加載到何處。

然后,這里有兩個非理想但可用的技術來打破module_init

  1. 找到模塊加載地址,稍后重復使用。

    每次啟動后模塊加載位置都是確定的,因此我們可以找到:

    然后,添加它們,並告訴GDB在那時斷開。

  2. 進入module_init調用。

    在內核4.16上,首先在:

     do_init_module 

    然后步驟直到:

     ret = fn(); 

    然后進入,你進入module_init函數。

QEMU + Buildroot設置可用於方便地測試這兩種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM