日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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


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

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

printk初接觸

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

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

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

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

/proc/kmsg

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

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

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

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

/dev/kmsg

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

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

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

printk使用

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

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

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

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

日志級別

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

格式化

下面內(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)核打印不支持浮點,%n也不支持,%e, %f, %g, %a也不支持,如使用了會導(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地址等等。如需要用到可查閱該文檔獲取更為詳細的信息。

修改控制臺打印級別

運行時修改

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

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

  • 當前控制臺日志級別
  • 默認日志級別
  • 最小日志級別
  • 啟動階段默認日志級別
使用下面命令可以當前控制臺printk日志級別:

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

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

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

編譯修改

如果你想將某一模塊的內(nèi)核打印在編譯時使能,這樣做的好處是在模塊加載過程中的所有的信息在控制臺都可以看到,你還可以增加你感興趣的代碼添加打印信息,用以輔助調(diào)試。這怎么實現(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其實就是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)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉