日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux 内核 printk 使用

發(fā)布時(shí)間:2025/4/14 linux 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 内核 printk 使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在linux 中,內(nèi)核打印語(yǔ)句 printk() 會(huì)將內(nèi)核信息輸出到內(nèi)核信息緩沖區(qū)中。內(nèi)核信息緩沖區(qū)是一個(gè)環(huán)形緩沖區(qū)(ring buffer),因此,如果插入的信息過(guò)多,就會(huì)將之前的信息沖刷掉。

printk() 定義了8個(gè)消息級(jí)別,分為級(jí)別0 ~ 7,級(jí)別越低(數(shù)值越大)的消息越不重要,第0級(jí)是緊急事件,

第7級(jí)是調(diào)試級(jí),在內(nèi)核中 include/linux/printk.h 中的定義如下:

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

0級(jí),代表緊急事件,一般是系統(tǒng)崩潰之前提示的消息
1級(jí),必須立即采取行動(dòng)
2級(jí),臨界狀態(tài),通常涉及嚴(yán)重的硬件或軟件操作失敗
3級(jí),用于報(bào)告錯(cuò)誤狀態(tài),設(shè)備驅(qū)動(dòng)程序會(huì)經(jīng)常使用KERN_ERR 報(bào)告來(lái)自硬件的問(wèn)題
4級(jí),對(duì)可能出現(xiàn)問(wèn)題的情況進(jìn)行警告,這類情況通常不會(huì)對(duì)系統(tǒng)造成嚴(yán)重問(wèn)題
5級(jí),有必要進(jìn)行提示的正常情況,許多與安全相關(guān)的狀況用這個(gè)級(jí)別進(jìn)行提示
6級(jí),內(nèi)核提示性信息,很多驅(qū)動(dòng)程序在啟動(dòng)的時(shí)候用這個(gè)級(jí)別打印出它們找到的硬件信息
7級(jí),用于調(diào)試信息

調(diào)試時(shí),通常使用封裝了 printk 的更高級(jí)的宏,其中可替代 printk 的宏如下:

#define pr_emerg(fmt, ...) \
? ? printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
#define pr_alert(fmt, ...) \
? ? printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)
#define pr_crit(fmt, ...) \
? ? printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
#define pr_err(fmt, ...) \
? ? printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
#define pr_warning(fmt, ...) \
? ? printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
#define pr_warn pr_warning
#define pr_notice(fmt, ...) \
? ? printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
#define pr_info(fmt, ...) \
? ? printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
#define pr_cont(fmt, ...) \
? ? printk(KERN_CONT fmt, ##__VA_ARGS__)

/* pr_devel() should produce zero code unless DEBUG is defined */
#ifdef DEBUG
#define pr_devel(fmt, ...) \
? ? printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#else
#define pr_devel(fmt, ...) \
? ? no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
#endif

在打印信息時(shí),如果要打印所出其所在函數(shù),可以使用 __FUNCTION__,

printk("%s: Incorrect IRQ %d from %s\n", __FUNCTION, irq, devname);

對(duì)于做Linux內(nèi)核開(kāi)發(fā)的人來(lái)說(shuō),printk實(shí)在是再熟悉不過(guò)了。內(nèi)核啟動(dòng)時(shí)顯示的各種信息大部分都是通過(guò)她來(lái)實(shí)現(xiàn)的,在做內(nèi)核驅(qū)動(dòng)調(diào)試的時(shí)候大部分 時(shí)候使用她就足矣。她之所以用得如此廣泛,一個(gè)是由于她使用方便,還有一個(gè)重要的原因是她的健壯性。它使用范圍很廣,幾乎是內(nèi)核的任何地方都能調(diào)用它。你既可以在中斷上下文、進(jìn)程上下中調(diào)用她,也可以在任何持有鎖時(shí)調(diào)用她,更可以在SMP系統(tǒng)中調(diào)用她,且調(diào)用時(shí)連鎖都不必使用。這樣好的適應(yīng)性來(lái)源于她的設(shè)計(jì),一個(gè)由三個(gè)指針控制的簡(jiǎn)單“ring buffer”。

注意上面說(shuō)到的是:“幾乎”在內(nèi)核的任何地方都可以使用。那什么地方使用會(huì)有“問(wèn)題”?那就是在系統(tǒng)啟動(dòng)過(guò)程的早期,終端初始化之前的某些地方雖然可以使用,但是在終端和控制臺(tái)被初始化之前所有信息都被緩存在printk的簡(jiǎn)單的ring buffer(環(huán)形緩沖區(qū))中,直到終端和控制臺(tái)被初始化之后,所有緩存信息都被一并輸出。

如果你要調(diào)試的是啟動(dòng)過(guò)程最開(kāi)始的部分(如setup_arch()),可以依靠此時(shí)能夠工作的硬件設(shè)備(如串口)與外界通信,使用printk()的變體early_printk()函數(shù)。她在啟動(dòng)過(guò)程初期就具有在終端上打印的能力,功能與prink()類似,區(qū)別在于:

(1)函數(shù)名
(2)能夠更早地工作(輸出信息)
(3)她有自己的小緩存(一般為512B)
(4)一次性輸出到硬件設(shè)備,不再以ring buffer的形式保留信息。
但該函數(shù)在一些構(gòu)架上無(wú)法實(shí)現(xiàn),所以這種辦法缺少可移植性。(大多數(shù)構(gòu)架都可以,包括x86和arm)。
所以,除非要在啟動(dòng)初期在終端上輸出,否則我們認(rèn)為printk()在任何情況下都能工作。這點(diǎn)從內(nèi)核的啟動(dòng)代碼中就可以看出,在已進(jìn)入start_kernel不久就通過(guò)printk打印內(nèi)核版本信息了。

總結(jié)

以上是生活随笔為你收集整理的linux 内核 printk 使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。