這裡有兩個方向的列印概念:
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...