當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 技術(shù)讓夢(mèng)想更偉大
[導(dǎo)讀]關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容來(lái)源|智傳網(wǎng)優(yōu)云課堂01前言本文主要講解什么是Linux內(nèi)核,以及通過(guò)多張圖片展示Linux內(nèi)核的作用與功能,以便于讀者能快速理解什么是Linux內(nèi)核,能看懂Linux內(nèi)核。擁有超過(guò)1300萬(wàn)行的代碼,Linux內(nèi)核是世界上最大的開(kāi)源項(xiàng)目之一,但是內(nèi)...

關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

來(lái)源 | 智傳網(wǎng)優(yōu)云課堂



01

前言


本文主要講解什么是Linux內(nèi)核,以及通過(guò)多張圖片展示Linux內(nèi)核的作用與功能,以便于讀者能快速理解什么是Linux內(nèi)核,能看懂Linux內(nèi)核。


擁有超過(guò)1300萬(wàn)行的代碼,Linux內(nèi)核是世界上最大的開(kāi)源項(xiàng)目之一,但是內(nèi)核是什么,它用于什么?




02

什么是內(nèi)核


內(nèi)核是與計(jì)算機(jī)硬件接口的易替換軟件的最低級(jí)別。它負(fù)責(zé)將所有以“用戶模式”運(yùn)行的應(yīng)用程序連接到物理硬件,并允許稱為服務(wù)器的進(jìn)程使用進(jìn)程間通信(IPC)彼此獲取信息。



03

內(nèi)核還要分種類?


是的,沒(méi)錯(cuò)。


3.1 微內(nèi)核


微內(nèi)核只管理它必須管理的東西:CPU、內(nèi)存和IPC。計(jì)算機(jī)中幾乎所有的東西都可以被看作是一個(gè)附件,并且可以在用戶模式下處理。微內(nèi)核具有可移植性的優(yōu)勢(shì),因?yàn)橹灰僮飨到y(tǒng)仍然試圖以相同的方式訪問(wèn)硬件,就不必?fù)?dān)心您是否更改了視頻卡,甚至是操作系統(tǒng)。微內(nèi)核對(duì)內(nèi)存和安裝空間的占用也非常小,而且它們往往更安全,因?yàn)橹挥刑囟ǖ倪M(jìn)程在用戶模式下運(yùn)行,而用戶模式不具有管理員模式的高權(quán)限。

3.1.1 Pros

  • 可移植性
  • 安裝占用空間小
  • 小內(nèi)存占用
  • 安全

3.1.2 Cons

  • 通過(guò)驅(qū)動(dòng)程序,硬件更加抽象
  • 硬件可能反應(yīng)較慢,因?yàn)轵?qū)動(dòng)程序處于用戶模式
  • 進(jìn)程必須在隊(duì)列中等待才能獲得信息
  • 進(jìn)程不能在不等待的情況下訪問(wèn)其他進(jìn)程


3.2 單內(nèi)核


單內(nèi)核與微內(nèi)核相反,因?yàn)樗鼈儾粌H包含CPU、內(nèi)存和IPC,而且還包含設(shè)備驅(qū)動(dòng)程序、文件系統(tǒng)管理和系統(tǒng)服務(wù)器調(diào)用等內(nèi)容。單內(nèi)核更擅長(zhǎng)于訪問(wèn)硬件和多任務(wù)處理,因?yàn)槿绻粋€(gè)程序需要從內(nèi)存或運(yùn)行中的其他進(jìn)程中獲取信息,那么它就有一條更直接的線路來(lái)訪問(wèn)信息,而不需要在隊(duì)列中等待來(lái)完成任務(wù)。但是,這可能會(huì)導(dǎo)致問(wèn)題,因?yàn)樵诠芾砟J较逻\(yùn)行的東西越多,如果行為不正常,就會(huì)有越多的東西導(dǎo)致系統(tǒng)崩潰。

3.2.1 Pros


  • 更直接地訪問(wèn)程序的硬件
  • 流程之間更容易通信
  • 如果支持您的設(shè)備,它應(yīng)該不需要額外安裝就可以工作
  • 進(jìn)程反應(yīng)更快,因?yàn)闆](méi)有等待處理器時(shí)間的隊(duì)列


3.2.2 Cons


  • 較大安裝體積
  • 較大內(nèi)存占用
  • 不太安全,因?yàn)樗胁僮鞫荚诠芾砟J较逻\(yùn)行



04

混合的內(nèi)核


混合內(nèi)核能夠選擇在用戶模式下運(yùn)行什么,以及在管理模式下運(yùn)行什么。通常情況下,設(shè)備驅(qū)動(dòng)程序和文件系統(tǒng)I/O將在用戶模式下運(yùn)行,而IPC和服務(wù)器調(diào)用將保持在管理器模式下。這是兩全其美,但通常需要硬件制造商做更多的工作,因?yàn)樗序?qū)動(dòng)程序的責(zé)任都由他們來(lái)承擔(dān)。它還可能存在一些與微內(nèi)核固有的延遲問(wèn)題。



4.1 Pros


  • 開(kāi)發(fā)人員可以選擇什么在用戶模式下運(yùn)行,什么在管理模式下運(yùn)行
  • 比單片內(nèi)核更小的安裝占用空間
  • 比其他型號(hào)更靈活


4.2 Cons


  • 會(huì)遭受與微內(nèi)核相同的進(jìn)程延遲
  • 設(shè)備驅(qū)動(dòng)程序需要由用戶管理(通常)


05

Linux內(nèi)核文件在哪里


Ubuntu中的內(nèi)核文件存儲(chǔ)在/boot文件夾中,稱為vmlinux -version。vmlinuz這個(gè)名字來(lái)自于unix世界,早在60年代,他們就把內(nèi)核簡(jiǎn)單地稱為“unix”,所以當(dāng)內(nèi)核在90年代首次開(kāi)發(fā)時(shí),Linux就開(kāi)始把內(nèi)核稱為“Linux”。


當(dāng)開(kāi)發(fā)虛擬內(nèi)存以便更容易地進(jìn)行多任務(wù)處理時(shí),將“vm”放在文件的前面,以顯示內(nèi)核支持虛擬內(nèi)存。有一段時(shí)間,Linux內(nèi)核被稱為vmlinux,但是內(nèi)核變得太大,無(wú)法裝入可用的引導(dǎo)內(nèi)存,因此壓縮了內(nèi)核映像,并將末尾的x更改為z,以顯示它是用zlib壓縮的。并不總是使用相同的壓縮,通常用LZMA或BZIP2替換,一些內(nèi)核簡(jiǎn)單地稱為zImage。


版本號(hào)將采用A.B.C.格式D在。B可能是2.6,C是您的版本,D表示您的補(bǔ)丁或補(bǔ)丁。



在/boot文件夾中還有其他非常重要的文件,稱為initrd.img-version、system.map-version, config-version。initrd文件用作一個(gè)小RAM磁盤,用于提取和執(zhí)行實(shí)際的內(nèi)核文件。這個(gè)系統(tǒng)。map文件用于內(nèi)核完全加載之前的內(nèi)存管理,配置文件告訴內(nèi)核在編譯內(nèi)核映像時(shí)要加載哪些選項(xiàng)和模塊。
06

Linux內(nèi)核體系結(jié)構(gòu)


因?yàn)長(zhǎng)inux內(nèi)核是單片的,所以它比其他類型的內(nèi)核占用空間最大,復(fù)雜度也最高。這是一個(gè)設(shè)計(jì)特性,在Linux早期引起了相當(dāng)多的爭(zhēng)論,并且仍然帶有一些與單內(nèi)核固有的相同的設(shè)計(jì)缺陷。


為了解決這些缺陷,Linux內(nèi)核開(kāi)發(fā)人員所做的一件事就是使內(nèi)核模塊可以在運(yùn)行時(shí)加載和卸載,這意味著您可以動(dòng)態(tài)地添加或刪除內(nèi)核的特性。這不僅可以向內(nèi)核添加硬件功能,還可以包括運(yùn)行服務(wù)器進(jìn)程的模塊,比如低級(jí)別虛擬化,但也可以替換整個(gè)內(nèi)核,而不需要在某些情況下重啟計(jì)算機(jī)。

想象一下,如果您可以升級(jí)到Windows服務(wù)包,而不需要重新啟動(dòng)……

07

內(nèi)核模塊


如果Windows已經(jīng)安裝了所有可用的驅(qū)動(dòng)程序,而您只需要打開(kāi)所需的驅(qū)動(dòng)程序怎么辦?這本質(zhì)上就是內(nèi)核模塊為L(zhǎng)inux所做的。內(nèi)核模塊,也稱為可加載內(nèi)核模塊(LKM),對(duì)于保持內(nèi)核在不消耗所有可用內(nèi)存的情況下與所有硬件一起工作是必不可少的。

模塊通常向基本內(nèi)核添加設(shè)備、文件系統(tǒng)和系統(tǒng)調(diào)用等功能。lkm的文件擴(kuò)展名是.ko,通常存儲(chǔ)在/lib/modules目錄中。由于模塊的特性,您可以通過(guò)在啟動(dòng)時(shí)使用menuconfig命令將模塊設(shè)置為load或not load,或者通過(guò)編輯/boot/config文件,或者使用modprobe命令動(dòng)態(tài)地加載和卸載模塊,輕松定制內(nèi)核。


第三方和封閉源碼模塊在一些發(fā)行版中是可用的,比如Ubuntu,默認(rèn)情況下可能無(wú)法安裝,因?yàn)檫@些模塊的源代碼是不可用的。該軟件的開(kāi)發(fā)人員(即nVidia、ATI等)不提供源代碼,而是構(gòu)建自己的模塊并編譯所需的.ko文件以便分發(fā)。雖然這些模塊像beer一樣是免費(fèi)的,但它們不像speech那樣是免費(fèi)的,因此不包括在一些發(fā)行版中,因?yàn)榫S護(hù)人員認(rèn)為它通過(guò)提供非免費(fèi)軟件“污染”了內(nèi)核。

內(nèi)核并不神奇,但對(duì)于任何正常運(yùn)行的計(jì)算機(jī)來(lái)說(shuō),它都是必不可少的。Linux內(nèi)核不同于OS X和Windows,因?yàn)樗瑑?nèi)核級(jí)別的驅(qū)動(dòng)程序,并使許多東西“開(kāi)箱即用”。希望您能對(duì)軟件和硬件如何協(xié)同工作以及啟動(dòng)計(jì)算機(jī)所需的文件有更多的了解。


08

Linux 內(nèi)核學(xué)習(xí)經(jīng)驗(yàn)總結(jié)


開(kāi)篇

學(xué)習(xí)內(nèi)核,每個(gè)人都有自己的學(xué)習(xí)方法,仁者見(jiàn)仁智者見(jiàn)智。以下是我在學(xué)習(xí)過(guò)程中總結(jié)出來(lái)的東西,對(duì)自身來(lái)說(shuō),我認(rèn)為比較有效率,拿出來(lái)跟大家交流一下。

內(nèi)核學(xué)習(xí),一偏之見(jiàn);疏漏難免,懇請(qǐng)指正。


為什么寫這篇博客
剛開(kāi)始學(xué)內(nèi)核的時(shí)候,不要執(zhí)著于一個(gè)方面,不要專注于一個(gè)子系統(tǒng)就一頭扎到實(shí)際的代碼行中去,因?yàn)檫@樣的話,牽涉的面會(huì)很廣,會(huì)碰到很多困難,容易產(chǎn)生挫敗感,一個(gè)函數(shù)體中(假設(shè)剛開(kāi)始的時(shí)候正在學(xué)習(xí)某個(gè)方面的某個(gè)具體的功能函數(shù))很可能摻雜著其他各個(gè)子系統(tǒng)方面設(shè)計(jì)理念(多是大量相關(guān)的數(shù)據(jù)結(jié)構(gòu)或者全局變量,用于支撐該子系統(tǒng)的管理工作)下相應(yīng)的代碼實(shí)現(xiàn),這個(gè)時(shí)候看到這些東西,紛繁蕪雜,是沒(méi)有頭緒而且很不理解的,會(huì)產(chǎn)生很多很多的疑問(wèn),(這個(gè)時(shí)候如果對(duì)這些疑問(wèn)糾纏不清,刨根問(wèn)底,那么事實(shí)上就是在學(xué)習(xí)當(dāng)前子系統(tǒng)的過(guò)程中頻繁的去涉足其他子系統(tǒng),這時(shí)候注意力就分散了),而事實(shí)上等了解了各個(gè)子系統(tǒng)后再回頭看這些東西的話,就簡(jiǎn)單多了,而且思路也會(huì)比較清晰。所以,要避免 “只見(jiàn)樹(shù)木,不見(jiàn)森林”,不要急于深入到底層代碼中去,不要過(guò)早研究底層代碼。

我在大二的時(shí)候剛開(kāi)始接觸內(nèi)核,就犯了這個(gè)錯(cuò)誤,一頭扎到內(nèi)存管理里頭,去看非常底層的實(shí)現(xiàn)代碼,雖然也是建立在內(nèi)存管理的設(shè)計(jì)思想的基礎(chǔ)上,但是相對(duì)來(lái)說(shuō),比較孤立,因?yàn)榇藭r(shí)并沒(méi)有學(xué)習(xí)其它子系統(tǒng),應(yīng)該說(shuō)無(wú)論是視野還是思想,都比較狹隘,所以代碼中牽涉到的其它子系統(tǒng)的實(shí)現(xiàn)我都直接跳過(guò)了,這一點(diǎn)還算聰明,當(dāng)然也是迫不得已的。

我的學(xué)習(xí)方法
剛開(kāi)始,我認(rèn)為主要的問(wèn)題在于你知道不知道,而不是理解不理解,某個(gè)子系統(tǒng)的實(shí)現(xiàn)采用了某種策略、方法,而你在學(xué)習(xí)中需要做的就是知道有這么一回事兒,然后才是理解所描述的策略或者方法。


根據(jù)自己的學(xué)習(xí)經(jīng)驗(yàn),剛開(kāi)始學(xué)習(xí)內(nèi)核的時(shí)候,我認(rèn)為要做的是在自己的腦海中建立起內(nèi)核的大體框架,理解各個(gè)子系統(tǒng)的設(shè)計(jì)理念和構(gòu)建思想,這些理念和思想會(huì)從宏觀上呈獻(xiàn)給你清晰的脈絡(luò),就像一個(gè)去除了枝枝葉葉的大樹(shù)的主干,一目了然;當(dāng)然,肯定還會(huì)涉及到具體的實(shí)現(xiàn)方法、函數(shù),但是此時(shí)接觸到的函數(shù)或者方法位于內(nèi)核實(shí)現(xiàn)的較高的層次,是主(要)函數(shù),已經(jīng)了解到這些函數(shù),針對(duì)的是哪些設(shè)計(jì)思想,實(shí)現(xiàn)了什么樣的功能,達(dá)成了什么樣的目的,混個(gè)臉熟的說(shuō)法在這兒也是成立的。至于該主函數(shù)所調(diào)用的其它的輔助性函數(shù)就等同于枝枝葉葉了,不必太早就去深究。此時(shí),也就初步建立起了內(nèi)核子系統(tǒng)框架和代碼實(shí)現(xiàn)之間的關(guān)聯(lián),關(guān)聯(lián)其實(shí)很簡(jiǎn)單,比如一看到某個(gè)函數(shù)名字,就想起這個(gè)函數(shù)是針對(duì)哪個(gè)子系統(tǒng)的,實(shí)現(xiàn)了什么功能。

我認(rèn)為此時(shí)要看的就是LKD3,這本書算是泛泛而談,主要就是從概念,設(shè)計(jì),大的實(shí)現(xiàn)方法上描述各個(gè)子系統(tǒng),而對(duì)于具體的相關(guān)的函數(shù)實(shí)現(xiàn)的代碼講解很少涉及(對(duì)比于ULK3,此書主要就是關(guān)于具體函數(shù)代碼的具體實(shí)現(xiàn)的深入分析,當(dāng)然,你也可以看,但是過(guò)早看這本書,會(huì)感覺(jué)很痛苦,很枯燥無(wú)味,基本上都是函數(shù)的實(shí)現(xiàn)),很少,但不是沒(méi)有,這就很好,滿足我們當(dāng)前的需求,還避免我們過(guò)早深入到實(shí)際的代碼中去。而且本書在一些重要的點(diǎn)上還給出了寫程序時(shí)的注意事項(xiàng),算是指導(dǎo)性建議。主要的子系統(tǒng)包括:內(nèi)存管理,進(jìn)程管理和調(diào)度,系統(tǒng)調(diào)用,中斷和異常,內(nèi)核同步,時(shí)間和定時(shí)器管理,虛擬文件系統(tǒng),塊I/O層,設(shè)備和模塊。(這里的先后順序其實(shí)就是LKD3的目錄的順序)。

我學(xué)習(xí)的時(shí)候是三本書交叉著看的,先看LKD3,專于一個(gè)子系統(tǒng),主要就是了解設(shè)計(jì)的原理和思想,當(dāng)然也會(huì)碰到對(duì)一些主要函數(shù)的介紹,但大多就是該函數(shù)基于前面介紹的思想和原理完成了什么樣的功能,該書并沒(méi)有就函數(shù)本身的實(shí)現(xiàn)進(jìn)行深入剖析。然后再看ULK3和PLKA上看同樣的子系統(tǒng),但是并不仔細(xì)分析底層具體函數(shù)的代碼,只是粗略地、不求甚解地看,甚至不看。因?yàn)?,有些時(shí)候,在其中一本書的某個(gè)點(diǎn)上,卡殼了,不是很理解了,在另外的書上你可能就碰到對(duì)同一個(gè)問(wèn)題的不同角度的描述,說(shuō)不準(zhǔn)哪句話就能讓你豁然開(kāi)朗,如醍醐灌頂。我經(jīng)常碰到這種情況。

并不是說(shuō)學(xué)習(xí)過(guò)程中對(duì)一些函數(shù)體的實(shí)現(xiàn)完全就忽略掉,只要自己想徹底了解其代碼實(shí)現(xiàn),沒(méi)有誰(shuí)會(huì)阻止你。我是在反復(fù)閱讀過(guò)程中慢慢深入的。比如VFS中文件打開(kāi)需要對(duì)路徑進(jìn)行分析,需要考慮的細(xì)節(jié)不少(.././之類的),但是其代碼實(shí)現(xiàn)是很好理解的。再比如,CFS調(diào)度中根據(jù)shedule latency、隊(duì)列中進(jìn)程個(gè)數(shù)及其nice值(使用的是動(dòng)態(tài)優(yōu)先級(jí))計(jì)算出分配給進(jìn)程的時(shí)間片,沒(méi)理由不看的,這個(gè)太重要了,而且也很有意思。

ULK3也會(huì)有設(shè)計(jì)原理與思想之類的概括性介紹,基本上都位于某個(gè)主題的開(kāi)篇段落。但是更多的是對(duì)支持該原理和思想的主要函數(shù)實(shí)現(xiàn)的具體分析,同樣在首段,一句話綜述函數(shù)的功能,然后對(duì)函數(shù)的實(shí)現(xiàn)以1、2、3,或者a、b、c步驟的形式進(jìn)行講解。我只是有選擇性的看,有時(shí)候?qū)φ罩胹ource insight打開(kāi)的源碼,確認(rèn)一下代碼大體上確實(shí)是按書中所描述的步驟實(shí)現(xiàn)的,就當(dāng)是增加感性認(rèn)識(shí)。由于步驟中摻雜著各種針對(duì)不同實(shí)現(xiàn)目的安全性、有效性檢查,如果不理解就先跳過(guò)。這并不妨礙你對(duì)函數(shù)體功能實(shí)現(xiàn)的整體把握。


PLKA介于LKD3和ULK3之間。我覺(jué)得PLKA的作者(看照片,真一德國(guó)帥小伙,技術(shù)如此了得)肯定看過(guò)ULK,無(wú)論他的本意還是有意,總之PLKA還是跟ULK有所不同,對(duì)函數(shù)的仔細(xì)講解都做補(bǔ)充說(shuō)明,去掉函數(shù)體中邊邊角角的情況,比如一些特殊情況的處理,有效性檢查等,而不妨礙對(duì)整個(gè)函數(shù)體功能的理解,這些他都有所交代,做了聲明;而且,就像LKD3一樣,在某些點(diǎn)上也給出了指導(dǎo)性編程建議。作者們甚至對(duì)同一個(gè)主要函數(shù)的講解的著重點(diǎn)都不一樣。這樣的話,對(duì)我們學(xué)習(xí)的人而言,有助于加深理解。另外,我認(rèn)為很重要的一點(diǎn)就是PLKA針對(duì)的2.6.24的內(nèi)核版本,而ULK是2.6.11,LKD3是2.6.34。在某些方面PLKA比較接近現(xiàn)代的實(shí)現(xiàn)。其實(shí)作者們之所以分別選擇11或者24,都是因?yàn)樵诎姹景l(fā)行樹(shù)中,這兩個(gè)版本在某些方面都做了不小的變動(dòng),或者說(shuō)是具有標(biāo)志性的轉(zhuǎn)折點(diǎn)(這些信息大多是在書中的引言部分介紹的,具體的細(xì)節(jié)我想不起來(lái)了)。


Intel V3,針對(duì)X86的CPU,本書自然是系統(tǒng)編程的權(quán)威。內(nèi)核部分實(shí)現(xiàn)都可以在本書找到其根源。所以,在讀以上三本書某個(gè)子系統(tǒng)的時(shí)候,不要忘記可以在V3中相應(yīng)章節(jié)找到一些基礎(chǔ)性支撐信息。


在讀書過(guò)程中,會(huì)產(chǎn)生相當(dāng)多的疑問(wèn),這一點(diǎn)是確信無(wú)疑的。大到搞不明白一個(gè)設(shè)計(jì)思想,小到不理解某行代碼的用途。各個(gè)方面,各種疑問(wèn),你完全可以把不理解的地方都記錄下來(lái)(不過(guò),我并沒(méi)有這么做,沒(méi)有把疑問(wèn)全部記下來(lái),只標(biāo)記了很少一部分我認(rèn)為很關(guān)鍵的幾個(gè)問(wèn)題),專門寫到一張紙上,不對(duì),一個(gè)本上,我確信會(huì)產(chǎn)生這么多的疑問(wèn),不然內(nèi)核相關(guān)的論壇早就可以關(guān)閉了。其實(shí),大部分的問(wèn)題(其中很多問(wèn)題都是你知道不知道有這么一回事的問(wèn)題)都可以迎刃而解,只要你肯回頭再看,書讀百遍,其義自現(xiàn)。多看幾遍,前前后后的聯(lián)系明白個(gè)七七八八是沒(méi)有問(wèn)題的。我也這么做了,針對(duì)某些子系統(tǒng)也看了好幾遍,切身體會(huì)。


當(dāng)你按順序?qū)W習(xí)這些子系統(tǒng)的時(shí)候,前面的章節(jié)很可能會(huì)引用后面的章節(jié),就像PLKA的作者說(shuō)的那樣,完全沒(méi)有向后引用是不可能的,他能做的只是盡量減少這種引用而又不損害你對(duì)當(dāng)前問(wèn)題的理解。不理解,沒(méi)關(guān)系,跳過(guò)就行了。后面的章節(jié)同樣會(huì)有向前章節(jié)的引用,不過(guò)這個(gè)問(wèn)題就簡(jiǎn)單一些了 ?,你可以再回頭去看相應(yīng)的介紹,當(dāng)時(shí)你不太理解的東西,很可能這個(gè)時(shí)候就知道了它的設(shè)計(jì)的目的以及具體的應(yīng)用。不求甚解只是暫時(shí)的。比如說(shuō),內(nèi)核各個(gè)子系統(tǒng)之間的交互和引用在代碼中的體現(xiàn)就是實(shí)現(xiàn)函數(shù)穿插調(diào)用,比如你在內(nèi)存管理章節(jié)學(xué)習(xí)了的內(nèi)存分配和釋放的函數(shù),而你是了解內(nèi)存在先的,在學(xué)習(xí)驅(qū)動(dòng)或者模塊的時(shí)候就會(huì)碰到這些函數(shù)的調(diào)用,這樣也就比較容易接受,不至于太過(guò)茫然;再比如,你了解了系統(tǒng)時(shí)間和定時(shí)器的管理,再回頭看中斷和異常中bottom half的調(diào)度實(shí)現(xiàn),你對(duì)它的理解就會(huì)加深一層。

子系統(tǒng)進(jìn)行管理工作需要大量的數(shù)據(jù)結(jié)構(gòu)。子系統(tǒng)之間交互的一種方式就是各個(gè)子系統(tǒng)各自的主要數(shù)據(jù)結(jié)構(gòu)通過(guò)指針成員相互引用。學(xué)習(xí)過(guò)程中,參考書上在講解某個(gè)子系統(tǒng)的時(shí)候會(huì)對(duì)數(shù)據(jù)結(jié)構(gòu)中主要成員的用途解釋一下,但肯定不會(huì)覆蓋全部(成員比較多的情況,例如task_struct),對(duì)其它子系統(tǒng)基于某個(gè)功能實(shí)現(xiàn)的引用可能解釋了,也可能沒(méi)做解釋,還可能說(shuō)這個(gè)變量在何處會(huì)做進(jìn)一步說(shuō)明。所以,不要糾結(jié)于一個(gè)不理解的點(diǎn)上,暫且放過(guò),回頭還可以看的。之間的聯(lián)系可以在對(duì)各個(gè)子系統(tǒng)都有所了解之后再建立起來(lái)。其實(shí),我仍然在強(qiáng)調(diào)先理解概念和框架的重要性。


等我們完成了建立框架這一步,就可以選擇一個(gè)比較感興趣的子系統(tǒng),比如驅(qū)動(dòng)、網(wǎng)絡(luò),或者文件系統(tǒng)之類的。這個(gè)時(shí)候你再去深入了解底層代碼實(shí)現(xiàn),相較于一開(kāi)始就鉆研代碼,更容易一些,而且碰到了不解之處,或者忘記了某個(gè)方面的實(shí)現(xiàn),此時(shí)你完全可以找到相應(yīng)的子系統(tǒng),因?yàn)槟阒涝谀娜フ?,查漏補(bǔ)缺,不僅完成了對(duì)當(dāng)前函數(shù)的鉆研,而且可以回顧、溫習(xí)以前的內(nèi)容,融會(huì)貫通的時(shí)機(jī)就在這里了。


《深入理解linux虛擬內(nèi)存》(2.4內(nèi)核版本),LDD3,《深入理解linux網(wǎng)絡(luò)技術(shù)內(nèi)幕》,幾乎每一個(gè)子系統(tǒng)都需要一本書的容量去講解,所以說(shuō),剛開(kāi)始學(xué)習(xí)不宜對(duì)某個(gè)模塊太過(guò)深入,等對(duì)各個(gè)子系統(tǒng)都有所了解了,再有針對(duì)性的去學(xué)習(xí)一個(gè)特定的子系統(tǒng)。這時(shí)候?qū)ζ渌到y(tǒng)的援引都可以讓我們不再感到茫然、復(fù)雜,不知所云。


比如,LDD3中的以下所列章節(jié):構(gòu)造和運(yùn)行模塊,并發(fā)和競(jìng)態(tài),時(shí)間、延遲及延緩操作,分配內(nèi)存,中斷處理等,都屬于驅(qū)動(dòng)開(kāi)發(fā)的支撐性子系統(tǒng),雖說(shuō)本書對(duì)這些子系統(tǒng)都專門開(kāi)辟一個(gè)章節(jié)進(jìn)行講解,但是詳細(xì)程度怎么能比得上PLKA,ULK3,LKD3這三本書,看完這三本書,你會(huì)發(fā)現(xiàn)讀LDD3這些章節(jié)的時(shí)候簡(jiǎn)直跟喝白開(kāi)水一樣,太隨意了,因?yàn)長(zhǎng)DD3的講解比之LKD3更粗略。打好了基礎(chǔ),PCI、USB、TTY驅(qū)動(dòng),塊設(shè)備驅(qū)動(dòng),網(wǎng)卡驅(qū)動(dòng),需要了解和學(xué)習(xí)的東西就比較有針對(duì)性了。這些子系統(tǒng)就屬于通用子系統(tǒng),了解之后,基于這些子系統(tǒng)的子系統(tǒng)的開(kāi)發(fā)—驅(qū)動(dòng)(需進(jìn)一步針對(duì)硬件特性)和網(wǎng)絡(luò)(需進(jìn)一步理解各種協(xié)議)—相對(duì)而言,其學(xué)習(xí)難度大大降低,學(xué)習(xí)進(jìn)度大大加快,學(xué)習(xí)效率大大提升。說(shuō)著容易做來(lái)難。達(dá)到這樣一種效果的前提就是:必須得靜下心來(lái),認(rèn)真讀書,要看得進(jìn)去,PLKA,ULK3厚得都跟磚頭塊兒一樣,令人望之生畏,如果沒(méi)有興趣,沒(méi)有熱情,沒(méi)有毅力,無(wú)論如何都是不行,因?yàn)樾枰獣r(shí)間,需要很長(zhǎng)時(shí)間。我并不是說(shuō)必須打好了基礎(chǔ)才可以進(jìn)行驅(qū)動(dòng)開(kāi)發(fā),只是說(shuō)打好了基礎(chǔ)的情況下進(jìn)行開(kāi)發(fā)會(huì)更輕松,更有效率,而且自己對(duì)內(nèi)核代碼的駕馭能力會(huì)更強(qiáng)大。這只是我個(gè)人見(jiàn)解,我自己的學(xué)習(xí)方式,僅供參考。

語(yǔ)言

PLKA是個(gè)德國(guó)人用德語(yǔ)寫的,后來(lái)翻譯成英文,又從英文翻譯成中文,我在網(wǎng)上書店里沒(méi)有找到它的紙質(zhì)英文版,所以就買了中文版的。ULK3和LKD3都是英文版的。大牛們寫的書,遣詞造句真的是簡(jiǎn)潔,易懂,看原版對(duì)我們學(xué)習(xí)計(jì)算機(jī)編程的程序員來(lái)說(shuō)完全不成問(wèn)題,最好原汁原味。如果一本書確實(shí)翻譯地很好,我們當(dāng)然可以看中文版的,用母語(yǔ)進(jìn)行學(xué)習(xí),理解速度和學(xué)習(xí)進(jìn)度當(dāng)然是很快的,不作他想??从⑽牡臅r(shí)候不要腦子里想著把他翻譯成中文,沒(méi)必要。

API感想

“比起知道你所用技術(shù)的重要性,成為某一個(gè)特別領(lǐng)域的專家是不重要的。知道某一個(gè)具體API調(diào)用一點(diǎn)好處都沒(méi)有,當(dāng)你需要他的時(shí)候只要查詢下就好了。”這句話源于我看到的一篇翻譯過(guò)來(lái)的博客。我想強(qiáng)調(diào)的就是,這句話針應(yīng)用型編程再合適不過(guò),但是內(nèi)核API就不完全如此。


內(nèi)核相當(dāng)復(fù)雜,學(xué)習(xí)起來(lái)很不容易,但是當(dāng)你學(xué)習(xí)到一定程度,你會(huì)發(fā)現(xiàn),如果自己打算寫內(nèi)核代碼,到最后要關(guān)注的仍然是API接口,只不過(guò)這些API絕大部分是跨平臺(tái)的,滿足可移植性。內(nèi)核黑客基本上已經(jīng)標(biāo)準(zhǔn)化、文檔化了這些接口,你所要做的只是調(diào)用而已。當(dāng)然,在使用的時(shí)候,最好對(duì)可移植性這一話題在內(nèi)核中的編碼約定爛熟于心,這樣才會(huì)寫出可移植性的代碼。就像應(yīng)用程序一樣,可以使用開(kāi)發(fā)商提供的動(dòng)態(tài)庫(kù)API,或者使用開(kāi)源API。同樣是調(diào)用API,不同點(diǎn)在于使用內(nèi)核API要比使用應(yīng)用API了解的東西要多出許多。

當(dāng)你了解了操作系統(tǒng)的實(shí)現(xiàn)—這些實(shí)現(xiàn)可都是對(duì)應(yīng)用程序的基礎(chǔ)性支撐啊—你再去寫應(yīng)用程序的時(shí)候,應(yīng)用程序中用到的多線程,定時(shí)器,同步鎖機(jī)制等等等等,使用共享庫(kù)API的時(shí)候,聯(lián)系到操作系統(tǒng),從而把對(duì)該API的文檔描述同自己所了解到的這些方面在內(nèi)核中的相應(yīng)支撐性實(shí)現(xiàn)結(jié)合起來(lái)進(jìn)行考慮,這會(huì)指導(dǎo)你選擇使用哪一個(gè)API接口,選出效率最高的實(shí)現(xiàn)方式。對(duì)系統(tǒng)編程頗有了解的話,對(duì)應(yīng)用編程不無(wú)益處,甚至可以說(shuō)是大有好處。


設(shè)計(jì)實(shí)現(xiàn)的本質(zhì),知道還是理解

操作系統(tǒng)是介于底層硬件和應(yīng)用軟件之間的接口,其各個(gè)子系統(tǒng)的實(shí)現(xiàn)很大程度上依賴于硬件特性。書上介紹這些子系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)的時(shí)候,我們讀過(guò)了,也就知道了,如果再深入考慮一下,為什么整體架構(gòu)要按照這種方式組織,為什么局部函數(shù)要遵循這樣的步驟處理,知其然,知其所以然,如果你知道了某個(gè)功能的實(shí)現(xiàn)是因?yàn)樾酒褪沁@么設(shè)計(jì)的,CPU就是這么做的,那么你的疑問(wèn)也就基本上到此為止了。再深究,就是芯片架構(gòu)方面的設(shè)計(jì)與實(shí)現(xiàn),對(duì)于程序員來(lái)講,無(wú)論是系統(tǒng)還是應(yīng)用程序員,足跡探究到這里,已經(jīng)解決了很多疑問(wèn),因?yàn)槲覀兊墓ぷ餍再|(zhì)偏軟,而這些東西實(shí)在是夠硬。

比如,ULK3中講解的中斷和異常的實(shí)現(xiàn),究其根源,那是因?yàn)镮ntel x86系列就是這么設(shè)計(jì)的,去看看Intel V3手冊(cè)中相應(yīng)章節(jié)介紹,都可以為ULK3中描述的代碼實(shí)現(xiàn)方式找到注解。還有時(shí)間和定時(shí)器管理,同樣可以在Intel V3 ?對(duì)APIC的介紹中獲取足夠的信息,操作系統(tǒng)就是依據(jù)這些硬件特性來(lái)實(shí)現(xiàn)軟件方法定義的。

又是那句話,不是理解不理解的問(wèn)題,而是知道不知道的問(wèn)題。有時(shí)候,知道了,就理解了。在整個(gè)學(xué)習(xí)過(guò)程中,知道,理解,知道,理解,知道……,交叉反復(fù)。為什么開(kāi)始和結(jié)尾都是知道,而理解只是中間步驟呢?世界上萬(wàn)事萬(wàn)物自有其規(guī)律,人類只是發(fā)現(xiàn)而已,實(shí)踐是第一位的,實(shí)踐就是知道的過(guò)程,實(shí)踐產(chǎn)生經(jīng)驗(yàn),經(jīng)驗(yàn)的總結(jié)就是理論,理論源于實(shí)踐,理論才需要理解。我們學(xué)習(xí)內(nèi)核,深入研究,搞來(lái)搞去,又回到了芯片上,芯片是物質(zhì)的,芯片的功用基于自然界中物質(zhì)本有的物理和電子特性。追本溯源,此之謂也。


動(dòng)手寫代碼

紙上得來(lái)終覺(jué)淺,絕知此事要躬行。只看書是絕對(duì)不行的,一定要結(jié)合課本給出的編程建議自己敲代碼。剛開(kāi)始就以模塊形式測(cè)試好了,或者自己編譯一個(gè)開(kāi)發(fā)版本的內(nèi)核。一臺(tái)機(jī)器的話,使用UML方式調(diào)試,內(nèi)核控制路走到哪一步,單步調(diào)試看看程序執(zhí)行過(guò)程,比書上的講解更直觀明了。一定要?jiǎng)邮謱?shí)際操作。


參考書LDD3? ? ? ? ? Linux Device Driver 3rd

LKD3? ? ? ? ? Linux Kernel Development 3rdULK3? ? ? ? ? Understanding the Linux Kernel 3rdPLKA? ? ? ? ? Professional Linux Kernel ArchitectureUML? ? ? ? ? ? User Mode LinuxIntel V3? ? ? ?Intel? 64 and IA-32 Architectures Software Developer’s Manual ?Volume 3 (3A, 3B
本站聲明: 本文章由作者或相關(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工具的開(kāi)發(fā)耗時(shí)1.5...

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

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(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ì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

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

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(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)閉