你為什么看不懂Linux內(nèi)核驅(qū)動(dòng)源碼?-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元納雍做網(wǎng)站,已為上家服務(wù),為納雍各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

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

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

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

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

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

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

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

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

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

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

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

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

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

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

嵌入式交流QQ群:475504428

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

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

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享標(biāo)題:你為什么看不懂Linux內(nèi)核驅(qū)動(dòng)源碼?-創(chuàng)新互聯(lián)
本文地址:http://bm7419.com/article26/hcdjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷自適應(yīng)網(wǎng)站、云服務(wù)器、品牌網(wǎng)站設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)企業(yè)建站

廣告

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