printk的用法及優先順序

2021-10-02 02:06:40 字數 1470 閱讀 9709

這裡使用了 printk 來輸出資訊,而不是 printf!因為在 linux 核心中沒有 printf 這個函式。 printk 相當於 printf 的孿生兄妹, printf執行在使用者態, printk 執行在核心態。在核心中想要向控制台輸出或顯示一些內容,必須使用printk 這個函式。不同之處在於, printk 可以根據日誌級別對訊息進行分類,一共有 8 個訊息級別,這 8 個訊息級別定義在檔案 include/linux/kern_levels.h 裡面,定義如下:

#define kern_soh 「\001」

#define kern_emerg kern_soh 「0」 /* 緊急事件,一般是核心崩潰 /

#define kern_alert kern_soh 「1」 / 必須立即採取行動 /

#define kern_crit kern_soh 「2」 / 臨界條件,比如嚴重的軟體或硬體錯誤*/

#define kern_err kern_soh 「3」 /* 錯誤狀態,一般裝置驅動程式中使用 kern_err 報告硬體錯誤 /

#define kern_warning kern_soh 「4」 / 警告資訊,不會對系統造成嚴重影響 /

#define kern_notice kern_soh 「5」 / 有必要進行提示的一些資訊 /

#define kern_info kern_soh 「6」 / 提示性的資訊 /

#define kern_debug kern_soh 「7」 / 除錯資訊 */

一共定義了 8 個級別,其中 0 的優先順序最高, 7 的優先順序最低。如果要設定訊息級別,參考如下示例、

printk(kern_emerg 「gsmi: log shutdown reason\n」);

上述**就是設定「gsmi: log shutdown reason\n」這行訊息的級別為 kern_emerg。在具體的訊息前面加上 kern_emerg 就可以將這條訊息的級別設定為 kern_emerg。

如果使用 printk 的 時 候 不 顯 式 的 設 置 消 息 級 別 , 那 麼 printk 將 會 採 用 默 認 級 別message_loglevel_default, message_loglevel_default 預設為 4。

在 include/linux/printk.h 中有個巨集 console_loglevel_default,定義如下:

#define console_loglevel_default 7

console_loglevel_default 控制著哪些級別的訊息可以顯示在控制台上,此巨集預設為 7,意味著只有優先順序高於 7 的訊息才能顯示在控制台上。

這個就是 printk 和 printf 的最大區別,可以通過訊息級別來決定哪些訊息可以顯示在控制台上。預設訊息級別為 4, 4 的級別比 7 高,所示直接使用 printk 輸出的資訊是可以顯示在控制台上的。

printk的幾個優先順序

definekern emerg 0 緊急事件訊息,系統崩潰之前提示,表示系統不可用 definekern alert 1 報告訊息,表示必須立即採取措施 definekern crit 2 臨界條件,通常涉及嚴重的硬體或軟體操作失敗 definekern err 3 錯誤條件,驅動程式常用kern...

優先順序佇列的用法(基本)

簡介 優先順序佇列是一種常見的資料結構,在 stl原始碼剖析 中給出的定義是 priorty queue是以個帶權值觀念的queue,它允許加入新元素,移除舊元素,審視元素值等功能。由於這是乙個queue,所以只允許在底端加入元素,並從頂端取出元素。但是優先順序佇列中的元素並非依照被推入佇列的順序排...

C64X EDMA優先順序及優先順序佇列

下圖為edma傳輸請求方框圖 從圖中我們可以看到,請求有三種 ll2控制器傳輸請求 l2控制器發布所有用於cache服務的傳輸請求 如訪問非cache記憶體 qdma傳輸等。對c64x dsp,cache服務請求可以在任何優先順序上產生,這可以通過cache配置暫存器 ccfg 的p位來設定。對於讀...