你為什么看不懂Linux內(nèi)核驅(qū)動源碼?

學(xué)習(xí)嵌入式Linux驅(qū)動開發(fā),最核心的技能就是能夠編寫Linux內(nèi)核驅(qū)動、深入理解Linux內(nèi)核。而做到這一步的基礎(chǔ),就是你要看得懂Linux內(nèi)核源碼,了解其基本的框架和具體實現(xiàn),了解其內(nèi)核API的使用方法,然后才能根據(jù)自己的需求寫出高質(zhì)量的內(nèi)核驅(qū)動程序。

創(chuàng)新互聯(lián)10多年成都企業(yè)網(wǎng)站定制服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及高端網(wǎng)站定制服務(wù),成都企業(yè)網(wǎng)站定制及推廣,對成都混凝土攪拌機(jī)等多個行業(yè)擁有多年的網(wǎng)站營銷經(jīng)驗的網(wǎng)站建設(shè)公司。

說易行難,很多新人、甚至工作1-2年的開發(fā)者剛接觸Linux內(nèi)核時,別說寫了,看內(nèi)核代碼可能都是一臉懵逼:明明是C語言,但是就是看不懂是什么意思,除了根據(jù)函數(shù)名、函數(shù)參數(shù)、函數(shù)的返回值以及注釋,了解整個函數(shù)的基本功能外,一旦分析其細(xì)節(jié),你會發(fā)現(xiàn),寸步難行,每一行代碼似乎都深不可測,仿佛蘊(yùn)含著極大的能量,于是你翻書、百度、Google,一步一步地向前推進(jìn)。

這是很多初學(xué)者常用的學(xué)習(xí)方法,包括我在內(nèi),剛接觸Linux內(nèi)核驅(qū)動時,看到很多似曾相識,但仔細(xì)推敲起來又很陌生的內(nèi)核代碼,內(nèi)心是崩潰的、心是虛的:乖乖,這是啥玩意,為什么看不懂,難道我智商有問題?就我一個人看不懂嗎?甚至工作后我曾請教過很多工作經(jīng)驗的同事,想請教一些關(guān)于閱讀內(nèi)核的經(jīng)驗和方法,你會發(fā)現(xiàn),他們很多其實對內(nèi)核也沒深入研究,除了自己負(fù)責(zé)的模塊比較熟悉外(寄存器配置,數(shù)據(jù)流程),對于其它的模塊也很少有時間和精力去關(guān)注,甚至關(guān)于本模塊的框架也很少關(guān)注,當(dāng)然,這大部分是精力和時間的關(guān)系,工作量的需求要求你快速通過各種API完成任務(wù)。甚至有同事會說,看Linux內(nèi)核就像隔霧看花,朦朧一點比較好,不能細(xì)看,越細(xì)看越不懂。

但是,要想編寫高質(zhì)量的程序,對Linux內(nèi)核、模塊的理解肯定要深入的,否則,你就永遠(yuǎn)停留在外圍,縫縫補(bǔ)補(bǔ)。根據(jù)我的各種學(xué)習(xí)經(jīng)歷和經(jīng)驗總結(jié),Linux內(nèi)核并不是堅不可摧、攻不可破,掌握了正確的學(xué)習(xí)方法和知識基礎(chǔ),我們也可以在內(nèi)核的代碼里遨游,領(lǐng)略Linux內(nèi)核中C語言的各種奇妙應(yīng)用和強(qiáng)大技巧,對Linux內(nèi)核各種復(fù)雜的框架、子系統(tǒng)也可以指點江山,胸有成竹。

那學(xué)習(xí)Linux驅(qū)動、分析Linux內(nèi)核源碼之前,到底需要哪些知識儲備和技能呢?

1)C語言基礎(chǔ)+數(shù)據(jù)結(jié)構(gòu)

Linux內(nèi)核,好不夸張地說,就是由各種結(jié)構(gòu)體、函數(shù)指針、鏈表、隊列堆徹而成的。所以在進(jìn)軍Linux內(nèi)核之前,你的C語言基礎(chǔ)一定要打牢固:什么函數(shù)指針、指針函數(shù)、數(shù)組指針、指針數(shù)組、以及各種指針作為函數(shù)參數(shù)、返回值等等都要搞清楚,因為Linux內(nèi)核中大量使用這些。這些都是基礎(chǔ),現(xiàn)在犯迷糊,看內(nèi)核更是暈。關(guān)于C指針進(jìn)階學(xué)習(xí),可以關(guān)注視頻教程:C語言嵌入式Linux高級編程

除此之外,數(shù)據(jù)結(jié)構(gòu)也是要掌握的,鏈表、隊列在Linux內(nèi)核中大量使用,所以必須要掌握。像其它的一些非線性數(shù)據(jù)結(jié)構(gòu):比如樹、二叉樹、紅黑樹等,對于做底層驅(qū)動的開發(fā)者來說,接觸得很少,可以先不學(xué),用到的時候再補(bǔ)也不遲。

2)C語言的語法擴(kuò)展

在閱讀Linux內(nèi)核代碼的過程中,你有沒有感覺到,有些代碼,看起來“怪怪的”,跟一般的C語言不太一樣?看起來是C語言,仔細(xì)一分析,發(fā)現(xiàn)又看不懂了。

這些你看起來“怪怪的C語言代碼”,其實都是GCC編譯器對標(biāo)準(zhǔn)C語言的擴(kuò)展語法:比如語句表達(dá)式、局部標(biāo)簽、__attribute__屬性聲明、可變參數(shù)宏等。這些GCC擴(kuò)展的語法,在Linux內(nèi)核、驅(qū)動源碼中,廣泛使用,尤其是涉及到底層啟動、編譯鏈接的一些設(shè)置。如果你不掌握這些擴(kuò)展的C語言語法的使用,在閱讀Linux內(nèi)核源碼、或驅(qū)動的過程中,可能就會遇到很多障礙,對我們理解代碼造成各種干擾。

所以在打算閱讀Linux源碼之前,建議先學(xué)習(xí)下GNU C對標(biāo)準(zhǔn)C的常用擴(kuò)展語法:王利濤的達(dá)人課或者視頻教程:C語言嵌入式Linux高級編程第5期:C標(biāo)準(zhǔn)及GNU C擴(kuò)展

學(xué)完了這個,掃除了閱讀Linux源碼的語法障礙,接下來可以選擇一個自己感興趣的小模塊:先把這個模塊留給用戶的API玩熟,學(xué)會編程,再慢慢研究其內(nèi)核內(nèi)部的實現(xiàn)。從底層到上層,打通任督二脈,再去分析內(nèi)核中,其它復(fù)雜的系統(tǒng),也就觸類旁通,比較容易上手了。

3)Linux內(nèi)核中的面向?qū)ο笏枷?/strong>

有了上面的基礎(chǔ),我們分析一個小的Linux內(nèi)核模塊,是沒有問題的。當(dāng)遇到一個大的復(fù)雜子系統(tǒng),比如說USB子系統(tǒng)、內(nèi)存管理、MTD、文件系統(tǒng)等,結(jié)構(gòu)體里面嵌套多層結(jié)構(gòu)體,各種device、bus、driver、各種層,是不是有點繞暈了?有種盲人摸象、在森林里迷路的感覺,把握不了“全局”。這時候,我們就不能使用C語言的面向過程思維了,Linux內(nèi)核的設(shè)計其實大量使用了面向?qū)ο笏枷搿R虼?,我們要學(xué)會用面向?qū)ο蟮乃季S去分析Linux內(nèi)核,分析各個模塊的復(fù)用,這樣就很方便的在腦海中搭建出系統(tǒng)的框架和層次了。然后再使用面向過程思維去分析具體的功能實現(xiàn)、具體細(xì)節(jié),多花點時間和精力,相信你會有不一樣的收獲的。關(guān)于Linux內(nèi)核常用的數(shù)據(jù)結(jié)構(gòu)和面向?qū)ο笏枷?,可以關(guān)注教程:C語言嵌入式Linux高級編程第7期:Linux內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)封裝

嵌入式交流QQ群:475504428

微信公眾號:宅學(xué)部落

你為什么看不懂Linux內(nèi)核驅(qū)動源碼?

新浪微博:@宅學(xué)部落

分享名稱:你為什么看不懂Linux內(nèi)核驅(qū)動源碼?
URL網(wǎng)址:http://muchs.cn/article40/jcjeeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、網(wǎng)站導(dǎo)航做網(wǎng)站、用戶體驗、外貿(mào)網(wǎng)站建設(shè)、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)