1. 程式人生 > >控制Linux核心啟動中的列印

控制Linux核心啟動中的列印

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

核心列印分析

核心啟動過程中的列印都是通過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] = { DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel */ DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */ MINIMUM_CONSOLE_LOGLEVEL, /* minimum_console_loglevel */ DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */ };

瀏覽核心程式碼可以看到,基本上啟動過程中的列印都是以預設級別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)
{
    ignore_loglevel = 1;
    printk(KERN_INFO "debug: ignoring loglevel setting.\n");

    return 0;
}

early_param("ignore_loglevel", ignore_loglevel_setup);

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

相關推薦

控制Linux核心啟動列印

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

如何調整Linux核心啟動的驅動初始化順序-驅動載入優先順序

轉載自:http://zhidao.baidu.com/link?url=adCsiTiI7i3QVYrTx19jkt_FvBV2VlQ4NV18pEu6Kdi4Yhv0ryauD3LHj1pxGE-YP8M_PxZnHNy-hVKBvzJOkPfqehZmR9CQm5GZ5XZDx-O Lin

linux核心啟動的初始化

                轉自 http://blog.csdn.net/mayaoyao11/article/details/6636977 【問題】 此處我要實現的是將晶片的ID用於網絡卡MAC地址,網絡卡驅動是enc28j60_init。 但是,讀取晶片ID的函式,在as352x_afe

Linux核心啟動顯示的logo的修改

1、配置核心 使核心啟動時載入logo,在原始碼的主目錄下make menuconfig Device Drivers  --->      Graphics support  -

Linux 核心啟動資訊的列印 --- dev_driver_string函式/dev_name函式

核心啟動時,常會打印出一些資訊:開頭是 "驅動模組的名字: + 具體的資訊"如:在執行的linux系統裝置上,插入滑鼠,就會打印出滑鼠的相關資訊;[ 402.134068] input: USB Optical Mouse as /devices/soc0/soc/2100

控制Linux kernel啟動console的列印級別

235 /* 236 * This should be approx 2 Bo*oMips to start (note initial shift), and will 237 * still work even if initially too large, it will just take sli

向android增加自定義的Linux核心啟動引數

前言,android裝置中常常需要新增自定義的核心配置,如imx51的primary_di定義 pmem定義等,這時需要使用__setup函式,下面的文章中詳述了該過程。 轉:如何增加自定義的Linux核心啟動引數 在驅動開發的過程中,有時為了除錯方便,需要給驅動傳入引數。

Linux核心啟動過程分析(十)-----RTC驅動分析

參考https://blog.csdn.net/xuao20060793/article/details/46433263這篇博文 RTC驅動分析: Class.c (drivers\rtc):subsys_initcall(rtc_init); static int __init

Linux核心啟動第二階段之setup_arch函式分析

轉自:http://blog.chinaunix.net/uid-20672257-id-2383451.html 執行setup_arch()函式 回到start_kernel當中,569行,呼叫setup_arch函式,傳給他的引數是

Linux核心啟動流程分析(一)

1. 依據arch/arm/kernel/vmlinux.lds 生成linux核心原始碼根目錄下的vmlinux,這個vmlinux屬於未壓縮,帶除錯資訊、符號表的最初的核心,大小約23MB;  命令:arm-linux-gnu-ld -o vmlinux -T a

Linux 核心驅動對檔案的讀寫

有時候需要在Linux kernel–大多是在需要除錯的驅動程式–中讀寫檔案資料。在kernel中操作檔案沒有標準庫可用,需要利用kernel的一些函式,這些函式主 要有: filp_open() filp_close(), vfs_read() vfs_write

omapl138移植uboot系列之修改移植TI官方移植的Linux核心(啟動核心第二篇)

修改Linux核心原始碼     實際上,剛剛我們已經成功的啟動了TI移植過的Linux核心,但是從串列埠控制檯的現象來看,“Starting Kernel”之後什麼資訊都沒有輸出,這就需要我們在TI移植過的核心原始碼之上進行相應修改,以適合我們的639A板卡。

Android 8.0 系統啟動流程之Linux核心啟動--kernel_init程序(三)

    在上一篇文章中詳細的分析了kthreadd程序的啟動,init程序也是有idle程序去觸發啟動的,init程序分為前後兩部分,前一部分是在核心啟動的,主要是完成建立和核心初始化工作,內容都是跟Linux核心相關的;後一部分是在使用者空間啟動的,主要完成A

linux 核心啟動錯誤和selinux引數 Kernel panic -not syncing:Attempted to kill init

今天在裝某個軟體的時候,修改了selinux引數。修改selinux 的某個引數值為Disable。導致 linux系統不能啟動。出現如下錯誤 Kernel panic -not syncing:Attempted to kill init! 後經過向群友請教和

國嵌視訊學習---linux核心啟動流程

一、核心檔案uImage的構成 uImage:Uboot header和zImage zImage:解壓程式碼和壓縮後的vmlinux映象 二、zImage核心的構成 其中解壓程式碼由Head.s和misc.s組成。 三、vmlinux核心構成 1.啟動程式碼部分:

Linux核心原始碼使用巨集定義的若干技巧

在C中,巨集定義的概念雖然簡單,但是真要用好卻並不那麼容易,下面從Linux原始碼中抽取一些巨集定義的使用方法,希望能從中得到點啟發: 1. 型別檢查 比如module_init的巨集定義: 點選(此處)摺疊或開啟 #define module_init(ini

Linux核心啟動資訊能過串列埠輸出

只需要在GRUB的配置檔案中加上核心引數 console=tty0 console=ttyS0,115200,如下 linux    /boot/vmlinuz-3.0.0-15-generic root=UUID=eb9f0676-556e-42c2-9681-52d7c

如何在Linux核心中將輸出列印到終端

#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/sched.h>#include <linu

Linux核心啟動過程概述 Linux核心啟動過程概述

Linux核心啟動過程概述    版權宣告:本文原創,轉載需宣告作者ID和原文連結地址。     Hi!大家好,我是CrazyCatJack。今天給大家帶來的是Linux核心啟動過程概述。希望能夠幫助大家更好的理解Linux核心的啟動,並且創造出自己的核

qemu把核心啟動訊息列印到視窗

舉例: qemu -nographic -kernel linux-4.17.11/arch/x86/boot/bzImage -initrd myinitrd4M.img -append "root=/dev/ram init=/init console=ttyS0"