linux內(nèi)核源碼分析(內(nèi)核源碼結(jié)構(gòu)組成)
應(yīng)該說是把linux內(nèi)核這部分知識提前了,因?yàn)樽恍枰c(diǎn)視頻來打發(fā)一下時(shí)間,感覺linux內(nèi)核的視頻就不錯(cuò),就順便把linux內(nèi)核提前了。這一次也是打算視頻和書一起看,然后總結(jié)。書的話還是推薦《深入linux內(nèi)核架構(gòu)》。不吹水了,開始進(jìn)入正題。
1.1 內(nèi)核簡介
1.1.1 內(nèi)核的任務(wù)
在純技術(shù)層面,內(nèi)核是硬件與軟件之間的一個(gè)中間層。其作用是將應(yīng)用程序的請求傳遞給硬件,并充當(dāng)?shù)讓域?qū)動(dòng)程序,對系統(tǒng)中的各種設(shè)備和組件進(jìn)行尋址。
盡管如此,仍然可以從其他一些有趣的視角對內(nèi)核進(jìn)行研究
從應(yīng)用程序的視角:內(nèi)核可以被認(rèn)為是一臺(tái)增強(qiáng)的計(jì)算機(jī),將計(jì)算機(jī)抽象到一個(gè)高層次上。會(huì)把硬件上的各種細(xì)節(jié)屏蔽,然后應(yīng)用層,只需要調(diào)用內(nèi)核的API,就能使用各種功能。 當(dāng)若干程序在同一系統(tǒng)中并發(fā)運(yùn)行時(shí),也可以將內(nèi)核視為資源管理程序。內(nèi)核負(fù)責(zé)將可用的共享資源(包括CPU時(shí)間、磁盤空間、網(wǎng)絡(luò)連接等)分配到各個(gè)系統(tǒng)進(jìn)程,同時(shí)還需要保證系統(tǒng)的完整性。 另一種研究內(nèi)核的視角是將內(nèi)核視為庫,其提供了一組面向系統(tǒng)的命令。
1.1.2 實(shí)現(xiàn)策略
當(dāng)前,在操作系統(tǒng)實(shí)現(xiàn)方面,有以下兩種主要的范型。
微內(nèi)核,只有最基本的功能直接由中央內(nèi)核實(shí)現(xiàn)。所有其他的功能都委托給一些獨(dú)立進(jìn)程,這些進(jìn)程通過明確定義的通信接口與中心內(nèi)核通信。例如:獨(dú)立進(jìn)程可能負(fù)責(zé)實(shí)現(xiàn)各種文件系統(tǒng),內(nèi)存管理等。(當(dāng)然,與系統(tǒng)本身的通信需要用到最基本的內(nèi)存管理功能,這是微內(nèi)核實(shí)現(xiàn)。)
好處:動(dòng)態(tài)可擴(kuò)展性和運(yùn)行時(shí)切換重要組件,
缺點(diǎn):由于各個(gè)組件之間支持復(fù)雜通信需要額外的CPU時(shí)間。
宏內(nèi)核,與微內(nèi)核相反,宏內(nèi)核是構(gòu)建系統(tǒng)內(nèi)核的傳統(tǒng)方法。在這種方法中,內(nèi)核的全部代碼,包括所有子系統(tǒng)(如內(nèi)存管理、文件系統(tǒng)、設(shè)備驅(qū)動(dòng)程序)都打包到一個(gè)文件中。
宏內(nèi)核的性能仍然強(qiáng)于微內(nèi)核,linux仍然是依據(jù)這種范型實(shí)現(xiàn)的。但其中已經(jīng)引進(jìn)了一個(gè)重要的革新。在系統(tǒng)運(yùn)行中,模塊可以插入到內(nèi)核代碼中,也可以移除,這使得可以向內(nèi)核動(dòng)態(tài)添加功能。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)??


1.2 為什么內(nèi)核是特別的
內(nèi)核很神奇,但歸根結(jié)底它只是一個(gè)大的C程序,帶有一些匯編代碼(不時(shí)出現(xiàn)很少量的“黑巫術(shù)”)。
是什么使得內(nèi)核如此吸引人?原因有幾個(gè)。
內(nèi)核是由世界上最好的程序員編寫的,源代碼可以證實(shí)這一點(diǎn)。 結(jié)構(gòu)良好,細(xì)節(jié)一絲不茍,巧妙的解決方案在代碼中處處可見。 內(nèi)核采用了設(shè)計(jì)得非常干凈的抽閑,以保持代碼的模塊化和易管理性,與內(nèi)核其他方面混合起來,使得代碼非常有趣和獨(dú)特。 內(nèi)核會(huì)以上下文相關(guān)的重用比特位置,多次重載結(jié)構(gòu)成員,還有很多其他東西。 還有許多不同于用戶程序的嚴(yán)肅問題需要說明:
調(diào)試內(nèi)核通常要比調(diào)試用戶層程序困難。應(yīng)用層有大量的調(diào)試器可用。 內(nèi)核提供了許多輔助函數(shù),類似于用戶空間的C語言庫,但內(nèi)核領(lǐng)域中的東西總是樸素得多。 用戶層應(yīng)用程序的錯(cuò)誤可能會(huì)導(dǎo)致段錯(cuò)誤(segmentation fault)或內(nèi)存轉(zhuǎn)儲(chǔ)(core dump),但內(nèi)核錯(cuò)誤會(huì)導(dǎo)致整個(gè)系統(tǒng)故障。 必須考慮到內(nèi)核運(yùn)行的許多體系結(jié)構(gòu)上根本不支持非對齊的內(nèi)存訪問。 所有的內(nèi)核代碼都必須是并發(fā)安全的。由于對多處理器計(jì)算機(jī)的支持,linux內(nèi)核代碼必須是可重入和線程安全的。 內(nèi)核代碼必須在小端序計(jì)算機(jī)上能夠工作。 大多數(shù)的體系結(jié)構(gòu)根本不允許在內(nèi)核中執(zhí)行浮點(diǎn)計(jì)算,因此計(jì)算需要想辦法用整形來替代。 1.3 內(nèi)核的組成部分 我們來看下完整的linux系統(tǒng)的各個(gè)層次:

linux內(nèi)核下接計(jì)算機(jī)硬件,對計(jì)算機(jī)硬件統(tǒng)一管理,然后提供系統(tǒng)調(diào)用接口(API)給用戶進(jìn)程調(diào)用(前面也講過了)。

第二張圖,是linux內(nèi)核中的一些子系統(tǒng)之間的關(guān)系,包括我們之后要學(xué)習(xí)的進(jìn)程調(diào)度,內(nèi)存管理,進(jìn)程通信,虛擬文件系統(tǒng),網(wǎng)絡(luò)模塊等內(nèi)核子模塊,這里就先看看吧,反正初學(xué)者也知識知道這些,并不清楚里面的知識。
linux系統(tǒng)中比較重要的數(shù)據(jù)結(jié)構(gòu):
task_struct:代表一個(gè)進(jìn)程數(shù)據(jù)結(jié)構(gòu)指針形成一個(gè)task數(shù)組
mm_struct:代表進(jìn)程的虛擬內(nèi)存
inode:代表虛擬文件系統(tǒng)中的文件、目錄等對應(yīng)的索引節(jié)點(diǎn)
1.4 linux內(nèi)核源碼組織
1.4.1 內(nèi)核版本說明
linux內(nèi)核版本號由3組數(shù)字組成
第一組:目前發(fā)布的內(nèi)核主版本
第二組:偶數(shù)表示穩(wěn)定版本,奇數(shù)表示開發(fā)中版本
第三組:錯(cuò)誤修補(bǔ)次數(shù)
1.4.2 源碼組織

