列印的優先順序以及動態列印

2021-08-15 15:48:25 字數 4276 閱讀 1290

這裡有兩個方向的列印概念:

1,控制台的列印級別

2,printk的預設列印級別

1.控制台的列印級別:

啟動後使用這個命令:

cat /proc/sys/kernel/printk,

可以看到:8 4 1 7 //數字越小代表級別越高

上述數字分別為:

8 :控制台的日誌列印級別,即如果使用帶列印級別的printk的列印級別 > 控制台的級別,才可以輸出該列印,也就是說,它控制這核心啟動時候哪些級別的列印應該輸出

這個值可以在啟動後通過echo "8 4 1 7" > /proc/sys/kernel/printk去修改,但是此時核心已經啟動了,修該了以後,只是對於修改後的程式執行起作用,那麼如果要

修改啟動時候的列印級別該怎麼辦?

這個值是靠啟動引數中的cmdline中的loglevel= ?來傳入核心的,所以要在啟動前修改控制台的列印級別就修改這個啟動引數就可以

4:這個值表示的printk的預設列印級別,即使用printk("")這種方式列印的列印級別,

printk(log_level," ");這種方式是顯示的使用printk的列印級別,用的什麼級別就是什麼級別,例如printk(kern_debugl," ");

這個值可以通過echo "8 4 1 7" > /proc/sys/kernel/printk的方式去修改,也可以在核心配置項中修改它預設的配置

kernel

hacking

--->

printk

anddmesg options

--->

(4

)default

message log level (1

-7)

1:控制台可以接收的最低的列印級別7:預設的控制台log級別所以如果你使用了printk(「 」)這種沒有指定列印級別的方式,如果想要列印出來要麼修改控制台的列印級別小於printk的預設列印級別,要麼修改printk的預設列印級別大於控制台的列印級別

但是一般不要這麼做,核心提供了動態列印的系統,例如pr_debug,dev_debug這種介面。他們是對printk(log_level," ")的二次封裝,可以動態的修改控制台的列印

去控制他們的輸出。這樣的話,printk的預設優先順序我們就不用再去關注。只要不使用printk(「 」)這種方式

*************************==分割線*************************

如何設定控制台的列印級別?

這個值是靠啟動引數中的cmdline中的loglevel= ?來傳入核心的

-------------------------分割線------------------------------

使用老的方式的printk(「」)沒有列印了?如果還沒有出來列印,可以在串列埠輸入下面的命令就可以把快取區里的列印打出來dmesg如果老的系統大量使用了printk(「」),而不是這種pr_debug或者dev_debug在核心啟動後,如果使用printk("")這種方式列印不出,可以使用cat /proc/sys/kernel/printk看下printk的預設列印級別是不是 大於 控制台的列印級別,使用echo "8 4 1 7" > /proc/sys/kernel/printk修改就可以

如果發現使用了printk(""),在核心啟動過程中的列印出不來,然後核心啟動後檢視cat /proc/sys/kernel/printk,發現printk的預設列印級別也 大於 控制台的列印級別

但是啟動中的列印就是沒有,此時肯定是預設的printk的預設列印級別 小於 控制台的列印級別,只是在啟動後對printk的預設列印級別做了,常用的做法是在檔案系統的啟動指令碼中做了類似:

echo "8 4 1 7" > /proc/sys/kernel/printk這樣的修改,所以啟動後檢視cat /proc/sys/kernel/printk,printk的預設列印級別也 大於 控制台的列印級別。

這種情況,只要使用馬克 menuconfig看下核心預設的printk的列印級別,是否和啟動後的一致,如果不一致肯定是在啟動後被改了

對於乙個新系統如何使能printk?

如果使用cat /proc/sys/kernel/printk發現沒有printk節點,那一定是printk沒有被使能

printk的實現在/kernel/printk/print.c

其中export出來的介面printk並沒有什麼巨集的限制,檢視makefie:

obj-y 

=printk

.o

obj-$

(config_a11y_braille_console)+=

braille

.o

並沒有什麼巨集限制其編譯,即缺省會編譯

但在printk.c中發現printk的實現被巨集config_printk來限定,即如果不使能config_printk。則就沒有printk的實現。

所以我們找下config_printk的控制,這個控制一般在某個kconfig檔案中,在kconfig中以printk的形式出現(沒有config,config是指令碼加上去的)搜尋後發現在

symbol

:printk [=y

]

|type

:boolean

|prompt

:enable

support

forprintk

|location

:

|->

general

setup

|(

1)->

configure

standard kernel features

(expert users)(

expert [=y

])

|defined

at init

/kconfig

:1354

|selects

:irq_work [=y

]

所以我們去配置這個巨集:

general setup  --->   

-*- configure standard kernel features (expert users) --->

[*] enable support for printk

開啟這個開關後即可找到使能printk的實現。

如何設定printk的預設列印級別?

kernel hacking  ---> 

printk and dmesg options --->

(4) default message log level (1-7)

*************************====分割線*************************

如何開啟kernel的動態列印:

核心的動態列印,諸如pr_xx和dev_xx這些都是基於基本的printk()列印的封裝,所以要開啟動態列印,首先:

1.按照上述的方式使能printk(只使能,不需要關心printk的預設列印基本,即使用不帶flag的printk()這種方式)

2.配置kernel使其支援動態列印,如下配置

kernel hacking  --->  

printk and dmesg options --->

[*] enable dynamic printk() support

配置完以後就可以開心的使用pr_***或者dev_***這樣的列印了。

如果發現pr__的列印沒有出現,首先檢查:

1.控制台的列印級別是不是高於當前pr_xx的列印級別,如果是,調小控制台的列印級別

2.看下printk的核心配置有沒有使能(動態列印是基於基本的printk()列印的封裝)

CSS權重以及優先順序

權重的級別劃分包含了所有的css選擇器 如果兩個選擇器作用在同乙個元素上,則權重高者生效 權重的級別根據選擇器被分為四個分類 行內樣式,id,類和屬性,以及元素。當很多規則都被應用到某乙個元素上時,全中決定了那種規則生效。每個選擇器都有自己的權重。每個css規則,都包含了乙個權重級別。如果兩個選擇器...

Android學習 程序以及優先順序

1 android中的程序process 當乙個android應用啟動,系統會啟動乙個程序和乙個主線程來執行這個應用。android系統會盡力保持這個程序的穩定和安全。但是,在某些特殊情況下,總會移除舊的程序來 記憶體,用於新的或者重要的程序。當要 記憶體的時候,系統要決定那些程序應該保留,那些程序...

關於 和 優先順序以及使用

關鍵在於熟練掌握操作符的優先順序和 的使用方法 p p 1 此處 為間接訪問,p指向的位址內容 1後的值賦給p指向的位址 p 這裡 和 為同一優先順序,p先和 結合 右移p 是先使用p的值,後p的值 1 p 和 p p 1的區別是後者是p指向的位址的值 1,前者是p的位址 1,所有後者 即單獨的 p...