驅動除錯之printk

2021-08-19 04:30:56 字數 2764 閱讀 5471

閱讀過linux核心原始碼的童鞋肯定知道,核心有很多呼叫printk函式列印的除錯資訊。但是在核心啟動的時候,這些除錯資訊是預設不會列印出來的,需要啟動之後呼叫dmesg命令才能檢視到核心的列印資訊,即便這樣,我們還是不能檢視到完整的核心列印資訊,這是為什麼呢?下面我們要引入printk的級別

1.1 printk 列印級別

核心通過 printk() 輸出的資訊具有日誌級別,日誌級別是通過在 printk() 輸出的字串前加乙個帶尖括號的整數來控制的,如 printk("<6>hello, world!\n");。核心中共提供了8種不同的日誌級別,在 linux/kernel.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 */

#define kern_info     "<6>"   /* informational */

#define kern_debug    "<7>"   /* debug-level messages */

以上8種級別,級別0最高(哈哈,一般來說核心裡面數字越小級別越高)。當你直接呼叫printk函式沒有設定列印級別的時候,預設為4級,以下分別為每個級別的意義:

kern_emerg

用於突發性事件的訊息,通常在系統崩潰之前報告此類訊息。 

kern_alert

在需要立即操作的情況下使用此訊息。 

kern_crit

用於臨界條件下,通常遇到嚴重的硬軟體錯誤時使用此訊息。 

kern_err

用於報告錯誤條件;裝置驅動經常使用kern_err報告硬體難題。 

kern_warning

是關於問題狀況的警告,一般這些狀況不會引起系統的嚴重問題。 

kern_notice

該級別較為普通,但仍然值得注意。許多與安全性相關的情況會在這個級別被報告。 

kern_info

資訊訊息。許多驅動程式在啟動時刻用它來輸出獲得的硬體資訊。

kern_debug

一些核心的除錯資訊。

1.2 設定列印級別

你可以執行:cat  /proc/sys/kernel/printk,檢視設定的列印級別,

該檔案有四個資料,預設是6 4 1 7,這四個資料的含義分別如下:

控制台日誌級別:優先順序高於該值的訊息將被列印至控制台

預設的訊息日誌級別: 將用該優先順序來列印沒有設定優先順序的訊息

最低的控制台日誌級別: 控制台日誌級別可被設定的最小值 (其實就是最高優先順序)

預設的控制台日誌級別:  控制台日誌級別的缺醒值

現在我們可以執行echo  8 /proc/sys/kernel/printk,這樣所有的訊息就可以列印出來了

2、printk的實現原理

一些基本資訊,platform:s3c2440        kernel version:2.6     uboot :1.6

2.1  uboot 傳入控制引數,設定串列埠為輸出方式

console=ttysac0  console=tty1

2.2  核心處理uboot傳輸的引數

console_setup

add_preferred_console    //表示我想用名為"ttysac0"的控制台,並記錄下來

2.3  printk主要呼叫過程

printk

vprintk  //先把輸出資訊放入臨時的buffer

vscnprintf

//把臨時buffer的資料進行處理,再寫入log_buf

//比如printk("abc");這種沒有加列印級別的訊息,加上預設列印級別,再寫入log_buf

//呼叫dmesg命令把log_buf裡的資料列印出來重現核心的輸出資訊(歷史資訊)

//呼叫硬體的write函式輸出資訊

release_console_sem();

call_console_drivers(_con_start,  log_end);

//從log_buf中得到資料,算出列印級別,只輸出列印級別高的log資訊

if( msg_log_level < consol_loglevel )

__call_console_drivers

con->write(con, &log_buf(start), end -start);

linux驅動除錯之printk

對於做嵌入式或者熟悉linux核心的人來說,對printk這個函式一定不會感到陌生。printk相當於printf的孿生姐妹,她們乙個執行在使用者態,另乙個則在核心態被人們所熟知。printk是在核心中執行的向控制台輸出顯示的函式,linux核心首先在核心空間分配乙個靜態緩衝區,作為顯示用的空間,然...

核心開發除錯printk

在進行驅動開發的過程中往往要列印一些資訊來檢視是否正確類似於printf,以下將介紹在核心開發常用的除錯方法。第一次寫文章,內容可能不咋樣勿噴呀 一 printk介紹 二 如何檢視並修改訊息級別 在應用程式採用printf列印除錯 核心驅動採用printk列印除錯。printk函式列印資料到cons...

printk 核心除錯 訊息級別

核心除錯相比於使用者程式除錯難度就要大很多。linux 是 c 語言寫的,但不能使用 printf 來列印,原因很容易解釋,核心中不認識庫 檔案中的 printf 函式。最普通的除錯技術是監視,即在應用程式中的適當地方呼叫 printf 顯示監視資訊,這 是針對普通應用程式而言,對於 linux 核...