控制Linux核心啟動中的列印

2021-07-25 13:54:25 字數 2202 閱讀 5362

如果正常配置了輸入輸出終端,則核心啟動過程中會將很多資訊輸出到控制台上。這些資訊中有些表示嚴重錯誤,有些只是一般的提示資訊。 

在平台成熟後,繼續保留這些資訊既不美觀,也會影響啟動速度(串列埠的波特率很低)。因此要盡量遮蔽不重要的資訊。這需要對核心進行一些改造。

核心啟動過程中的列印都是通過printk()輸出的,按照重要程度,核心把這些列印分類為8個級別:

**********==== include/linux/printk.h 7

14 ***************====

#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 */

此外,核心還定義了一些巨集來表示要輸出到控制台上的級別、printk函式的預設級別等,在乙個陣列中描述:

*************** kernel/printk.c 60

74 ********************=

/* printk's without a loglevel use this.. */

#define default_message_loglevel 4 /* kern_warning */

/* we show everything that is more important than this.. */

#define minimum_console_loglevel 1 /* minimum loglevel we let people use */

#define default_console_loglevel 7 /* anything more serious than kern_debug */

declare_wait_queue_head(log_wait);

int console_printk[4] = ;

瀏覽核心**可以看到,基本上啟動過程中的列印都是以預設級別kern_warning及以下級別輸出,因此要控制這些資訊,只需要修改上面幾個巨集即可,尤其是將default_console_loglevel修改為4即可遮蔽大部分資訊。

重新編譯核心後嘗試啟動,可見大部分輸出都被遮蔽了。

改造後大部分的列印資訊消失,但是啟動後一些模組的正常printk也會被遮蔽,這會漏失掉很多重要資訊,為此在啟動完成後要恢復列印,方法是在啟動指令碼中執行一句: 

echo 7 4 1 7 > /proc/sys/kernel/printk 

就能恢復預設列印級別。

如果啟動過程異常,是不是列印就找不回來呢?當然不是,核心的printk除了向控制台輸出外,還將一些資訊輸出到了/proc/kmsg中,可以在啟動後通過dmsg命令全部找回。

如果需要臨時恢復列印,並不需要重新編譯核心。在啟動引數中配置一項ignore_loglevel即可:

*************** kernel/printk.c 471

479 ***************===

static

int__init ignore_loglevel_setup(char *str)

early_param("ignore_loglevel", ignore_loglevel_setup);

在輸出時會判斷ignore_loglevel變數,如果為真則無論如何都會將資訊輸出到控制台上。

控制Linux核心啟動中的列印

如果正常配置了輸入輸出終端,則核心啟動過程中會將很多資訊輸出到控制台上。這些資訊中有些表示嚴重錯誤,有些只是一般的提示資訊。在平台成熟後,繼續保留這些資訊既不美觀,也會影響啟動速度 串列埠的波特率很低 因此要盡量遮蔽不重要的資訊。這需要對核心進行一些改造。核心啟動過程中的列印都是通過printk 輸...

linux核心列印級別

1.printk 是乙個核心的乙個記錄日誌的機制,經常用來記錄資訊或者警告。printk可以指定輸出日誌的優先順序,在include linux kern levels.h中有相應的巨集定義 1 define kern soh 001 ascii start of header 2 define k...

linux 核心 核心啟動流程

cs是 段暫存器,ip是指令指標暫存器 相當於偏移位址 儲存的是 指令的位址。cs ip共同作用生成了 位址,具體演算法是cs左移4位 ip即是 位址。例如cs 0xf000,ip 0xfff0,則 位址為0xffff0.global globl 命令 global symbol global 使得...