理解printk函式

2021-06-27 05:30:25 字數 2853 閱讀 8769

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 日誌級別 訊息文字 這裡的日誌級別通俗的說指的是對文字資訊的一種輸出範圍上...