當(dāng)前位置:首頁 > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀][導(dǎo)讀]剛剛開始做Linux相關(guān)開發(fā)工作時(shí),深感Linux內(nèi)核代碼龐大,要加些自己的驅(qū)動(dòng)進(jìn)內(nèi)核代碼樹,常常深陷bug的泥沼難以自拔,今天來分享一下內(nèi)核調(diào)試?yán)鱬rintk的使用心得。前面一段時(shí)間很忙,后期更文頻率會(huì)漸漸回歸正常頻率,盡量會(huì)保證每周一到兩更。感謝各位朋友的關(guān)注而沒有...


[導(dǎo)讀] 剛剛開始做Linux相關(guān)開發(fā)工作時(shí),深感Linux內(nèi)核代碼龐大,要加些自己的驅(qū)動(dòng)進(jìn)內(nèi)核代碼樹,常常深陷bug的泥沼難以自拔,今天來分享一下內(nèi)核調(diào)試利器printk的使用心得。

前面一段時(shí)間很忙,后期更文頻率會(huì)漸漸回歸正常頻率,盡量會(huì)保證每周一到兩更。感謝各位朋友的關(guān)注而沒有棄我而去,我定不負(fù)厚愛,會(huì)持續(xù)輸出些日常技術(shù)工作中的心得體會(huì),如對(duì)朋友們有些許幫助,也煩請(qǐng)幫忙點(diǎn)個(gè)贊或者在看(這并不會(huì)對(duì)各位有何不利的影響哈~~~),這也是對(duì)我堅(jiān)持持續(xù)輸出的大大激勵(lì)!

printk初接觸

Linux內(nèi)核啟動(dòng)之后常會(huì)看見很多信息打印出來,這在底層是printk子系統(tǒng)實(shí)現(xiàn)的,其實(shí)現(xiàn)代碼在./kernel/printk/中實(shí)現(xiàn)的。

一個(gè)小小的打印,對(duì)于內(nèi)核而言也需要考慮很多方面,需要考慮到多核、中斷、緩沖以及用戶空間接口。對(duì)于用戶空間接口很多朋友或許會(huì)很疑惑。

其中/dev/kmsg字符設(shè)備就是printk子系統(tǒng)實(shí)現(xiàn)的內(nèi)核打印字符設(shè)備。如果利用文件操作寫這個(gè)設(shè)備就最終會(huì)以printk形式輸出,如果讀這個(gè)設(shè)備最終就會(huì)返回printk歷史,你如不信不妨用這個(gè)命令試試:

cat?/dev/kmsg
看到這里或許有朋友會(huì)問,為啥有的文章提到用/proc/kmsg去讀取內(nèi)核打印緩沖區(qū)的日志用以調(diào)試。來分析一下:

/proc/kmsg

/proc/kmsg僅為root用戶提供內(nèi)核日志緩沖區(qū)的只讀操作。等效于通過SYSLOG_ACTION_READ操作調(diào)用[syslog(2)]。

一個(gè)進(jìn)程必須具有超級(jí)用戶特權(quán)才能讀取此文件,并且只有一個(gè)進(jìn)程應(yīng)讀取該文件。如果正在運(yùn)行使用syslog(2)系統(tǒng)調(diào)用記錄內(nèi)核消息的syslog進(jìn)程,則不應(yīng)讀取該文件。

這里補(bǔ)充說一點(diǎn)是,/proc文件系統(tǒng)本質(zhì)上是偽文件系統(tǒng),它提供了內(nèi)核數(shù)據(jù)結(jié)構(gòu)的接口。它一般掛載在/proc上。通常情況下,它是由系統(tǒng)自動(dòng)掛載的的,但是也可以使用以下命令手動(dòng)安裝:

?mount?-t?proc?proc?/proc
大部分位于/proc下的文件屬于只讀特性,但也有少部分是可寫的。但是對(duì)于/proc/kmsg而言則是只讀的。

/dev/kmsg

/dev/kmsg提供對(duì)同一內(nèi)核日志緩沖區(qū)的訪問,但以一種更易于使用的方式。每次打開都會(huì)對(duì)讀取進(jìn)行跟蹤,因此可以并行讀取多個(gè)進(jìn)程,并且在讀取條目時(shí)不會(huì)將其從緩沖區(qū)中刪除。/dev/kmsg還提供對(duì)日志緩沖區(qū)的寫訪問權(quán),因此可用于將條目添加到日志緩沖區(qū)。

那么為什么兩者都存在,以及為什么一個(gè)存在于/proc中和而另一個(gè)存在于/dev中,/proc/kmsg是歷史設(shè)計(jì),而/dev/kmsg是較新引入的,被設(shè)計(jì)為日志緩沖區(qū)的可用接口。該接口也實(shí)現(xiàn)了用戶空間添加記錄進(jìn)內(nèi)核日志系統(tǒng)的可能。

其代碼實(shí)現(xiàn)也可以簡(jiǎn)單來瞅瞅:

printk使用

printk怎么打印的呢?想必做嵌入式開發(fā)的一定熟悉printf函數(shù),那么從范式上printk也比較類似,但也有很多不同。且看:

內(nèi)核打印,界定了日志級(jí)別,其語法范式:

printk([KERN_LOG_LEVEL]?"Message:?%s\n",?arg);
比如:

printk(KERN_DEBUG?“Here?is:?%s:%i\n”,?__FILE__,?__LINE__);
那么有哪些日志級(jí)別,又各有何區(qū)別呢?

日志級(jí)別

級(jí)別宏名描述
0KERN_EMERG最高級(jí)別,系統(tǒng)遇到緊急狀況,嚴(yán)重時(shí)可能掛機(jī)了
1KERN_ALERT告警級(jí)別,需要立即關(guān)注或處置
2KERN_CRITcritical 情況,比較緊急
3KERN_ERR當(dāng)系統(tǒng)檢測(cè)到某個(gè)錯(cuò)誤
4KERN_WARNINGwarning中文也會(huì)翻譯成警告,但是緊急程度級(jí)別比Alert低,
5KERN_NOTICE正常操作但或許需要注意的一些操作
6KERN_INFO信息提示級(jí)別,比如驅(qū)動(dòng)指示一下做了什么操作
7KERN_DEBUG調(diào)試信息
對(duì)于這個(gè)表,或許剛使用時(shí)會(huì)不知所措,這么多級(jí)別到底該傳入什么級(jí)別呢?我的理解如果是自己定義的驅(qū)動(dòng)按照字面意思理解,靈活使用即可。唯一需要注意的時(shí)候,不同的級(jí)別打印或許在控制臺(tái)會(huì)有不同的體現(xiàn),這取決于控制臺(tái)打印的配置。

格式化

下面內(nèi)容來源于./Documentation/printk-formats.txt,整理于此方便使用:

  • 基本變量
類型格式化
int%d 或 %x
unsigned int%u 或 %x
long%ld 或 %lx
unsigned long%lu 或 %lx
long long%lld 或 %llx
unsigned long long%llu 或 %llx
size_t%zu 或 %zx
ssize_t%zd 或 %zx
s32%d 或 %x
u32%u 或 %x
s64%lld 或 %llx
u64%llu 或 %llx
注意:內(nèi)核打印不支持浮點(diǎn),%n也不支持,%e, %f, %g, %a也不支持,如使用了會(huì)導(dǎo)致WARN。

  • 指針
類型格式化
%p打印基本指針
%pFversatile_init 0x0/0x110
%pfversatile_init
%pSversatile_init 0x0/0x110
%pSRversatile_init 0x9/0x110
%psversatile_init
%pBprev_fn_of_versatile_init 0x88/0x88
除上面描述的這些格式化,printk還支持格式化打印塊設(shè)備名、IPv4、IPv6地址、網(wǎng)絡(luò)設(shè)備屬性、MAC/FDDI地址、UUID/GUID地址等等。如需要用到可查閱該文檔獲取更為詳細(xì)的信息。

修改控制臺(tái)打印級(jí)別

運(yùn)行時(shí)修改

在調(diào)試過程中,或許會(huì)發(fā)現(xiàn)有的printk信息沒有打印出來,那么肯定是默認(rèn)運(yùn)行中內(nèi)核控制臺(tái)printk打印級(jí)別低于代碼中使用的級(jí)別,那么如果不想重新編譯內(nèi)核,有沒有辦法動(dòng)態(tài)修改呢?來看看怎么修改:

在/proc/sys/kernel/printk文件中,有4個(gè)屬性分別對(duì)應(yīng):

  • 當(dāng)前控制臺(tái)日志級(jí)別
  • 默認(rèn)日志級(jí)別
  • 最小日志級(jí)別
  • 啟動(dòng)階段默認(rèn)日志級(jí)別
使用下面命令可以當(dāng)前控制臺(tái)printk日志級(jí)別:

echo?6?>?/proc/sys/kernel/printk
這里傳入6,表示小于6級(jí)別的打印都將會(huì)被打印出來。這里可以根據(jù)需要傳入不同的值。取值參見前表<日志級(jí)別>。如想將所有的信息都打印出來,傳入8即可,如:

echo?8?>?/proc/sys/kernel/printk
如果你想將這些打印記錄進(jìn)一個(gè)文件,則可以使用klogd進(jìn)行重定向,比如:

klogd?-o?-f?./kernel.msg

編譯修改

如果你想將某一模塊的內(nèi)核打印在編譯時(shí)使能,這樣做的好處是在模塊加載過程中的所有的信息在控制臺(tái)都可以看到,你還可以增加你感興趣的代碼添加打印信息,用以輔助調(diào)試。這怎么實(shí)現(xiàn)呢?

這里需要去看看你的內(nèi)核模塊代碼是以何種方式去調(diào)用printk的,比如有的代碼這樣調(diào)用:

static?int?tea5764_i2c_probe(struct?i2c_client?*client,
????????const?struct?i2c_device_id?*id)

{
?struct?tea5764_device?*radio;
?struct?v4l2_device?*v4l2_dev;
?struct?v4l2_ctrl_handler?*hdl;
?struct?tea5764_regs?*r;
?int?ret;

?PDEBUG("probe");
?.....
這里的PDEBUG其實(shí)就是printk的一種宏重包裝:

#define?PINFO(format,?...)\
?printk(KERN_INFO?KBUILD_MODNAME?":?"\
??DRIVER_VERSION?":?"?format?"\n",?##?__VA_ARGS__)

#define?PWARN(format,?...)\
?printk(KERN_WARNING?KBUILD_MODNAME?":?"\
??DRIVER_VERSION?":?"?format?"\n",?##?__VA_ARGS__)

#?define?PDEBUG(format,?...)\
?printk(KERN_DEBUG?KBUILD_MODNAME?":?"\
??DRIVER_VERSION?":?"?format?"\n",?##?__VA_ARGS__)

還有的是這樣:

static?int?ad9467_spi_read(struct?spi_device?*spi,?unsigned?reg)
{
?unsigned?char?buf[3];
?int?ret;

?if?(spi)?{
??buf[0]?=?0x80?|?(reg?>>?8);
??buf[1]?=?reg?
嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉