Linux Device Driver - printk_ratelimit
前篇 : Linux Device Driver - module parameter
在 Linux Device Driver 3rd 的 4.2.5 章節, 介紹到 printk_ratelimit().
用之前範例程式 修改, 寫了一個 example :
https://github.com/neojou/linuxdevicedriver/tree/master/testwifi-printk-1
printk 在 device driver 是一個蠻常用的 debug function.
但有時候如果在短時間印出大量的訊息, 可能會造成日誌滿溢, 或拖慢系統,
或訊息太多反而無法 debug .. , 這時候就可以用到 printk_ratelimit()
這種情況, 最常發生在 ISR (中斷處理函式) 的 debug
因為一般程式, 軟體在撰寫時, 不會特別寫迴圈印很多訊息
在 Linux Device Driver 3rd 的 4.2.5 章節, 介紹到 printk_ratelimit().
用之前範例程式 修改, 寫了一個 example :
https://github.com/neojou/linuxdevicedriver/tree/master/testwifi-printk-1
printk 在 device driver 是一個蠻常用的 debug function.
但有時候如果在短時間印出大量的訊息, 可能會造成日誌滿溢, 或拖慢系統,
或訊息太多反而無法 debug .. , 這時候就可以用到 printk_ratelimit()
這種情況, 最常發生在 ISR (中斷處理函式) 的 debug
因為一般程式, 軟體在撰寫時, 不會特別寫迴圈印很多訊息
( 範例中的是為了測試 printk_ratelimit() 行為, 一般不會這樣寫 )
但 ISR 有可能我們雖然裡面只寫一行 printk, 但因為短時間發生太多中斷
( 譬如中斷沒清除, 或 HW bug) 導致印太多 printk, 這時候就可以用這函式.
例如範例中 usb_intf.c 的 module init function,
我們在離開前刻意 while loop 做 printk
printk_ratelimit() 會判斷目前情況是否可以印, 可以回傳 1 , 不行回傳 0
他的判斷方式, 主要來自兩個參數
/proc/sys/kernel/printk_ratelimit
the number of seconds to wait before re-enabling messages
在重新能打印前等待的秒數
/proc/sys/kernel/printk_ratelimit_burst
the number of messages accepted before ratelimiting
限速前能打印的個數
以 Ubuntu kernel 4.4.3 來看
printk_ratelimit : 5
printk_ratelimit_burst : 10
會發現 insmod 完 dmesg 中, 有 10 筆 "module init ret=... "
PS: /proc 是 linux 虛擬的檔案, 會佔記憶體, 但不佔像硬碟的存取空間
比較常用的像
module
cpuinfo
meminfo
...
留言
張貼留言