printk函式是在開發驅動過程中經常用到的乙個函式,作用就是在串列埠上輸出核心的資訊。這個常用的函式的執行過程未必大家都很清楚,下面的文章分析一下
printk
的執行過程,並說明
printk
函式的一些特點。
下面是printk
的執行過程,重要的步驟有如下幾個
1. printk呼叫
vprintk
函式,首先是禁止搶占,並且關閉中斷;
2. 呼叫vscnprintf
函式,將輸出字串按格式組織在
printk_buf
緩衝區域中;
3. 呼叫emit_log_char
函式,將
printk_buf
中的內容拷貝到
log_buf
中去;
4. 呼叫release_console_sem
函式將log_buf
的內容傳送到硬體上;
根據上面列出來的printk
的執行過程,我們需要了解到幾個問題。
printk執行過程是禁止搶占和關閉中斷的,而從串列埠輸出字元的速度比較緩慢,只導致
printk
會嚴重影響程式執行的速率。
然後printk
函式中存在兩個緩衝
buf,乙個
buf叫做
printk_buf
,乙個buf
是log_buf
。printk_buf
只有1k
,它的作用是臨時按格式組織字串的緩衝。而
log_buf
是根據核心編譯時來配置的,可以大道
16k左右,是乙個環形的緩衝。
在linux
系統中,使用者態還可以通過
/proc/kmsg
將log_buf
中的內容讀出來。
/* * call the console drivers on a range of log_buf
*/static
void
__call_console_drivers(
unsigned
start,
unsigned
end) }
將log_buf
中的內容向硬體上輸出的時候,在
console_drivers
上面找到能用的
console
終端,然後呼叫
write
函式,將資料從硬體上輸出去。
關於console
終端的註冊也是比較有意思的。我們應該見過
u-boot
給核心傳遞核心引數的時候有這樣的內容,指明了
console
的名稱是
ttysac0
,而核心的串列埠驅動在初始化的時候會註冊
console
,如果u-boot
傳遞的這個
console
名稱和串列埠驅動註冊的名稱一樣,那麼
printk
就會利用串列埠註冊的
console
函式來操作硬體輸出內容。
下面的register_console
函式註冊
console
static
struct
console s3c24xx_serial_console =
; int
s3c24xx_serial_initconsole(
struct
platform_driver *drv,
struct
s3c24xx_uart_info *info) if
(strcmp(dev->name, drv->driver.name) != 0)
return0;
s3c24xx_serial_console.data = &s3c24xx_uart_drv;
s3c24xx_serial_init_ports(info);
register_console(&s3c24xx_serial_console);
return0;
}
在register_console
函式中會根據
u-boot
傳入的console
名稱選擇合適的
console
裝置註冊的
/* *see if this console matches one we selected on
*the command line.
*/for
(i =
0; i
0];
i++)
{ if
(strcmp(console_cmdline[i].name, console->name) != 0)
continue;
如果上面找到了名稱相同的console
結構體,呼叫
setup
函式進行初始化 if
(console->setup &&
console->setup(console, console_cmdline[i].options) != 0)
break
; console->flags |= con_enabled;
console->index = console_cmdline[i].index;
printk 函式的總結
不過在有些機器上執行得到的結果並不是這樣的 即一般情況下,syslog和kern.log兩個檔案中記錄的內容從程式設計這個角度來看是基本一致的。在目錄 var log 下有一下四個檔案可以檢視日誌 syslog kern.log,messages debug syslog和kern.log一般情況下...
printk 函式的總結
我們在使用printk 函式中使用日誌級別為的是使程式設計人員在程式設計過程中自定義地進行資訊的輸出,更加容易地掌握系統當前的狀況。對程式的除錯起到了很重要的作用。下文中的日誌級別和控制台日誌控制級別是乙個意思 printk 日誌級別 訊息文字 這裡的日誌級別通俗的說指的是對文字資訊的一種輸出範圍上...
printk 函式的總結
我們在使用printk 函式中使用日誌級別為的是使程式設計人員在程式設計過程中自定義地進行資訊的輸出,更加容易地掌握系統當前的狀況。對程式的除錯起到了很重要的作用。下文中的日誌級別和控制台日誌控制級別是乙個意思 printk 日誌級別 訊息文字 這裡的日誌級別通俗的說指的是對文字資訊的一種輸出範圍上...