linux 內核 printk 使用


在linux 中,內核打印語句 printk() 會將內核信息輸出到內核信息緩沖區中。內核信息緩沖區是一個環形

緩沖區(ring buffer),因此,如果插入的信息過多,就會將之前的信息沖刷掉。

 

printk() 定義了8個消息級別,分為級別0 ~ 7,級別越低(數值越大)的消息越不重要,第0級是緊急事件,

第7級是調試級,在內核中 include/linux/printk.h 中的定義如下:

#define KERN_EMERG    "<0>"    /* system is unusable            */
#define KERN_ALERT    "<1>"    /* action must be taken immediately    */
#define KERN_CRIT    "<2>"    /* critical conditions            */
#define KERN_ERR    "<3>"    /* error conditions            */
#define KERN_WARNING    "<4>"    /* warning conditions            */
#define KERN_NOTICE    "<5>"    /* normal but significant condition    */
#define KERN_INFO    "<6>"    /* informational            */
#define KERN_DEBUG    "<7>"    /* debug-level messages    */

0級,代表緊急事件,一般是系統崩潰之前提示的消息

1級,必須立即采取行動

2級,臨界狀態,通常涉及嚴重的硬件或軟件操作失敗

3級,用於報告錯誤狀態,設備驅動程序會經常使用KERN_ERR 報告來自硬件的問題

4級,對可能出現問題的情況進行警告,這類情況通常不會對系統造成嚴重問題

5級,有必要進行提示的正常情況,許多與安全相關的狀況用這個級別進行提示

6級,內核提示性信息,很多驅動程序在啟動的時候用這個級別打印出它們找到的硬件信息

7級,用於調試信息

 

調試時,通常使用封裝了 printk 的更高級的宏,其中可替代 printk 的宏如下:

#define pr_emerg(fmt, ...) \
    printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
#define pr_alert(fmt, ...) \
    printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)
#define pr_crit(fmt, ...) \
    printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
#define pr_err(fmt, ...) \
    printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
#define pr_warning(fmt, ...) \
    printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
#define pr_warn pr_warning
#define pr_notice(fmt, ...) \
    printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
#define pr_info(fmt, ...) \
    printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
#define pr_cont(fmt, ...) \
    printk(KERN_CONT fmt, ##__VA_ARGS__)

/* pr_devel() should produce zero code unless DEBUG is defined */
#ifdef DEBUG
#define pr_devel(fmt, ...) \
    printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
#define pr_devel(fmt, ...) \
    no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#endif

 

在打印信息時,如果要打印所出其所在函數,可以使用 __FUNCTION__, 如下示:

printk("%s: Incorrect IRQ %d from %s\n", __FUNCTION, irq, devname);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM