當(dāng)前位置:首頁 > 公眾號精選 > Linux閱碼場
[導(dǎo)讀]因?yàn)閳D片比較大,微信公眾號上壓縮的比較厲害,所以很多細(xì)節(jié)都看不清了,我單獨(dú)傳了一份到github上,想要原版圖片的,可以點(diǎn)擊下方的閱讀原文,或者直接使用下面的鏈接,來訪問github:https://github.com/wangyuntao/linux-kernel-illus...


因?yàn)閳D片比較大,微信公眾號上壓縮的比較厲害,所以很多細(xì)節(jié)都看不清了,我單獨(dú)傳了一份到github上,想要原版圖片的,可以點(diǎn)擊下方的閱讀原文,或者直接使用下面的鏈接,來訪問github:


https://github.com/wangyuntao/linux-kernel-illustrated


另外,精致全景圖系列文章,以及之后的linux內(nèi)核分析文章,我都會整理到這個(gè)github倉庫里,歡迎大家star收藏。



熟悉linux內(nèi)核,或者看過linux內(nèi)核源碼的同學(xué)就會知道,在內(nèi)核中,有一個(gè)類似于c語言的輸出函數(shù),叫做printk,使用它,我們可以打印各種我們想要的信息,比如內(nèi)核當(dāng)前的運(yùn)行狀態(tài),又或者是我們自己的調(diào)試日志等,非常方便。


那當(dāng)我們調(diào)用printk函數(shù)后,這些輸出的信息到哪里去了呢?我們又如何在linux下的用戶態(tài),查看這些信息呢?


為了解答這些疑問,我畫了一張printk全景圖,放在了文章開始的部分,這張圖既包含了printk在內(nèi)核態(tài)的實(shí)現(xiàn),又包含了其輸出的信息在用戶態(tài)如何查看。


我們可以根據(jù)這張圖,來理解printk的整體架構(gòu)。


在內(nèi)核編碼時(shí),如果想要輸出一些信息,通常并不會直接使用printk,而是會使用其衍生函數(shù),比如 pr_err / pr_info / pr_debug 等,這些衍生函數(shù)附帶了日志級別、所屬模塊等其他信息,比較友好,但其最終還是調(diào)用了printk。


printk函數(shù)會將每次輸出的日志,放到內(nèi)核為其專門分配的名為ring buffer的一個(gè)槽位里。


ring buffer其實(shí)就是一個(gè)用數(shù)組實(shí)現(xiàn)的環(huán)形隊(duì)列,不過既然是環(huán)形隊(duì)列,就會有一個(gè)問題,即當(dāng)ring buffer滿了的時(shí)候,下一條新的日志,會覆蓋最開始的舊的日志。


ring buffer的大小,可以通過內(nèi)核參數(shù)來修改。


printk在將日志放到ring buffer后,會再調(diào)用系統(tǒng)console的相關(guān)方法,將還未輸出到系統(tǒng)控制臺的消息,繼續(xù)輸出到控制臺,這個(gè)后面會詳細(xì)說,這里就暫不贅述。


以上就是printk在內(nèi)核態(tài)的實(shí)現(xiàn)。


在用戶態(tài),我們有幾個(gè)方式,可以查看printk輸出的內(nèi)核日志,比如使用dmesg命令,cat /proc/kmsg文件,或者是使用klogctl函數(shù)等,這些方式分別對應(yīng)于全景圖中用戶態(tài)的橙色、綠色、和藍(lán)色的部分。


dmesg命令,在默認(rèn)情況下,是通過讀取/dev/kmsg文件,來實(shí)現(xiàn)查看內(nèi)核日志的。


當(dāng)該命令運(yùn)行時(shí),dmesg會先調(diào)用open函數(shù),打開/dev/kmsg文件,該打開操作在內(nèi)核中的邏輯,會為dmesg分配一個(gè)file實(shí)例,在這個(gè)file實(shí)例里,會有一個(gè)seq變量,該變量記錄著下一條要讀取的內(nèi)核日志在ring buffer中的位置。


剛打開/dev/kmsg文件時(shí),這個(gè)seq指向的就是ring buffer中最開始的那條日志。


之后,dmesg會以打開的/dev/kmsg文件為媒介,不斷的調(diào)用read函數(shù),從內(nèi)核中讀取日志消息,每讀取出一條,seq的值都會加一,即指向下一條日志的位置,依次往復(fù),直到所有的內(nèi)核日志讀取完畢,dmesg退出。


以上就是dmesg的主體實(shí)現(xiàn)。


第二種查看內(nèi)核日志的方式,是通過 cat /proc/kmsg 命令。


該命令和dmesg命令的實(shí)現(xiàn)機(jī)制基本類似,都是通過讀文件,只不過cat讀取的是/proc/kmsg文件,而dmesg讀取的是/dev/kmsg文件。


讀取這兩個(gè)文件最大的區(qū)別是,/dev/kmsg文件每次打開時(shí),內(nèi)核都會為其分配一個(gè)單獨(dú)的seq變量,而/proc/kmsg文件每次打開時(shí),用的都是同一個(gè)全局的靜態(tài)seq變量,叫做syslog_seq。


syslog_seq指向的也是下一條要讀取的內(nèi)核日志在ring buffer中的位置,但因?yàn)樗且粋€(gè)全局的靜態(tài)變量,當(dāng)有多個(gè)進(jìn)程要讀取/proc/kmsg文件時(shí),就會有一個(gè)比較嚴(yán)重的問題,即內(nèi)核日志會被這幾個(gè)進(jìn)程隨機(jī)搶占讀取,也就是說,每個(gè)進(jìn)程讀到的都是整個(gè)內(nèi)核日志的一部分,是不完整的,這也是dmesg命令默認(rèn)不使用/proc/kmsg文件的原因。


第三種查看內(nèi)核日志的方式,是通過klogctl函數(shù)。


該函數(shù)是glibc對syslog系統(tǒng)調(diào)用的一個(gè)簡單封裝,其具體使用方式,可以參考全景圖中用戶態(tài)的藍(lán)色部分。


klogctl函數(shù)可以指定很多命令,在上圖的示例中,我們使用的是SYSLOG_ACTION_READ命令,以此來模擬 cat /proc/kmsg 行為。


其實(shí)在內(nèi)核層面,cat /proc/kmsg命令,使用的就是klogctl對應(yīng)的syslog系統(tǒng)調(diào)用的SYSLOG_ACTION_READ命令的處理邏輯,所以示例中的klogctl函數(shù)相關(guān)代碼,和 cat /proc/kmsg 命令其實(shí)是等價(jià)的。


也就是說,klogctl函數(shù)在內(nèi)核里使用的也是syslog_seq變量,它也有和/proc/kmsg文件同樣的問題。


其實(shí)還有一種方式可以查看內(nèi)核日志,就是通過系統(tǒng)控制臺。


但這種方式和前面講的三種方式都不一樣,它是完全被動(dòng)的,是內(nèi)核在調(diào)用printk函數(shù),將日志信息放到ring buffer后,再去通知系統(tǒng)控制臺,告知其可以輸出這些日志。


系統(tǒng)控制臺也是通過一個(gè)console_seq變量,記錄下一條要輸出內(nèi)核日志的所在位置。


這里說的系統(tǒng)控制臺,是指我們在開機(jī)的時(shí)候,黑色屏幕輸出的那些內(nèi)容,但當(dāng)我們進(jìn)入圖形化界面后,我們就看不到系統(tǒng)控制臺的輸出了,除非我們再用 ctrl alt f1/f2/f3 等方式,切換成系統(tǒng)控制臺。


系統(tǒng)控制臺輸出的內(nèi)容,是被日志級別過濾過的,內(nèi)核默認(rèn)的日志過濾級別是7,即debug級別以上的日志,比如info / err 等,這些都會輸出,但debug級別不會輸出。


該日志過濾級別,可以通過很多方式改變,比如說,可以通過內(nèi)核參數(shù) loglevel,所以,如果發(fā)現(xiàn)系統(tǒng)控制臺沒有輸出想要的日志信息,先看下其是否被過濾掉了。


以上就是printk生態(tài)的完整實(shí)現(xiàn)。


了解printk函數(shù)的實(shí)現(xiàn),對于內(nèi)核開發(fā)者或研究者來說,意義非常大,但對于普通的應(yīng)用開發(fā)人員來說,又有什么幫助呢?


其實(shí),隨著技術(shù)的深入,我們不應(yīng)該再只關(guān)心應(yīng)用層面的行為,而且還要關(guān)心系統(tǒng)層面的行為,這樣我們才能更好的去定位問題,更好的去保證我們應(yīng)用的健康運(yùn)行。


比如,當(dāng)我們的應(yīng)用需要內(nèi)存時(shí),會向操作系統(tǒng)申請,操作系統(tǒng)此時(shí)給我們的,其實(shí)是虛擬內(nèi)存,只有當(dāng)我們的進(jìn)程真正的在使用這些內(nèi)存時(shí),比如讀/寫,操作系統(tǒng)才會為其分配物理內(nèi)存。


但假設(shè)此時(shí)物理內(nèi)存沒有了,那操作系統(tǒng)會怎么辦?


對于linux內(nèi)核來說,它會選擇一個(gè)使用內(nèi)存最多的進(jìn)程,然后將其kill掉,以此來釋放內(nèi)存,保證后續(xù)的內(nèi)存分配操作能夠成功,這個(gè)我在之前文章?為什么我的進(jìn)程被kill掉了?有詳細(xì)講過。


對于內(nèi)核的這種行為,我們就應(yīng)該多加關(guān)注,而關(guān)注的方式,就是查看內(nèi)核日志。


比如,linux內(nèi)核在kill掉進(jìn)程時(shí),會用pr_err記錄一行日志:



如果我們發(fā)現(xiàn)一個(gè)進(jìn)程跑著跑著就沒有了,就可以通過dmesg命令,查看是否有這個(gè)日志,如果有,說明該進(jìn)程因?yàn)橄到y(tǒng)內(nèi)存不足,被操作系統(tǒng)kill掉了。


類似的,內(nèi)核里還有很多error級別,甚至更高級別的日志需要我們關(guān)注,通過這些日志,我們可以及時(shí)的發(fā)現(xiàn)系統(tǒng)的異常情況,必要時(shí)可以人工介入進(jìn)行干預(yù)。


總之,對系統(tǒng)了解的越深,內(nèi)核日志對我們的幫助就越大。


就這些,希望你喜歡。

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

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(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)易近期正在縮減他們對日本游戲市場的投資。

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

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

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

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

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

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

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

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

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

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

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