??途W(wǎng)論壇最具爭議的Linux內(nèi)核成神筆記,GitHub已下載量已過百萬
Linux內(nèi)核成神筆記:200+經(jīng)典內(nèi)核文章,100+內(nèi)核論文,50+內(nèi)核項目,500+內(nèi)核面試題,80+內(nèi)核視頻
??途W(wǎng)論壇最具爭議的Linux內(nèi)核成神筆記,GitHub已下載量已過百萬:https://zhuanlan.zhihu.com/p/635315467
一,前言
Linux內(nèi)核是一個操作系統(tǒng)(OS)內(nèi)核,本質(zhì)上定義為類Unix。它用于不同的操作系統(tǒng),主要是以不同的Linux發(fā)行版的形式。Linux內(nèi)核是第一個真正完整且突出的免費和開源軟件示例。Linux 內(nèi)核是第一個真正完整且突出的免費和開源軟件示例,促使其廣泛采用并得到了數(shù)千名開發(fā)人員的貢獻。
Linux 內(nèi)核由芬蘭赫爾辛基大學(xué)的學(xué)生 Linus Torvalds 于 1991 年創(chuàng)建。隨著程序員調(diào)整其他自由軟件項目的源代碼以擴展內(nèi)核的功能,它迅速取得了進展。Torvalds 首先使用 80386 匯編語言編寫的任務(wù)切換器以及終端驅(qū)動程序,然后將其發(fā)布到 Comp.os.minix Usenet 組。它很快被 Mini社區(qū)所改編,為該項目提供了見解和代碼。
Linux 內(nèi)核越來越受歡迎,因為 GNU 自己的內(nèi)核 GNU Hurd 不可用且不完整,而 Berkeley Software DistribuTIon(BSD)操作系統(tǒng)仍然受到法律問題的困擾。在開發(fā)人員社區(qū)的幫助下,Linux 0.01 于 1991 年 9 月 17 日發(fā)布。
想知道什么是 Linux 內(nèi)核上真正的(不是那種時髦的)創(chuàng)新嗎?
在科技行業(yè),創(chuàng)新這個詞幾乎和革命一樣到處泛濫,所以很難將那些夸張的東西與真正令人振奮的東西區(qū)分開來。Linux 內(nèi)核被稱為創(chuàng)新,但它又被稱為現(xiàn)代計算中最大的奇跡,一個微觀世界中的龐然大物。
撇開營銷和模式不談,Linux 可以說是開源世界中最受歡迎的內(nèi)核,它在近 30 年的生命時光當(dāng)中引入了一些真正的規(guī)則改變者。
Cgroups(2.6.24)
早在 2007 年,Paul Menage 和 Rohit Seth 就在內(nèi)核中添加了深奧的控制組(cgroups)功能(cgroups 的當(dāng)前實現(xiàn)是由 Tejun Heo 重寫的)。這種新技術(shù)最初被用作一種方法,從本質(zhì)上來說,是為了確保一組特定任務(wù)的服務(wù)質(zhì)量。
例如,你可以為與你的 WEB 服務(wù)相關(guān)聯(lián)的所有任務(wù)創(chuàng)建一個控制組定義(cgroup),為例行備份創(chuàng)建另一個 cgroup ,再為一般操作系統(tǒng)需求創(chuàng)建另一個 cgroup。然后,你可以控制每個組的資源百分比,這樣你的操作系統(tǒng)和 WEB 服務(wù)就可以獲得大部分系統(tǒng)資源,而你的備份進程可以訪問剩余的資源。
然而,cgroups 如今變得這么著名是因其作為驅(qū)動云技術(shù)的角色:容器。事實上,cgroups 最初被命名為進程容器。當(dāng)它們被 LXC、CoreOS 和 Docker 等項目采用時,這并不奇怪。
就像閘門打開后一樣,“容器” 一詞就像成為了 Linux 的同義詞一樣,微服務(wù)風(fēng)格的基于云的“應(yīng)用”概念很快成為了規(guī)范。如今,已經(jīng)很難擺脫 cgroups 了,它們是如此普遍。每一個大規(guī)模的基礎(chǔ)設(shè)施(如果你運行 Linux 的話,可能還有你的筆記本電腦)都以一種合理的方式使用了 cgroups,這使得你的計算體驗比以往任何時候都更加易于管理和靈活。
例如,你可能已經(jīng)在電腦上安裝了 Flathub 或 Flatpak,或者你已經(jīng)在工作中使用 Kubernetes 和/或 OpenShift。不管怎樣,如果“容器”這個術(shù)語對你來說仍然模糊不清,則可以 通過 Linux 容器從背后獲得對容器的實際理解。
LKMM(4.17)
2018 年,Jade Alglave、Alan Stern、Andrea Parri、Luc Maranget、Paul McKenney 以及其他幾個人的辛勤工作的成果被合并到主線 Linux 內(nèi)核中,以提供正式的內(nèi)存模型。Linux 內(nèi)核內(nèi)存[一致性]模型(LKMM)子系統(tǒng)是一套描述 Linux 內(nèi)存一致性模型的工具,同時也產(chǎn)生用于測試的用例(特別命名為 klitmus)。
隨著系統(tǒng)在物理設(shè)計上變得越來越復(fù)雜(增加了更多的中央處理器內(nèi)核,高速緩存和內(nèi)存增長,等等),它們就越難知道哪個中央處理器需要哪個地址空間,以及何時需要。例如,如果 CPU0 需要將數(shù)據(jù)寫入內(nèi)存中的共享變量,并且 CPU1 需要讀取該值,那么 CPU0 必須在 CPU1 嘗試讀取之前寫入。類似地,如果值是以一種順序方式寫入內(nèi)存的,那么期望它們也以同樣的順序被讀取,而不管哪個或哪些 CPU 正在讀取。
即使在單個處理器上,內(nèi)存管理也需要特定的任務(wù)順序。像 x = y 這樣的簡單操作需要處理器從內(nèi)存中加載 y 的值,然后將該值存儲在 x 中。在處理器從內(nèi)存中讀取值之前,是不能將存儲在 y 中的值放入 x 變量的。此外還有地址依賴:x[n] = 6 要求在處理器能夠存儲值 6 之前加載 n。
LKMM 可以幫助識別和跟蹤代碼中的這些內(nèi)存模式。它部分是通過一個名為 herd 的工具來實現(xiàn)的,該工具(以邏輯公式的形式)定義了內(nèi)存模型施加的約束,然后列舉了與這些約束一致性的所有可能的結(jié)果。
低延遲補丁(2.6.38)
很久以前,在 2011 年之前,如果你想在 Linux 上進行多媒體工作,你必須得有一個低延遲內(nèi)核。這主要適用于錄音時添加了許多實時效果(如對著麥克風(fēng)唱歌和添加混音,以及在耳機中無延遲地聽到你的聲音)。有些發(fā)行版,如 Ubuntu Studio,可靠地提供了這樣一個內(nèi)核,所以實際上這沒有什么障礙,這只不過是當(dāng)藝術(shù)家選擇發(fā)行版時的一個重要提醒。
然而,如果你沒有使用 Ubuntu Studio,或者你需要在你的發(fā)行版提供之前更新你的內(nèi)核,你必須跳轉(zhuǎn)到 rt-patches 網(wǎng)頁,下載內(nèi)核補丁,將它們應(yīng)用到你的內(nèi)核源代碼,編譯,然后手動安裝。
后來,隨著內(nèi)核版本 2.6.38 的發(fā)布,這個過程結(jié)束了。Linux 內(nèi)核突然像變魔術(shù)一樣默認(rèn)內(nèi)置了低延遲代碼(根據(jù)基準(zhǔn)測試,延遲至少降低了 10 倍)。不再需要下載補丁,不用編譯。一切都很順利,這都是因為 Mike Galbraith 編寫了一個 200 行的小補丁。
對于全世界的開源多媒體藝術(shù)家來說,這是一個規(guī)則改變者。從 2011 年開始事情變得如此美好,到 2016 年我自己做了一個挑戰(zhàn),在樹莓派 v1(型號 B)上建造一個數(shù)字音頻工作站(DAW),結(jié)果發(fā)現(xiàn)它運行得出奇地好。
RCU(2.5)
RCU,即 讀-拷貝-更新(Read-Copy-Update),是計算機科學(xué)中定義的一個系統(tǒng),它允許多個處理器線程從共享內(nèi)存中讀取數(shù)據(jù)。它通過延遲更新但也將它們標(biāo)記為已更新來做到這一點,以確保數(shù)據(jù)讀取為最新內(nèi)容。實際上,這意味著讀取與更新同時發(fā)生。
典型的 RCU 循環(huán)有點像這樣:
刪除指向數(shù)據(jù)的指針,以防止其他讀操作引用它。
等待讀操作完成它們的關(guān)鍵處理。
回收內(nèi)存空間。
將更新階段劃分為刪除和回收階段意味著更新程序會立即執(zhí)行刪除,同時推遲回收直到所有活動讀取完成(通過阻止它們或注冊一個回調(diào)以便在完成時調(diào)用)。
雖然 RCU 的概念不是為 Linux 內(nèi)核發(fā)明的,但它在 Linux 中的實現(xiàn)是該技術(shù)的一個定義性的例子。
對于 Linux 內(nèi)核創(chuàng)新的問題的最終答案永遠(yuǎn)是協(xié)作。你可以說這是一個好時機,也可以稱之為技術(shù)優(yōu)勢,稱之為黑客能力,或者僅僅稱之為開源,但 Linux 內(nèi)核及其支持的許多項目是協(xié)作與合作的光輝范例。
它遠(yuǎn)遠(yuǎn)超出了內(nèi)核范疇。各行各業(yè)的人都對開源做出了貢獻,可以說都是因為 Linux 內(nèi)核。Linux 曾經(jīng)是,現(xiàn)在仍然是自由軟件的主要力量,激勵人們把他們的代碼、藝術(shù)、想法或者僅僅是他們自己帶到一個全球化的、有生產(chǎn)力的、多樣化的人類社區(qū)中。
你最喜歡的創(chuàng)新是什么?
這個列表偏向于我自己的興趣:容器、非統(tǒng)一內(nèi)存訪問(NUMA)和多媒體。無疑,列表中肯定缺少你最喜歡的內(nèi)核創(chuàng)新。在評論中告訴我。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【865977150】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!??!前100名進群領(lǐng)取,額外贈送一份價值699的內(nèi)核資料包(含視頻教程、電子書、實戰(zhàn)項目及代碼)

資料直通車:最新Linux內(nèi)核源碼資料文檔+視頻資料:https://docs.qq.com/doc/DTmFTc29xUGdNSnZ2
內(nèi)核學(xué)習(xí)地址:Linux內(nèi)核源碼/內(nèi)存調(diào)優(yōu)/文件系統(tǒng)/進程管理/設(shè)備驅(qū)動/網(wǎng)絡(luò)協(xié)議棧https://ke.qq.com/course/4032547?flowToken=1040236
1.1內(nèi)核在操作系統(tǒng)中的位置
為了更具象地理解內(nèi)核,不妨將Linux計算機想象成有三層結(jié)構(gòu):
硬件:物理機(這是系統(tǒng)的底層結(jié)構(gòu)或基礎(chǔ))是由內(nèi)存(RAM)、處理器(或 CPU)以及輸入/輸出(I/O)設(shè)備(例如存儲、網(wǎng)絡(luò)和圖形)組成的。其中,CPU 負(fù)責(zé)執(zhí)行計算和內(nèi)存的讀寫操作。
Linux 內(nèi)核:操作系統(tǒng)的核心。(沒錯,內(nèi)核正處于核心的位置)它是駐留在內(nèi)存中的軟件,用于告訴 CPU 要執(zhí)行哪些操作。
用戶進程:這些是內(nèi)核所管理的運行程序。用戶進程共同構(gòu)成了用戶空間。用戶進程有時也簡稱為進程。內(nèi)核還允許這些進程和服務(wù)器彼此進行通信(稱為進程間通信或 IPC)。
系統(tǒng)執(zhí)行的代碼在CPU上以以下兩種模式之一運行:內(nèi)核模式或用戶模式。運行在內(nèi)核態(tài)的代碼可以不受限制地訪問硬件,而用戶態(tài)會限制SCI對CPU和內(nèi)存的訪問。內(nèi)存也有類似的分離(內(nèi)核空間和用戶空間)。這兩個小細(xì)節(jié)構(gòu)成了一些復(fù)雜操作的基礎(chǔ),比如安全保護,構(gòu)建容器和虛擬機的權(quán)限分離。
這也意味著,如果進程在用戶模式下失敗,損失是有限且無害的,并且可以由內(nèi)核修復(fù)。另一方面,由于內(nèi)核進程要訪問內(nèi)存和處理器,內(nèi)核進程的崩潰可能會導(dǎo)致整個系統(tǒng)的崩潰。因為用戶進程之間會有適當(dāng)?shù)谋Wo措施和權(quán)限要求,所以一個進程的崩潰通常不會造成太多問題。
此外,由于Linux內(nèi)核在實時補丁期間可以連續(xù)工作,因此在應(yīng)用補丁進行安全修復(fù)時不會出現(xiàn)宕機。
1.2Linux 內(nèi)核的作用是什么?
內(nèi)容有以下四項作用:
內(nèi)存管理:追蹤記錄有多少內(nèi)存存儲了什么以及存儲在哪里
進程管理:確定哪些進程可以使用中央處理器(CPU)、何時使用以及持續(xù)多長時間
設(shè)備驅(qū)動程序:充當(dāng)硬件與進程之間的調(diào)解程序/解釋程序
系統(tǒng)調(diào)用和安全防護:從流程接受服務(wù)請求
正確實現(xiàn)時,內(nèi)核對用戶是不可見的,它在自己的小世界(稱為內(nèi)核空間)中工作,從中分配內(nèi)存,跟蹤所有內(nèi)容的存儲位置。用戶看到的東西(比如Web瀏覽器和文件)叫做用戶空間。這些應(yīng)用程序通過系統(tǒng)調(diào)用接口(SCI)與內(nèi)核交互。
可以這樣理解:內(nèi)核就像一個忙碌的私人助理,為高管(硬件)服務(wù)。助理的工作是將員工和公眾(用戶)的信息和請求(流程)傳遞給高管,記住存儲的內(nèi)容和位置(內(nèi)存),并確定誰可以在任何給定的時間訪問高管,以及會議時間有多長。
1.3學(xué)習(xí)Linux內(nèi)核準(zhǔn)備工作:
熟悉C語言,這個是最基本的
了解編譯連接過程,如果寫過ld、lcf類的鏈接文件最好,這樣就能理解類似percpu變量的實現(xiàn)方法
學(xué)過或者自學(xué)過計算機組成原理或者微機原理,知道smp、cpu、cache、ram、hdd、bus的概念,明白中斷、dma、寄存器,這樣才能理解所謂的上下文context、barrier是什么
Linux內(nèi)核的特點:結(jié)合了unix操作系統(tǒng)的一些基礎(chǔ)概念

Linux內(nèi)核的任務(wù):
1.從技術(shù)層面講,內(nèi)核是硬件與軟件之間的一個中間層。作用是將應(yīng)用層序的請求傳遞給硬件,并充當(dāng)?shù)讓域?qū)動程序,對系統(tǒng)中的各種設(shè)備和組件進行尋址。
2.從應(yīng)用程序的層面講,應(yīng)用程序與硬件沒有聯(lián)系,只與內(nèi)核有聯(lián)系,內(nèi)核是應(yīng)用程序知道的層次中的最底層。在實際工作中內(nèi)核抽象了相關(guān)細(xì)節(jié)。
3.內(nèi)核是一個資源管理程序。負(fù)責(zé)將可用的共享資源(CPU時間、磁盤空間、網(wǎng)絡(luò)連接等)分配得到各個系統(tǒng)進程。
4.內(nèi)核就像一個庫,提供了一組面向系統(tǒng)的命令。系統(tǒng)調(diào)用對于應(yīng)用程序來說,就像調(diào)用普通函數(shù)一樣。
內(nèi)核實現(xiàn)策略:
1.微內(nèi)核。最基本的功能由中央內(nèi)核(微內(nèi)核)實現(xiàn)。所有其他的功能都委托給一些獨立進程,這些進程通過明確定義的通信接口與中心內(nèi)核通信。
2.宏內(nèi)核。內(nèi)核的所有代碼,包括子系統(tǒng)(如內(nèi)存管理、文件管理、設(shè)備驅(qū)動程序)都打包到一個文件中。內(nèi)核中的每一個函數(shù)都可以訪問到內(nèi)核中所有其他部分。目前支持模塊的動態(tài)裝卸(裁剪)。Linux內(nèi)核就是基于這個策略實現(xiàn)的。
哪些地方用到了內(nèi)核機制?
1.進程(在cpu的虛擬內(nèi)存中分配地址空間,各個進程的地址空間完全獨立;同時執(zhí)行的進程數(shù)最多不超過cpu數(shù)目)之間進行通 信,需要使用特定的內(nèi)核機制。
2.進程間切換(同時執(zhí)行的進程數(shù)最多不超過cpu數(shù)目),也需要用到內(nèi)核機制。
進程切換也需要像FreeRTOS任務(wù)切換一樣保存狀態(tài),并將進程置于閑置狀態(tài)/恢復(fù)狀態(tài)。
3.進程的調(diào)度。確認(rèn)哪個進程運行多長的時間。
Linux進程
1.采用層次結(jié)構(gòu),每個進程都依賴于一個父進程。內(nèi)核啟動init程序作為第一個進程。該進程負(fù)責(zé)進一步的系統(tǒng)初始化操作。init進程是進程樹的根,所有的進程都直接或者間接起源于該進程。
2.通過pstree命令查詢。實際上得系統(tǒng)第一個進程是systemd,而不是init(這也是疑問點)
3.系統(tǒng)中每一個進程都有一個唯一標(biāo)識符(ID),用戶(或其他進程)可以使用ID來訪問進程。
Linux內(nèi)核源代碼的目錄結(jié)構(gòu)
Linux內(nèi)核源代碼包括三個主要部分:
內(nèi)核核心代碼,包括第3章所描述的各個子系統(tǒng)和子模塊,以及其它的支撐子系統(tǒng),例如電源管理、Linux初始化等
其它非核心代碼,例如庫文件(因為Linux內(nèi)核是一個自包含的內(nèi)核,即內(nèi)核不依賴其它的任何軟件,自己就可以編譯通過)、固件集合、KVM(虛擬機技術(shù))等
編譯腳本、配置文件、幫助文檔、版權(quán)說明等輔助性文件使用ls命令看到的內(nèi)核源代碼的頂層目錄結(jié)構(gòu),具體描述如下。include/ ---- 內(nèi)核頭文件,需要提供給外部模塊(例如用戶空間代碼)使用。
kernel/ ---- Linux內(nèi)核的核心代碼,包含了3.2小節(jié)所描述的進程調(diào)度子系統(tǒng),以及和進程調(diào)度相關(guān)的模塊。
mm/ ---- 內(nèi)存管理子系統(tǒng)(3.3小節(jié))。fs/ ---- VFS子系統(tǒng)(3.4小節(jié))。
net/ ---- 不包括網(wǎng)絡(luò)設(shè)備驅(qū)動的網(wǎng)絡(luò)子系統(tǒng)(3.5小節(jié))。
ipc/ ---- IPC(進程間通信)子系統(tǒng)。
arch// ---- 體系結(jié)構(gòu)相關(guān)的代碼,例如arm, x86等等。
arch//mach- ---- 具體的machine/board相關(guān)的代碼。
arch//include/asm ---- 體系結(jié)構(gòu)相關(guān)的頭文件。
arch//boot/dts ---- 設(shè)備樹(Device Tree)文件。init/ ---- Linux系統(tǒng)啟動初始化相關(guān)的代碼。
block/ ---- 提供塊設(shè)備的層次。
sound/ ---- 音頻相關(guān)的驅(qū)動及子系統(tǒng),可以看作“音頻子系統(tǒng)”。
drivers/ ---- 設(shè)備驅(qū)動(在Linux kernel 3.10中,設(shè)備驅(qū)動占了49.4的代碼量)。lib/ ---- 實現(xiàn)需要在內(nèi)核中使用的庫函數(shù),例如CRC、FIFO、list、MD5等。
crypto/ ----- 加密、解密相關(guān)的庫函數(shù)。
security/ ---- 提供安全特性(SELinux)。
virt/ ---- 提供虛擬機技術(shù)(KVM等)的支持。
usr/ ---- 用于生成initramfs的代碼。
firmware/ ---- 保存用于驅(qū)動第三方設(shè)備的固件。samples/ ---- 一些示例代碼。
tools/ ---- 一些常用工具,如性能剖析、自測試等。Kconfig, Kbuild, Makefile, scripts/ ---- 用于內(nèi)核編譯的配置文件、腳本等。COPYING ---- 版權(quán)聲明。
MAINTAINERS ----維護者名單。
CREDITS ---- Linux主要的貢獻者名單。
REPORTING-BUGS ---- Bug上報的指南。Documentation, README ---- 幫助、說明文檔。
二、為什么要學(xué)習(xí) Linux 內(nèi)核
大部分程序員可能永遠(yuǎn)沒有機會開發(fā)Linux內(nèi)核或者驅(qū)動Linux,那么我們?yōu)槭裁催€需要學(xué)習(xí)Linux內(nèi)核呢?Linux的源代碼和架構(gòu)都是開放的,我們可以學(xué)到很多操作系統(tǒng)的概念和實現(xiàn)原理。Linux的設(shè)計哲學(xué)體系繼承了UNIX,現(xiàn)在整個設(shè)計體系相當(dāng)穩(wěn)定和簡化,這是大部分服務(wù)器使用Linux的重要原因。
那學(xué)習(xí)Linux內(nèi)核的原因就在于此。
進一步了解內(nèi)核的原理,有助于你更好地使用命令和程序設(shè)計,讓你的面試和開發(fā)更上一層樓。但是不建議直接看源代碼,因為Linux代碼太大,容易丟失。
而最好的辦法是,先了解一下Linux內(nèi)核機制,知道基本的原理與流程。
不過,Linux內(nèi)核機制也非常復(fù)雜,而且其中互相關(guān)聯(lián)。

比如說,進程運行要分配內(nèi)存,內(nèi)存映射涉及文件的關(guān)聯(lián),文件的讀寫需要經(jīng)過塊設(shè)備,從文件中加載代碼才能運行起來進程。這些知識點要反復(fù)對照,才能理清。
但是一旦攻克!你會發(fā)現(xiàn)Linux這個復(fù)雜的系統(tǒng)開始透明起來。
二、如何學(xué)習(xí)Linux內(nèi)核?
內(nèi)核的知識就像下面的繩結(jié)一樣,一環(huán)扣一環(huán),我們要解開它們,就必須要先找到線頭也就是內(nèi)核中的函數(shù)接口。初學(xué)階段,我們一般不深入的研究內(nèi)核代碼,會使用內(nèi)核的接口函數(shù)就不錯了。
下面提供了如何學(xué)習(xí)這些內(nèi)核函數(shù)的方法,就像解繩子一樣
在我們學(xué)習(xí)Linux內(nèi)核之前,我們首先需要掌握以下幾點:
(1)如何學(xué)習(xí)內(nèi)核,先了解Linux內(nèi)核由哪些組成?
(2)須知Linux內(nèi)核源碼(下載的鏈接 )組織結(jié)構(gòu)?
(3)重點需要學(xué)習(xí)地知識點有哪些?
(4)最后依據(jù)我為大家提供的的學(xué)習(xí)資料,開啟我們的Linux內(nèi)核學(xué)習(xí)之旅。
(5)全網(wǎng)最牛Linux內(nèi)核Makefile系統(tǒng)文件詳解(純文字代碼)
(6)全網(wǎng)最詳細(xì)的Intel CPU體系結(jié)構(gòu)分析(內(nèi)核源碼)
(7)深入理解Linux Kernel內(nèi)核整體架構(gòu)(圖文詳解)
(8)QEMU調(diào)試Linux內(nèi)核環(huán)境搭建
(9)網(wǎng)友說Linux驅(qū)動講不徹底,原來這才是Linux驅(qū)動
(10)一文讓你深度了解Linux內(nèi)核架構(gòu)和工作原理
(11)從Linux內(nèi)核看socket底層的本質(zhì)(IO)
(12)Linux用戶空間與內(nèi)核空間通信(Netlink通信機制)
二,學(xué)習(xí)資料
(1)系統(tǒng)調(diào)用接口【視頻講解】
SCI 層提供了某些機制執(zhí)行從用戶空間到內(nèi)核的函數(shù)調(diào)用。正如前面討論的一樣,這個接口依賴于體系結(jié)構(gòu),甚至在相同的處理器家族內(nèi)也是如此。SCI 實際上是一個非常有用的函數(shù)調(diào)用多路復(fù)用和多路分解服務(wù)。在 ./linux/kernel 中您可以找到 SCI 的實現(xiàn),并在 ./linux/arch 中找到依賴于體系結(jié)構(gòu)的部分。
(2)操作系統(tǒng)原理【視頻講解】
操作系統(tǒng)(英語:Operating System,縮寫:OS)是一組主管并控制計算機操作、運用和運行硬件、軟件資源和提供公共服務(wù)來組織用戶交互的相互關(guān)聯(lián)的系統(tǒng)軟件程序。根據(jù)運行的環(huán)境,操作系統(tǒng)可以分為桌面操作系統(tǒng),手機操作系統(tǒng),服務(wù)器操作系統(tǒng),嵌入式操作系統(tǒng)等。
【 強烈推薦閱讀】一文帶你徹底了解,零拷貝Zero-Copy技術(shù)(圖解)
Linux操作系統(tǒng)學(xué)習(xí)——啟動
Linux操作系統(tǒng)學(xué)習(xí)——內(nèi)核運行
Linux操作系統(tǒng)學(xué)習(xí)——內(nèi)核初始化
操作系統(tǒng)原理(一):操作系統(tǒng)原理與概述(流程圖)
操作系統(tǒng)原理(二):Linux操作系統(tǒng)基礎(chǔ)的常用命令
操作系統(tǒng)原理(三):Linux操作系統(tǒng)I/O機制原理(流程圖詳解)
操作系統(tǒng)原理(四):內(nèi)存管理RAID磁盤陣列與配置
操作系統(tǒng)原理(五):內(nèi)存管理之磁盤高速緩存機制原理
操作系統(tǒng)原理(六):存儲管理之頁式、段式、段頁式存儲
系統(tǒng)操作原理(七):進程的狀態(tài)和轉(zhuǎn)換(五態(tài)模型)
操作系統(tǒng)原理(八):進程同步的幾種方式及基本原理
操作系統(tǒng)原理(九):處理器調(diào)度基本準(zhǔn)則和實現(xiàn)原理
系統(tǒng)操作原理(十):多進程,多線程,并發(fā)執(zhí)行中的死鎖問題
系統(tǒng)操作原理(十一):操作系統(tǒng)原理:進程同步的幾種方式及基本原理
系統(tǒng)操作原理(十二):趣談操作系統(tǒng)原理,存儲管理之頁式、段式、段頁式存儲
系統(tǒng)操作原理(十三):操作系統(tǒng):通過實戰(zhàn)理解CPU上下文切換
匯編語言基礎(chǔ)(十一):匯編語言基礎(chǔ)知識(圖文代碼)
匯編語言入門(十二):匯編指令入門級整理,這些你必須要知道
匯編語言指令(十三):匯編語言的所有指令總結(jié),一篇就夠了
匯編語言進階(十四):ARM體系結(jié)構(gòu)處理器機制原理與實現(xiàn)
匯編語言進階(十五): ARM指令集與匯編語言程序設(shè)計
(3)內(nèi)存管理專題【視頻講解】
內(nèi)核管理的另一個重要資源是內(nèi)存。為了提高效率,如果虛擬內(nèi)存由硬件管理,那么內(nèi)存就按照所謂的內(nèi)存分頁法(大多數(shù)架構(gòu)是4KB)來管理。Linux包括管理可用內(nèi)存的方式和用于物理和虛擬映射的硬件機制。但是,內(nèi)存管理需要管理4KB以上的緩沖區(qū)。Linux提供了4KB緩沖區(qū)的抽象,比如slab分配器。這種內(nèi)存管理模式以4KB緩沖區(qū)為基數(shù),然后從中分配結(jié)構(gòu),并跟蹤內(nèi)存頁面的使用情況,比如哪些頁面已滿,哪些頁面未完全使用,哪些頁面為空。這允許該模式根據(jù)系統(tǒng)需求動態(tài)調(diào)整內(nèi)存使用。為了支持多個用戶使用內(nèi)存,有時會耗盡可用內(nèi)存。因此,可以將頁面移出內(nèi)存,放入磁盤。這個過程稱為交換,因為頁面是從內(nèi)存交換到硬盤的。內(nèi)存管理的源代碼可以在。/linux/mm。
【 強烈推薦閱讀】盡情閱讀,技術(shù)進階,詳解mmap原理
內(nèi)存是什么?一文讓你了解內(nèi)存是怎么實現(xiàn)的
嵌入式開發(fā)必備技能,Linux內(nèi)核源碼組織結(jié)構(gòu)
一文了解Linux內(nèi)存管理,malloc、free 實現(xiàn)原理
內(nèi)存管理系列(一):Linux操作系統(tǒng)內(nèi)存管理(思維導(dǎo)圖詳解)
內(nèi)存管理系列(二):Linux內(nèi)存管理原理知識大總結(jié)
內(nèi)存管理系列(三):學(xué)完操作系統(tǒng)內(nèi)存管理,能回答這8個問題嗎?
內(nèi)存管理系列(四):理解 Memory barrier(內(nèi)存屏障)
內(nèi)存管理系列(五):內(nèi)存回收之LRU鏈表機制原理
內(nèi)存管理系列(六):虛擬內(nèi)存和物理內(nèi)存機制原理
內(nèi)存管理系列(七):Malloc缺頁中斷不同情況處理總結(jié)及反向映射RMAP
內(nèi)存管理系列(八):C/C++開發(fā)中的Malloc函數(shù)的實現(xiàn)原理
內(nèi)存管理系列(九):深入理解glibc malloc:內(nèi)存分配器實現(xiàn)原理
內(nèi)存管理系列(十):操作系統(tǒng)是如何對內(nèi)存進行管理的,內(nèi)存與CPU之間的關(guān)系
內(nèi)存管理系列(十一):為什么Linux需要虛擬內(nèi)存,虛擬內(nèi)存對操作系統(tǒng)有哪些作用
內(nèi)存管理系列(十二):用戶態(tài)內(nèi)存內(nèi)存映射函數(shù)Mmap的好處
內(nèi)存管理系列(十三):內(nèi)存管理:詳解虛擬地址空間-MMU
內(nèi)存管理系列(十四):C語言中的Malloc/free是如何分配內(nèi)存的
內(nèi)存管理系列(十五):從虛擬尋址到開源項目,Linux下的內(nèi)存管理詳解
內(nèi)存管理系列(十六):一文帶你了解,虛擬內(nèi)存、內(nèi)存分頁、分段、段頁式內(nèi)存管理
內(nèi)存管理系列(十七):Linux應(yīng)用程序究竟消耗了多少內(nèi)存
內(nèi)存管理系列(十八):虛擬地址到物理地址,是什么時候開始映射
內(nèi)存管理系列(十九):淺析Linux內(nèi)存管理中SLAB分配器(源碼分析)
內(nèi)存管理系列(二十):基于Linux內(nèi)存管理的內(nèi)存分配(伙伴算法和slab算法)
內(nèi)存管理系列(二十一):探索內(nèi)存原理的內(nèi)存映射文件(圖文詳解)
內(nèi)存管理系列(二十二):吊打字節(jié)面試官,CPU緩存一致性協(xié)議MESI
內(nèi)存管理系列(二十三):深入理解Linux內(nèi)核頁表映射分頁機制原理
內(nèi)存管理系列(二十四):談?wù)勎锢韮?nèi)存與虛擬內(nèi)存之間的映射(超詳細(xì)~)
內(nèi)存管理系列(二十五):內(nèi)存管理:C/C++開發(fā)中的malloc函數(shù)的實現(xiàn)原理
內(nèi)存管理系列(二十六):熬夜肝翻Linux內(nèi)存管理所有知識點(圖解)
內(nèi)存管理進階部分(一):brk/kmalloc/vmalloc系統(tǒng)調(diào)用分析
內(nèi)存管理進階部分(二):不連續(xù)內(nèi)存分配器原理
內(nèi)存管理進階部分(三):頁表緩存(TLB)與巨型頁
內(nèi)存管理進階部分(四):TLB表項格式及管理
內(nèi)存管理進階部分(五):ASID原理/VMID原理
內(nèi)存管理進階部分(六):處理器對巨型頁的支持
內(nèi)存管理進階部分(七):標(biāo)準(zhǔn)巨型頁原理及查看
內(nèi)存管理進階部分(八):LRU算法與反向映射
內(nèi)存管理進階部分(九):缺頁異常分析
內(nèi)存管理進階部分(十):寫時復(fù)制缺頁異常
內(nèi)存管理進階部分(十一):do_ page_ fault函教分析
內(nèi)存管理進階部分(十二):文件映射缺頁中斷
內(nèi)存管理進階部分(十三):匿名頁面缺頁異常
內(nèi)存管理進階部分(十四):內(nèi)存反碎片技術(shù)
內(nèi)存管理進階部分(十五):內(nèi)存碎片整理算法
內(nèi)存管理進階部分(十六):虛擬可移動區(qū)域技術(shù)原理
內(nèi)存管理進階部分(十七):內(nèi)存檢測與死鎖檢測
內(nèi)存管理進階部分(十八):內(nèi)核調(diào)優(yōu)參數(shù)
內(nèi)存管理進階部分(十九):/proc/sys/kernel/
內(nèi)存管理進階部分(二十):/proc/sys/ vm/
內(nèi)存管理進階部分(二十一):/proc/sys/fs/
內(nèi)存管理進階部分(二十二):內(nèi)存屏障與內(nèi)核互斥原理
內(nèi)存管理進階部分(二十三):編譯器屏障
內(nèi)存管理進階部分(二十四):處理器屏障
內(nèi)存管理進階部分(二十五):ARM64處理器內(nèi)存屏障分析
內(nèi)存管理進階部分(二十六):內(nèi)存與Kasan工具分析
內(nèi)存管理進階部分(二十七):五大常見內(nèi)存訪問錯誤
內(nèi)存管理進階部分(二十八):Kasan內(nèi)核檢測工具應(yīng)用
內(nèi)存管理進階部分(二十九):頁回收原理機制
內(nèi)存管理進階部分(三十):發(fā)起頁回收
內(nèi)存管理進階部分(三十一):計算掃描頁數(shù)
內(nèi)存管理進階部分(三十二):收縮活動頁鏈表
內(nèi)存管理進階部分(三十三):回收不活動頁
內(nèi)存管理進階部分(三十四):頁交換與回收slab緩存
內(nèi)存管理進階部分(三十五):緩存著色
內(nèi)存管理進階部分(三十六):內(nèi)存緩存數(shù)據(jù)結(jié)構(gòu)
內(nèi)存管理進階部分(三十七):空閑對象鏈表及著色
內(nèi)存管理進階部分(三十八):內(nèi)核調(diào)試方法printk/oops分析
內(nèi)存管理實戰(zhàn)操作(一): SIab塊分配器實現(xiàn)
內(nèi)存管理實戰(zhàn)操作(二):進程地址空間在內(nèi)核(VMA實現(xiàn))
內(nèi)存管理實戰(zhàn)操作(三):內(nèi)存池原理及實現(xiàn)
內(nèi)存管理實戰(zhàn)操作(四): perf性能分析工具
內(nèi)存管理實戰(zhàn)操作(五):perf原理機制與安裝配置
內(nèi)存管理實戰(zhàn)操作(六):perf采集數(shù)據(jù)命令-29種工具應(yīng)用
內(nèi)存管理實戰(zhàn)操作(七):perf采集數(shù)據(jù)至火焰圖分析
(4)進程管理專題【視頻講解】
進程管理的重點是流程的實施。在內(nèi)核中,這些進程稱為線程,代表單個處理器虛擬化(線程代碼、數(shù)據(jù)、堆棧和CPU寄存器)。在用戶空間中,通常使用術(shù)語進程,但是Linux實現(xiàn)沒有區(qū)分這兩個概念(進程和線程)。內(nèi)核SCI提供了一個應(yīng)用程序編程接口(API)來創(chuàng)建一個新的進程(fork,exec或可移植操作系統(tǒng)接口[POSIX]函數(shù)),停止進程(kill,exit),并進行通信和同步(signal或POSIX機制)。
進程管理還包括處理活動進程之間共享CPU的需求。內(nèi)核實現(xiàn)了新的調(diào)度算法,無論多少個線程爭奪CPU,都可以在固定的時間內(nèi)運行。這種算法被稱為O(1) scheduler,這意味著它調(diào)度多個線程所用的時間與調(diào)度一個線程所用的時間相同。O(1)調(diào)度器也可以支持多處理器(稱為對稱多處理器或SMP)。您可以在中找到流程管理的源代碼。/linux/kernel,以及。/linux/arch。
進程管理系列(一):Linux進程管理原理詳解(代碼演示)
進程管理系列(二):十分鐘讓你像大佬一樣快速了解進程狀態(tài)(二種模型)
進程管理系列(三):作為互聯(lián)網(wǎng)程序員,應(yīng)該了解Linux進程六種狀態(tài)嗎?
進程管理系列(四):五分鐘讓你快速了解Linux進程管理實時調(diào)度與SMP
進程管理系列(六):淺析Linux的進程優(yōu)先級(代碼演示)
進程管理系列(七):進程管理|淺析C語言中并發(fā)同步與原子操作,鎖三者是什么關(guān)系
進程管理系列(八):進程管理|深入理解Linux進程述符和進程狀態(tài)
進程管理系列(九):一文讀懂Linux內(nèi)核中的任務(wù)間調(diào)度策略
進程管理系列(十):Linux內(nèi)核之進程和線程的創(chuàng)建和派生
進程管理系列(十一):基于Linux有幾種進程狀態(tài)
進程管理系列(十二):操作系統(tǒng)的幾種CPU調(diào)度策略
進程管理系列(十二):Linux 進程管理之調(diào)度和進程切換
進程管理系列(十三):一文搞懂六大進程通信機制原理(全網(wǎng)最詳細(xì))
進程管理系列(十四):超詳細(xì)的Socket通信原理和實例講解(白嫖走起~)
進程管理系列(十五):這是一份很全很全的IO基礎(chǔ)知識與概念
進程管理系列(十六):深入理解Linux內(nèi)核進程的管理與調(diào)度(全知乎最詳細(xì))
進程管理基礎(chǔ)(十七):Linux內(nèi)核源碼組織結(jié)構(gòu)分析
進程管理基礎(chǔ)(十八):Linux內(nèi)核(五大子系統(tǒng)關(guān)系)
進程管理基礎(chǔ)(十九):內(nèi)核源碼目錄結(jié)構(gòu)詳解
進程管理基礎(chǔ)(二十):如何快速掌握閱讀內(nèi)核源碼方法與技巧
存儲器結(jié)構(gòu)與分區(qū)存儲管理(一):主存儲器結(jié)構(gòu)及技術(shù)指標(biāo)
存儲器結(jié)構(gòu)與分區(qū)存儲管理(二):分配策略與分區(qū)回收
存儲器結(jié)構(gòu)與分區(qū)存儲管理(三):頁表與交換技術(shù)
存儲器結(jié)構(gòu)與分區(qū)存儲管理(四):物理內(nèi)存與虛擬內(nèi)存
x86_ _ARM處理器架構(gòu)(一):x86架構(gòu)整體部件分析
x86_ _ARM處理器架構(gòu)(二):ARM處理器架構(gòu)分析
x86_ _ARM處理器架構(gòu)(三):64位通用寄存器結(jié)構(gòu)
x86_ _ARM處理器架構(gòu)(四): 匯編基礎(chǔ)與尋址方式
x86_ _ARM處理器架構(gòu)(五):SMP架構(gòu)與NUMA架構(gòu)
x86_ _ARM處理器架構(gòu)(六):ARM Cortex-A9處理器架構(gòu)
x86_ _ARM處理器架構(gòu)(七):ARM常用指令系統(tǒng)詳解
進程原理與生命周期及系統(tǒng)調(diào)用(一):寫時復(fù)制原理
進程原理與生命周期及系統(tǒng)調(diào)用(二):進程內(nèi)存布局
進程原理與生命周期及系統(tǒng)調(diào)用(三):進程堆棧管理
進程原理與生命周期及系統(tǒng)調(diào)用(四):系統(tǒng)調(diào)用實現(xiàn)
進程原理與生命周期及系統(tǒng)調(diào)用(五):調(diào)度器及CFS調(diào)度器
進程原理與生命周期及系統(tǒng)調(diào)用(六):實時調(diào)度類及SMP和NUMA
進程原理與生命周期及系統(tǒng)調(diào)用(七):task_ struct數(shù)據(jù)結(jié)構(gòu)分析
進程原理與生命周期及系統(tǒng)調(diào)用(八):進程內(nèi)核do_ fork()/kernel_ _clone()函數(shù)分析
進程原理與生命周期及系統(tǒng)調(diào)用(九):RCU機制及內(nèi)存優(yōu)化屏障
進程原理與生命周期及系統(tǒng)調(diào)用(十):內(nèi)核內(nèi)存布局和堆管理.
進程原理與生命周期及系統(tǒng)調(diào)用(十一):實戰(zhàn)操作:內(nèi)核數(shù)據(jù)結(jié)構(gòu)(鏈表和紅黑樹)
(5)網(wǎng)絡(luò)協(xié)議棧專題【視頻講解】
協(xié)議棧(英語:Protocol stack),又稱協(xié)議堆疊,是計算機網(wǎng)絡(luò)協(xié)議套件的一個具體的軟件實現(xiàn)。協(xié)議套件中的一個協(xié)議通常是只為一個目的而設(shè)計的,這樣可以使得設(shè)計更容易。因為每個協(xié)議模塊通常都要和其他兩個通信,它們通??梢韵胂蟪墒菂f(xié)議棧中的層。最低級的協(xié)議總是描述與硬件的物理交互。每個高級的層次增加更多的特性。用戶應(yīng)用程序只是處理最上層的協(xié)議。使用最廣泛的是英特網(wǎng)協(xié)議棧,由上到下的協(xié)議分別是:應(yīng)用層(HTTP,TELNET,DNS,EMAIL等),運輸層(TCP,UDP),網(wǎng)絡(luò)層(IP),鏈路層(WI-FI,以太網(wǎng),令牌環(huán),F(xiàn)DDI等),物理層。
在實際中,協(xié)議棧通常分為三個主要部分:媒體,傳輸和應(yīng)用。一個特定的操作系統(tǒng)或平臺往往有兩個定義良好的軟件接口:一個在媒體層與傳輸層之間,另一個在傳輸層和應(yīng)用程序之間。
媒體到傳輸接口定義了傳輸協(xié)議的軟件怎樣使用特定的媒體和硬件(“驅(qū)動程序”)。例如,此接口定義的TCP/IP傳輸軟件怎么與以太網(wǎng)硬件對話。這些接口的例子包括Windows和DOS環(huán)境下的ODI和NDIS。
應(yīng)用到傳輸接口定義了應(yīng)用程序如何利用傳輸層。例如,此接口定義一個網(wǎng)頁瀏覽器程序怎樣和TCP/IP傳輸軟件對話。這些接口的例子包括Unix世界中的伯克利套接字和微軟的Winsock。
【 強烈推薦閱讀】嵌入式必備:如何學(xué)習(xí)Linux內(nèi)核網(wǎng)絡(luò)協(xié)議棧
趣談網(wǎng)絡(luò)協(xié)議棧(一):套接字緩沖區(qū)原理
趣談網(wǎng)絡(luò)協(xié)議棧(二):數(shù)據(jù)包是如何處理的過程
趣談網(wǎng)絡(luò)協(xié)議棧(三):七層模型下三層數(shù)據(jù)通信
趣談網(wǎng)絡(luò)協(xié)議棧(四):傳輸?shù)腁rp報文結(jié)構(gòu)
趣談網(wǎng)絡(luò)協(xié)議棧(五):Socket編程常用函數(shù)的原理及代碼實現(xiàn)
趣談網(wǎng)絡(luò)協(xié)議棧(六):學(xué)習(xí)select和poll函數(shù)的內(nèi)核實現(xiàn)
趣談網(wǎng)絡(luò)協(xié)議棧(七):Epoll從用戶態(tài)到內(nèi)核態(tài)過程分析
趣談網(wǎng)絡(luò)協(xié)議棧(八):套接字發(fā)送網(wǎng)絡(luò)數(shù)據(jù)的過程
(6)設(shè)備驅(qū)動專題【視頻講解】
設(shè)備驅(qū)動程序是一種計算機程序,用于操作或控制連接到計算機的特定類型的設(shè)備。驅(qū)動程序提供了通往硬件設(shè)備的軟件接口,從而使操作系統(tǒng)和其他計算機程序可以訪問硬件功能,而無需知道有關(guān)所使用硬件的確切細(xì)節(jié)。
驅(qū)動程序通過硬件連接到的計算機總線或通信子系統(tǒng)與設(shè)備進行通信。當(dāng)調(diào)用程序調(diào)用驅(qū)動程序中的例程時,驅(qū)動程序向設(shè)備發(fā)出命令。設(shè)備將數(shù)據(jù)發(fā)送回驅(qū)動程序后,驅(qū)動程序可以調(diào)用原始調(diào)用程序中的例程。驅(qū)動程序依賴于硬件且特定于操作系統(tǒng)。它們通常提供任何必要的異步時間相關(guān)的硬件接口所需的中斷處理。
設(shè)備驅(qū)動基礎(chǔ)架構(gòu)(一):I/0體系結(jié)構(gòu)
設(shè)備驅(qū)動基礎(chǔ)架構(gòu)(二):系統(tǒng)總線(PC1、ISA、SCSI、 USB等)
設(shè)備驅(qū)動基礎(chǔ)架構(gòu)(三):與外設(shè)交互及控制設(shè)備
設(shè)備驅(qū)動基礎(chǔ)架構(gòu)(四):訪問設(shè)備詳解
設(shè)備驅(qū)動基礎(chǔ)架構(gòu)(五):內(nèi)核塊設(shè)備詳解
設(shè)備驅(qū)動基礎(chǔ)架構(gòu)(六):塊設(shè)備1/0操作集合及 源碼分析
設(shè)備驅(qū)動基礎(chǔ)架構(gòu)(七):通用磁盤及分區(qū)源碼分析
Linux設(shè)備模型(一):深度剖析LDM
Linux設(shè)備模型(二):LDM數(shù)據(jù)結(jié)構(gòu)分析
Linux設(shè)備模型(三):設(shè)備驅(qū)動程序原理與實現(xiàn)
Linux設(shè)備模型(四):kobject結(jié)構(gòu)分析
Linux設(shè)備模型(五):kobj_ _type/內(nèi)核對象集合
Linux設(shè)備模型(六):sysfs文件及屬性
Linux設(shè)備模型(七):輪詢sysfs屬性文件
字符設(shè)備操作(一):主設(shè)備與次設(shè)備
字符設(shè)備操作(二):打開設(shè)備文件
字符設(shè)備操作(三):分配與注冊字符設(shè)備
字符設(shè)備操作(四):寫文件操作實現(xiàn)
字符設(shè)備操作(五):open/release方法
字符設(shè)備操作(六):read/wr ite方法
字符設(shè)備操作(七):Iseek/po11方法
字符設(shè)備操作(八):填充file_ operations結(jié)構(gòu)體
塊設(shè)備操作(一):塊設(shè)備表示與數(shù)據(jù)結(jié)構(gòu)
塊設(shè)備操作(二):向系統(tǒng)添加磁盤及分區(qū)
塊設(shè)備操作(三):打開塊設(shè)備文件
塊設(shè)備操作(四):B10數(shù)據(jù)結(jié)構(gòu)
塊設(shè)備操作(五):1/0調(diào)度
塊設(shè)備操作(六):ioctl 系統(tǒng)調(diào)用
塊設(shè)備操作(七):總線系統(tǒng)模塊
塊設(shè)備操作(八):ISA總線
塊設(shè)備操作(九):PCI/PCI-E總線
塊設(shè)備操作(十):USB總線
塊設(shè)備操作(十一):通用驅(qū)動程序模型
淺談設(shè)備驅(qū)動(一):操作系統(tǒng) I/O 流程詳解
淺談設(shè)備驅(qū)動(二):Linux操作系統(tǒng)學(xué)習(xí)之字符設(shè)備
淺談設(shè)備驅(qū)動(三):結(jié)合設(shè)備信息集合,探究設(shè)備和驅(qū)動是如何綁定的
(7)文件系統(tǒng)【視頻講解】
虛擬文件系統(tǒng)(VFS)是Linux內(nèi)核的一個非常有用的方面,因為它為文件系統(tǒng)提供了一個通用的接口抽象。VFS在SCI和內(nèi)核支持的文件系統(tǒng)之間提供了一個交換層(參見圖4)。
文件系統(tǒng)類型與文件模型研究(零):一文讓你徹底了解Linux內(nèi)核文件系統(tǒng)(大總結(jié))
文件系統(tǒng)類型與文件模型研究(一):磁盤文件系統(tǒng)(DF)
文件系統(tǒng)類型與文件模型研究(二):網(wǎng)絡(luò)文件系統(tǒng)(NF)
文件系統(tǒng)類型與文件模型研究(三):i node
文件系統(tǒng)類型與文件模型研究(四):鏈接
文件系統(tǒng)類型與文件模型研究(五):AP|編程接口
文件系統(tǒng)類型與文件模型研究(六):VFS數(shù)據(jù)結(jié)構(gòu)
文件系統(tǒng)類型與文件模型研究(七):超級塊(super_ block)
文件系統(tǒng)類型與文件模型研究(八):掛載描述符 (mount結(jié)構(gòu)體)
文件系統(tǒng)類型與文件模型研究(九):索引結(jié)點(inode結(jié)構(gòu)體)
文件系統(tǒng)類型與文件模型研究(十):目錄項緩存(dentry結(jié)構(gòu)體)
文件系統(tǒng)類型與文件模型研究(十一):文件系統(tǒng)調(diào)用打開/關(guān)閉文件
文件系統(tǒng)類型與文件模型研究(十二):文件系統(tǒng)調(diào)用創(chuàng)建/刪除文件
文件系統(tǒng)類型與文件模型研究(十三):文件系統(tǒng)調(diào)用讀/寫文件實現(xiàn)
文件系統(tǒng)類型與文件模型研究(十四):文件回寫技術(shù)原理/接口實現(xiàn)
文件系統(tǒng)類型與文件模型研究(十五):掛載文件系統(tǒng)系統(tǒng)調(diào)用mount處理流程
文件系統(tǒng)類型與文件模型研究(十六):掛載文件系統(tǒng)綁定掛載/掛載命名空間
文件系統(tǒng)類型與文件模型研究(十七):掛載文件系統(tǒng)掛載/注冊rootfs文件系統(tǒng)
磁盤文件系統(tǒng)(一):Ext2文件系統(tǒng)
磁盤文件系統(tǒng)(二):Ext2物理結(jié)構(gòu)
磁盤文件系統(tǒng)(三):Ext2數(shù)據(jù)結(jié)構(gòu)分析
磁盤文件系統(tǒng)(四):Ext2文件系統(tǒng)操作
磁盤文件系統(tǒng)(五): Ext4_ 日志JBD2
磁盤文件系統(tǒng)(六):Ext4文件系統(tǒng)特性
磁盤文件系統(tǒng)(七):Ext4文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu)
磁盤文件系統(tǒng)(八):Ext4_日志JBD2
數(shù)據(jù)同步(一):內(nèi)核定時器
數(shù)據(jù)同步(二):原子操作與屏障
數(shù)據(jù)同步(三):自旋鎖機制
數(shù)據(jù)同步(四):自旋鎖的實現(xiàn)與變體
數(shù)據(jù)同步(五):spin_ lock()/raw_ spin_ lock() 函數(shù)分析
數(shù)據(jù)同步(六):互斥鎖
數(shù)據(jù)同步(一):mutex數(shù)據(jù)結(jié)構(gòu)分析
數(shù)據(jù)同步(一):互斥鎖的快速與慢速通道
數(shù)據(jù)同步(一):樂觀自旋鎖等待機制
數(shù)據(jù)同步(一):mutex_ un lock()函數(shù)分析
數(shù)據(jù)同步(一):讀寫鎖與RCU
(8)網(wǎng)絡(luò)堆棧
網(wǎng)絡(luò)堆棧的設(shè)計遵循模擬協(xié)議本身的分層架構(gòu)?;叵胍幌?,互聯(lián)網(wǎng)協(xié)議(IP)是傳輸協(xié)議(通常稱為傳輸控制協(xié)議或TCP)下的核心網(wǎng)絡(luò)層協(xié)議。TCP是上面的套接字層,通過SCI調(diào)用。套接字層是網(wǎng)絡(luò)子系統(tǒng)的標(biāo)準(zhǔn)API,它為各種網(wǎng)絡(luò)協(xié)議提供了一個用戶接口。從原始幀訪問到IP協(xié)議數(shù)據(jù)單元(PDU),再到TCP和用戶數(shù)據(jù)報協(xié)議(UDP),套接字層提供了一種標(biāo)準(zhǔn)化的方式來管理連接并在各種端點之間移動數(shù)據(jù)。內(nèi)核網(wǎng)絡(luò)源代碼可以在。/linux/net。
(9)設(shè)備驅(qū)動程序
Linux內(nèi)核很多代碼都在設(shè)備驅(qū)動里,可以運行特定的硬件設(shè)備。Linux源碼樹提供了一個驅(qū)動子目錄,該子目錄又進一步劃分為各種支持設(shè)備,如藍(lán)牙、I2C、串口等。設(shè)備驅(qū)動程序的代碼可以在。/Linux/驅(qū)動程序。
(10)依賴體系結(jié)構(gòu)的代碼
雖然Linux很大程度上獨立于運行的架構(gòu),但為了正常運行和實現(xiàn)更高的效率,一些元素必須考慮架構(gòu)。的。/linux/arch子目錄定義了內(nèi)核源代碼中依賴于架構(gòu)的部分,其中包含了各種特定于架構(gòu)的子目錄(它們共同構(gòu)成了BSP)。對于典型的桌面系統(tǒng),使用x86目錄。每個架構(gòu)子目錄包含許多其他子目錄,每個子目錄專注于內(nèi)核的特定方面,如引導(dǎo)、內(nèi)核、內(nèi)存管理等。這些依賴于架構(gòu)的代碼可以在。/linux/arch。
如果Linux內(nèi)核的可移植性和效率不夠好的話,Linux還提供了一些其他的特性,不能歸入以上幾類。作為生產(chǎn)操作系統(tǒng)和開源軟件,Linux是測試新協(xié)議及其增強的良好平臺。Linux支持大量的網(wǎng)絡(luò)協(xié)議,包括典型的TCP/IP,以及高速網(wǎng)絡(luò)的擴展(大于1千兆以太網(wǎng)[GbE]和10 GbE)。Linux還可以支持諸如流控制傳輸協(xié)議(SCTP)之類的協(xié)議,它提供了比TCP更高級的特性(它是傳輸層協(xié)議的繼承者)。Linux也是一個動態(tài)內(nèi)核,支持動態(tài)添加或刪除軟件組件。它們被稱為可動態(tài)加載的內(nèi)核模塊,可以由用戶根據(jù)需要在引導(dǎo)時插入(目前,一個特定的設(shè)備需要這個模塊),也可以在任何時候插入。Linux的最新增強是可以作為其他操作系統(tǒng)使用的操作系統(tǒng)(稱為hypervisor)。最近,內(nèi)核被修改并被稱為基于內(nèi)核的虛擬機(KVM)。這一修改為用戶空間啟用了一個新的接口,允許其他操作系統(tǒng)在啟用KVM的內(nèi)核上運行。除了運行Linux的其他實例,Microsoft Windows也可以虛擬化。唯一的限制是底層處理器必須支持新的虛擬化指令。
(11)依賴體系結(jié)構(gòu)的代碼
雖然Linux很大程度上獨立于運行的架構(gòu),但為了正常運行和實現(xiàn)更高的效率,一些元素必須考慮架構(gòu)。的。/linux/arch子目錄定義了內(nèi)核源代碼中依賴于架構(gòu)的部分,其中包含了各種特定于架構(gòu)的子目錄(它們共同構(gòu)成了BSP)。對于典型的桌面系統(tǒng),使用x86目錄。每個架構(gòu)子目錄包含許多其他子目錄,每個子目錄專注于內(nèi)核的特定方面,如引導(dǎo)、內(nèi)核、內(nèi)存管理等。這些依賴于架構(gòu)的代碼可以在。/linux/arch。
如果Linux內(nèi)核的可移植性和效率不夠好的話,Linux還提供了一些其他的特性,不能歸入以上幾類。作為生產(chǎn)操作系統(tǒng)和開源軟件,Linux是測試新協(xié)議及其增強的良好平臺。Linux支持大量的網(wǎng)絡(luò)協(xié)議,包括典型的TCP/IP,以及高速網(wǎng)絡(luò)的擴展(大于1千兆以太網(wǎng)[GbE]和10 GbE)。Linux還可以支持諸如流控制傳輸協(xié)議(SCTP)之類的協(xié)議,它提供了比TCP更高級的特性(它是傳輸層協(xié)議的繼承者)。Linux也是一個動態(tài)內(nèi)核,支持動態(tài)添加或刪除軟件組件。它們被稱為可動態(tài)加載的內(nèi)核模塊,可以由用戶根據(jù)需要在引導(dǎo)時插入(目前,一個特定的設(shè)備需要這個模塊),也可以在任何時候插入。Linux的最新增強是可以作為其他操作系統(tǒng)使用的操作系統(tǒng)(稱為hypervisor)。最近,內(nèi)核被修改并被稱為基于內(nèi)核的虛擬機(KVM)。這一修改為用戶空間啟用了一個新的接口,允許其他操作系統(tǒng)在啟用KVM的內(nèi)核上運行。除了運行Linux的其他實例,Microsoft Windows也可以虛擬化。唯一的限制是底層處理器必須支持新的虛擬化指令。
(12)面試題/經(jīng)驗
面試題一
1、什么是Linux?
2、Unix和Linux有什么區(qū)別?
3、什么是 Linux 內(nèi)核?
4、Linux的基本組件是什么?
5、Linux 的體系結(jié)構(gòu)
6、BASH和DOS之間的基本區(qū)別是什么?
7、Linux 開機啟動過程?
8、Linux系統(tǒng)缺省的運行級別?
9、Linux 使用的進程間通信方式?
10、Linux 有哪些系統(tǒng)日志文件?
11、Linux系統(tǒng)安裝多個桌面環(huán)境有幫助嗎?
12、什么是交換空間?
13、什么是root帳戶?
14、什么是LILO?
15、什么是BASH?
16、什么是CLI?
17、什么是GUI?
18、開源的優(yōu)勢是什么?
19、簡單 Linux 文件系統(tǒng)?
20、Linux 的目錄結(jié)構(gòu)是怎樣的?
21、什么是 inode ?
22、什么是硬鏈接和軟鏈接?
23、RAID 是什么?
24、一臺 Linux 系統(tǒng)初始化環(huán)境后需要做一些什么安全工作?
25、什么叫 CC 攻擊?什么叫 DDOS 攻擊?
26、什么是網(wǎng)站數(shù)據(jù)庫注入?
27、Shell 腳本是什么?
28、可以在 Shell 腳本中使用哪些類型的變量?
29、Shell 腳本中 if 語法如何嵌套?
30、Shell 腳本中 case 語句的語法?
31、Shell 腳本中 for 循環(huán)語法?
32、Shell 腳本中 while 循環(huán)語法?
33、如何使腳本可執(zhí)行?
34、在 Shell 腳本如何定義函數(shù)呢?
35、判斷一文件是不是字符設(shè)備文件,如果是將其拷貝到 /dev 目錄下?
36、添加一個新組為 class1 ,然后添加屬于這個組的 30 個用戶,用戶名的形式為 stdxx ,其中 xx 從 01 到 30 ?
37、寫一個 sed 命令,修改 /tmp/input.txt 文件的內(nèi)容?
38、用戶進程間通信主要哪幾種方式?
39、通過伙伴系統(tǒng)申請內(nèi)核內(nèi)存的函數(shù)有哪些?
40、Linux 虛擬文件系統(tǒng)的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)有哪些?(至少寫出四個)
41、對文件或設(shè)備的操作函數(shù)保存在那個數(shù)據(jù)結(jié)構(gòu)中?
42、Linux 中的文件包括哪些?
43、創(chuàng)建進程的系統(tǒng)調(diào)用有那些?
44、調(diào)用 schedule()進行進程切換的方式有幾種?
45、Linux 調(diào)度程序是根據(jù)進程的動態(tài)優(yōu)先級還是靜態(tài)優(yōu)先級來調(diào)度進程的?
46、進程調(diào)度的核心數(shù)據(jù)結(jié)構(gòu)是哪個?
47、如何加載、卸載一個模塊?
48、模塊和應(yīng)用程序分別運行在什么空間?
49、Linux 中的浮點運算由應(yīng)用程序?qū)崿F(xiàn)還是內(nèi)核實現(xiàn)?
50、模塊程序能否使用可鏈接的庫函數(shù)?
51、TLB 中緩存的是什么內(nèi)容?
52、Linux 中有哪幾種設(shè)備?
53、字符設(shè)備驅(qū)動程序的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)是哪個?
54、設(shè)備驅(qū)動程序包括哪些功能函數(shù)?
55、如何唯一標(biāo)識一個設(shè)備?
56、Linux 通過什么方式實現(xiàn)系統(tǒng)調(diào)用?
57、Linux 軟中斷和工作隊列的作用是什么?
58、Linux開機啟動過程?
59、Linux系統(tǒng)缺省的運行級別
60、Linux系統(tǒng)是由那些部分組成?
61、硬鏈接和軟鏈接有什么區(qū)別?
62、如何規(guī)劃一臺Linux主機,步驟是怎樣?
63、查看系統(tǒng)當(dāng)前進程連接數(shù)?
64、如何在/usr目錄下找出大小超過10MB的文件?
65、添加一條到192.168.3.0/24的路由,網(wǎng)關(guān)為192.168.1.254?
66、如何在/var目錄下找出90天之內(nèi)未被訪問過的文件?
67、如何在/home目錄下找出120天之前被修改過的文件?
68、在整個目錄樹下查找文件“core”,如發(fā)現(xiàn)則無需提示直接刪除它們。
69、有一普通用戶想在每周日凌晨零點零分定期備份/user/backup到/tmp目錄下,該用戶應(yīng)如何做?
70、每周一下午三點將/tmp/logs目錄下面的后綴為*.log的所有文件rsync同步到備份服務(wù)器192.168.1.100中同樣的目錄下面,crontab配置項該如何寫?
71、找到/tmp/目錄下面的所有名稱以"s1.jpg"結(jié)尾的普通文件,如果其修改日期在一天內(nèi),則將其打包到/tmp/back.tar.gz文件中
72、配置mysql服務(wù)器的時候,配置了auto_increment_increment=3,請問這里的3意味著什么?
73、詳細(xì)說明keepalived的故障切換工作原理
74、什么是系統(tǒng)調(diào)用?
75、進程和線程的區(qū)別?
76、進程有哪幾種狀態(tài)?
77、進程間的通信方式
78、線程間的同步的方式
79、進程的調(diào)度算法
80、操作系統(tǒng)的內(nèi)存管理主要是做什么?
81、常見的幾種內(nèi)存管理機制
82、快表和多級頁表
83、分頁機制和分段機制的共同點和區(qū)別
84、邏輯(虛擬)地址和物理地址
85、CPU 尋址了解嗎?為什么需要虛擬地址空間?
86、什么是虛擬內(nèi)存(Virtual Memory)?
87、局部性原理
88、虛擬存儲器
89、虛擬內(nèi)存的技術(shù)實現(xiàn)
90、頁面置換算法
面試題二
1、絕對路徑用什么符號表示?當(dāng)前目錄、上層目錄用什么表示?主目錄用什么表示? 切換目錄用什么命令?
2、怎么查看當(dāng)前進程?怎么執(zhí)行退出?怎么查看當(dāng)前路徑?
3、怎么清屏?怎么退出當(dāng)前命令?怎么執(zhí)行睡眠?怎么查看當(dāng)前用戶 id?查看指定幫助用什么命令?
4、Ls 命令執(zhí)行什么功能? 可以帶哪些參數(shù),有什么區(qū)別?
5、建立軟鏈接(快捷方式),以及硬鏈接的命令。
6、目錄創(chuàng)建用什么命令?創(chuàng)建文件用什么命令?復(fù)制文件用什么命令?
7、使用哪一個命令可以查看自己文件系統(tǒng)的磁盤空間配額呢?
8、查看文件內(nèi)容有哪些命令可以使用?
9、隨意寫文件命令?怎么向屏幕輸出帶空格的字符串,比如”hello world”?
10、終端是哪個文件夾下的哪個文件?黑洞文件是哪個文件夾下的哪個命令?
11、移動文件用哪個命令?改名用哪個命令?
12、復(fù)制文件用哪個命令?如果需要連同文件夾一塊復(fù)制呢?如果需要有提示功能呢?
13、刪除文件用哪個命令?如果需要連目錄及目錄下文件一塊刪除呢?刪除空文件夾用什么命令?
14、Linux 下命令有哪幾種可使用的通配符?分別代表什么含義?
15、用什么命令對一個文件的內(nèi)容進行統(tǒng)計?(行號、單詞數(shù)、字節(jié)數(shù))
16、Grep 命令有什么用? 如何忽略大小寫? 如何查找不含該串的行?
17、Linux 中進程有哪幾種狀態(tài)?在 ps 顯示出來的信息中,分別用什么符號表示的?
18、怎么使一個命令在后臺運行?
19、利用 ps 怎么顯示所有的進程? 怎么利用 ps 查看指定進程的信息?
20、哪個命令專門用來查看后臺任務(wù)?
21、把后臺任務(wù)調(diào)到前臺執(zhí)行使用什么命令?把停下的后臺任務(wù)在后臺執(zhí)行起來用什么命令?
22、終止進程用什么命令? 帶什么參數(shù)?
23、怎么查看系統(tǒng)支持的所有信號?
24、搜索文件用什么命令? 格式是怎么樣的?
25、查看當(dāng)前誰在使用該主機用什么命令? 查找自己所在的終端信息用什么命令?
26、使用什么命令查看用過的命令列表?
27、使用什么命令查看磁盤使用空間? 空閑空間呢?
28、使用什么命令查看網(wǎng)絡(luò)是否連通?
29、使用什么命令查看 ip 地址及接口信息?
30、查看各類環(huán)境變量用什么命令?
31、通過什么命令指定命令提示符?
32、查找命令的可執(zhí)行文件是去哪查找的? 怎么對其進行設(shè)置及添加?
33、通過什么命令查找執(zhí)行命令?
34、怎么對命令進行取別名?
35、du 和 df 的定義,以及區(qū)別?
36、awk 詳解?
37、當(dāng)你需要給命令綁定一個宏或者按鍵的時候,應(yīng)該怎么做呢?
38、如果一個linux新手想要知道當(dāng)前系統(tǒng)支持的所有命令的列表,他需要怎么做?
39、如果你的助手想要打印出當(dāng)前的目錄棧,你會建議他怎么做?
40、你的系統(tǒng)目前有許多正在運行的任務(wù),在不重啟機器的條件下,有什么方法可以把所有正在運行的進程移除呢?
41、bash shell 中的hash 命令有什么作用?
42、哪一個bash內(nèi)置命令能夠進行數(shù)學(xué)運算?
43、怎樣一頁一頁地查看一個大文件的內(nèi)容呢?
44、數(shù)據(jù)字典屬于哪一個用戶的?
45、怎樣查看一個linux命令的概要與用法?假設(shè)你在/bin目錄中偶然看到一個你從沒見過的的命令,怎樣才能知道它的作用和用法呢?
(13)內(nèi)核書籍
《深入了解Linux內(nèi)核》
《Linux就該這么學(xué)》
《Linux內(nèi)核完全注釋V3.0書簽版》
《Linux命令行大全 - 紹茨 (william E.shotts)》
《Linux命令速查手冊》
《Linux性能優(yōu)化大師》
《Linux環(huán)境編程:從應(yīng)用到內(nèi)核》
《Linux集群和自動化運維 余洪春》
《Linux驅(qū)動程序開發(fā)實例(第2版)》
《Linux高級程序設(shè)計(第3版)》
《構(gòu)建高可用Linux服務(wù)器(第4版)》
書籍免費領(lǐng)取地址:https://docs.qq.com/doc/DTkZRWXRFcWx1bWVx
三、怎么閱讀源碼
Linux龐大而復(fù)雜,其核心包括進程管理、內(nèi)存管理、網(wǎng)絡(luò)、文件系統(tǒng)和arch-entity="2 " >驅(qū)動,這些都依賴于內(nèi)核提供的各種庫和接口、各種內(nèi)核機制以及arch下可能對應(yīng)的匯編。沒有這些基礎(chǔ),要流暢的閱讀代碼就有點困難了。
Linux的代碼量很大,而且是在gcc的基礎(chǔ)上開發(fā)的,針對各種場景做了大量的優(yōu)化。所以第二件事就是要熟悉gcc下C的擴展用法,要有一個好的代碼查看工具。推薦源洞察。
內(nèi)核運行在特定的硬件平臺上,所以對于底層涉及的部分有不同的arch實現(xiàn),包括大量的匯編操作,所以以arm為例。如果想研究內(nèi)核相應(yīng)部分的代碼,就必須多讀,熟悉arm的官方文檔。
而且代碼和資料基本都是英文的,一般詞匯和專業(yè)詞匯都有,所以英語基礎(chǔ)好很重要。這個沒有捷徑,就是多讀書,當(dāng)然也有積累的方法,后面會講到。
每個模塊都有很多細(xì)節(jié)??赡苣隳贻p的時候記性好吧。你開發(fā)一個模塊的時候,都讀了好幾遍了,所有的細(xì)節(jié)都不是很清楚。可能3、5年后再看就很難記住了,所以需要想辦法形成積累。否則可能會忘記看,辛苦又低效。
內(nèi)核編程有自己的風(fēng)格和一些公認(rèn)的規(guī)則,尤其是命名、排版、代碼文件分類等。有些可能不符合規(guī)則,也可能很好,但如果大家都這樣用,那自然就是所謂的藝術(shù)了,熟悉這些藝術(shù)有助于舉一反三的學(xué)習(xí)其他模塊的代碼。
內(nèi)核的代碼量與日俱增,模塊也越來越復(fù)雜,所以可維護性對于內(nèi)核來說也是非常重要的。所以在如何更有利于以后的維護上做了很多努力。內(nèi)核是操作系統(tǒng)的核心部分,其穩(wěn)定性和性能自然非常重要。它用了很多技巧來應(yīng)對。研究這些,積累起來,有利于進一步理解其原理。
邊看代碼邊寫注釋和筆記??戳硕嗌倌K就注釋多少模塊,慢慢形成一個積累。這樣的方式有什么好處呢?
記錄你看代碼過程中不熟悉或者不清晰的地方,或者你看明白了但是怕忘記的地方,這樣等你下次再來看你能很快回憶起來,且不斷刺激你的記憶神經(jīng)能讓你記憶的更牢固。
記錄內(nèi)核中用法的好處或者有疑問的地方,這樣你再次來看的話可能會有新的體會,能在之前看代碼的基礎(chǔ)上形成一個不斷積累的過程,理解會更加深刻。
當(dāng)你將內(nèi)核代碼模塊看的越來越多時,你會越看越輕松,當(dāng)然是不是也會驚訝一下。輕松的是這個模塊我看過,用法我熟悉,驚訝的是這個我雖然看過好多次,理解竟然有點不對。反反復(fù)復(fù)不斷進行下去。
查看代碼的工具
我這里推薦是source insight, 我一直用的3.5版本的。這里主要提幾點技巧。
3.5里面默認(rèn)只支持一部分文件格式,那么比如makefile是不支持的,arm匯編是不支持的,shell好像也是不支持的,所以這一部分的支持要自己添加。
內(nèi)核里面用了大量的宏以及一些gnu c的擴展關(guān)鍵字,這些需要在source insight里面添加 上,這樣你同步代碼就不會有一些不認(rèn)識的情況,當(dāng)然除了source insight本身的一些bug外。
source insight自建快捷鍵以及擴展功能,這些網(wǎng)上也有很多好的,可以參考,能提高效率。
四、Linux內(nèi)核體系
4.1Linux內(nèi)核體系結(jié)構(gòu)簡析簡析

頂部是用戶(或應(yīng)用程序)空間。這是用戶應(yīng)用程序執(zhí)行的地方。用戶空間下面是內(nèi)核空間,Linux內(nèi)核就位于這里。GNU C庫(glibc)也在這里。它為內(nèi)核提供了一個系統(tǒng)調(diào)用接口,也為用戶空間應(yīng)用程序和內(nèi)核之間的轉(zhuǎn)換提供了一個機制。這非常重要,因為內(nèi)核和用戶空間應(yīng)用程序使用不同的受保護地址空間。每個用戶空間進程使用自己的虛擬地址空間,而內(nèi)核占用一個單獨的地址空間。
Linux內(nèi)核可以進一步分為3層。最上面是系統(tǒng)調(diào)用接口,實現(xiàn)一些基本功能,比如讀寫。系統(tǒng)調(diào)用接口下面是內(nèi)核代碼,可以更準(zhǔn)確的定義為獨立于架構(gòu)的內(nèi)核代碼。這些代碼對于Linux支持的所有處理器架構(gòu)都是通用的。在這些代碼下面是依賴于架構(gòu)的代碼,它構(gòu)成了通常稱為BSP(板支持包)的部分。這些代碼用作給定架構(gòu)的處理器和平臺特定代碼。
Linux內(nèi)核實現(xiàn)了許多重要的架構(gòu)屬性。在更高或更低的層次上,內(nèi)核被分成幾個子系統(tǒng)。Linux也可以看做一個整體,因為它會把這些基礎(chǔ)服務(wù)都集成到內(nèi)核中。這與微內(nèi)核的架構(gòu)不同,微內(nèi)核提供一些基本的服務(wù),比如通信、I/O、內(nèi)存、進程管理等。更具體的服務(wù)被插入到微內(nèi)核層中。每個內(nèi)核都有自己的優(yōu)點,但這里不討論這個。
隨著時間的推移,Linux內(nèi)核在內(nèi)存和CPU使用上的效率很高,非常穩(wěn)定。但對于Linux來說,最有意思的是,在這個規(guī)模和復(fù)雜度的前提下,它仍然具有良好的可移植性。經(jīng)過編譯后,Linux可以在大量具有不同架構(gòu)約束和要求的處理器和平臺上運行。例如,Linux可以運行在帶有內(nèi)存管理單元(MMU)的處理器上,也可以運行在不提供MMU的處理器上。linux內(nèi)核的UClinux移植提供了對非MMU的支持。

Linux內(nèi)核的主要組件有:系統(tǒng)調(diào)用接口、進程管理、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)堆棧、設(shè)備驅(qū)動程序、硬件架構(gòu)的相關(guān)代碼。
4.2內(nèi)核模塊
如果Windows已經(jīng)安裝了所有可用的驅(qū)動程序,而您只需要打開所需的驅(qū)動程序怎么辦?這本質(zhì)上就是內(nèi)核模塊為Linux所做的。內(nèi)核模塊,也稱為可加載內(nèi)核模塊(LKM),對于保持內(nèi)核在不消耗所有可用內(nèi)存的情況下與所有硬件一起工作是必不可少的。
模塊通常向基本內(nèi)核添加諸如設(shè)備、文件系統(tǒng)和系統(tǒng)調(diào)用等功能。lkm的文件擴展名是。ko,它通常存儲在/lib/modules目錄中。由于模塊的特性,您可以通過在啟動時使用menuconfig命令將模塊設(shè)置為加載或不加載,或者通過編輯/boot/config文件,或者使用modprobe命令動態(tài)加載和卸載模塊,來輕松定制內(nèi)核。第三方和封閉源代碼模塊在某些發(fā)行版中可用,如Ubuntu,默認(rèn)情況下可能不會安裝,因為這些模塊的源代碼不可用。該軟件的開發(fā)商(即nVidia、ATI等。)不提供源代碼,而是自己搭建模塊,編譯所需。用于分發(fā)的ko文件。雖然這些模塊像啤酒一樣是免費的,但它們不像語音一樣是免費的,所以它們沒有包含在一些發(fā)行版中,因為維護者認(rèn)為它通過提供非自由軟件來“污染”內(nèi)核。內(nèi)核并不神奇,但對于任何一臺正常的電腦都是必不可少的。Linux內(nèi)核不同于OS X和Windows,因為它包含內(nèi)核級驅(qū)動程序,并使許多東西“開箱即用”。我希望你能更多地了解軟件和硬件是如何配合工作的,以及啟動電腦所需的文件。
五,學(xué)習(xí)Linux內(nèi)核
學(xué)習(xí)linux內(nèi)核不像學(xué)習(xí)語言。一個月或者三月就能掌握C或者java。學(xué)習(xí)linux內(nèi)核需要循序漸進,掌握正確的linux內(nèi)核學(xué)習(xí)路線非常重要。本文將分享一些學(xué)習(xí)linux內(nèi)核的建議。
很多同學(xué)接觸Linux不多,對Linux平臺的開發(fā)更是一無所知。而現(xiàn)在的趨勢越來越表明,作為一 個優(yōu)秀的軟件開發(fā)人員,或計算機IT行業(yè)從業(yè)人員,掌握Linux是一種很重要的謀生資源與手段。下來我將會結(jié)合自己的幾年的個人開發(fā)經(jīng)驗,及對 Linux,更是類UNIX系統(tǒng),及開源軟件文化,談?wù)凩inux的學(xué)習(xí)方法與學(xué)習(xí)中應(yīng)該注意的一些事。
就如同剛才說的,很多同學(xué)以前可能連Linux是什么都不知道,對UNIX更是一無所知。所以我們從最基礎(chǔ)的講起,對于Linux及UNIX的歷史我們不做多談,直接進入入門的學(xué)習(xí)。
Linux入門是很簡單的,問題是你是否有耐心,是否愛折騰,是否不排斥重裝一類的大修。沒折騰可以說是學(xué)不好Linux的,鳥哥說過,要真正了解Linux的分區(qū)機制,對LVM使用相當(dāng)熟練,沒有20次以上的Linux裝機經(jīng)驗是積累不起來的,所以一定不要怕折騰。
由于大家之前都使用Windows,所以我也盡可能照顧這些“菜鳥”。我的推薦,如果你第一次接觸Linux,那么首先在虛擬機中嘗試它。虛擬機我推薦Virtual Box,我并不主張使用VM,原因是VM是閉源的,并且是收費的,我不希望推動盜版。當(dāng)然如果你的Money足夠多,可以嘗試VM,但我要說的是即使是VM,不一定就一定好。付費的軟件不一定好。首先,Virtual Box很小巧,Windows平臺下安裝包在80MB左右,而VM動輒600MB,雖然功能強大,但資源消耗也多,何況你的需求Virtual Box完全能夠滿足。所以,還是自己選。如何使用虛擬機,是你的事,這個我不教你,因為很簡單,不會的話Google或Baidu都可以,英文好的可以直接看官方文檔。
現(xiàn)在介紹Linux發(fā)行版的知識。正如你所見,Linux發(fā)行版并非Linux,Linux僅是指操作系統(tǒng)的內(nèi)核,作為科班出生的你不要讓我解釋,我也沒時間。
我推薦的發(fā)行版如下:
UBUNTU適合純菜鳥,追求穩(wěn)定的官方支持,對系統(tǒng)穩(wěn)定性要求較弱,喜歡最新應(yīng)用,相對來說不太喜歡折騰的開發(fā)者。
Debian,相對UBUNTU難很多的發(fā)行版,突出特點是穩(wěn)定與容易使用的包管理系統(tǒng),缺點是企業(yè)支持不足,為社區(qū)開發(fā)驅(qū)動。
Arch,追逐時尚的開發(fā)者的首選,優(yōu)點是包更新相當(dāng)快,無縫升級,一次安裝基本可以一直運作下去,沒有如UBUNTU那樣的版本概念,說的專業(yè)點叫滾動升級,保持你的系統(tǒng)一定是最新的。缺點顯然易見,不穩(wěn)定。同時安裝配置相對Debian再麻煩點。
Gentoo,相對Arch再難點,考驗使用者的綜合水平,從系統(tǒng)安裝到微調(diào),內(nèi)核編譯都親歷親為,是高手及黑客顯示自己技術(shù)手段,按需配置符合自己要求的系統(tǒng)的首選。
Slackware與Gentoo類似:
CentOS,社區(qū)維護的RedHat的復(fù)刻版本,完全使用RedHat的源碼重新編譯生成,與RedHat的兼容性在理論上來說是最好的。如果你專注于Linux服務(wù)器,如網(wǎng)絡(luò)管理,架站,那么CentOS是你的選擇。
LFS,終極黑客顯擺工具,完全從源代碼安裝,編譯系統(tǒng)。安裝前你得到的只有一份文檔,你要做的就是照文檔你的說明,一步步,一條條命令,一個個軟件包的去構(gòu)建你的Linux,完全由你自己控制,想要什么就是什么。如果你做出了LFS,證明你的Linux功底已經(jīng)相當(dāng)不錯,如果你能拿LFS文檔活學(xué)活用,再將Linux從源代碼開始移植到嵌入式系統(tǒng),我敢說中國的企業(yè)你可以混的很好。
你得挑一個適合你的系統(tǒng),然后在虛擬機安裝它,開始使用它。如果你想快速學(xué)會Linux,我有一個建議就是忘記圖形界面,不要想圖形界面能不能提供你問題的答案,而是滿世界的去找,去問,如何用命令行解決你的問題。在這個過程中,你最好能將Linux的命令掌握的不錯,起碼常用的命令得知道,同時建立了自己的知識庫,里面是你積累的各項知識。
再下個階段,你需要學(xué)習(xí)的是Linux平臺的C++/C++開發(fā),同時還有Bash腳本編程,如果你對Java興趣很深還有Java。同樣,建議你拋棄掉圖形界面的IDE,從VIM開始,為什么是VIM,而不是Emacs,我無意挑起編輯器大戰(zhàn),但我覺得VIM適合初學(xué)者,適合手比較笨,腦袋比較慢的開發(fā)者。Emacs的鍵位太多,太復(fù)雜,我很畏懼。然后是GCC,Make,Eclipse(Java,C++或者)。雖然將C++列在了Eclipse中,但我并不推薦用IDE開發(fā)C++,因為這不是Linux的文化,容易讓你忽略一些你應(yīng)該注意的問題。IDE讓你變懶,懶得跟豬一樣。如果你對程序調(diào)試,測試工作很感興趣,GDB也得學(xué)的很好,如果不是GDB也是必修課。這是開發(fā)的第一步,注意我并沒有提過一句Linux系統(tǒng)API的內(nèi)容,這個階段也不要關(guān)心這個。你要做的就是積累經(jīng)驗,在Linux平臺的開發(fā)經(jīng)驗。我推薦的書如下:C語言程序設(shè)計,譚浩強的也可以。C語言,白皮書當(dāng)然更好。C++推薦C++ Primer Plus,Java我不喜歡,就不推薦了。工具方面推薦VIM的官方手冊,GCC中文文檔,GDB中文文檔,GNU開源軟件開發(fā)指導(dǎo)(電子書),匯編語言程序設(shè)計(讓你對庫,鏈接,內(nèi)嵌匯編,編譯器優(yōu)化選項有初步了解,不必深度)。
如果你這個階段過不了就不必往下做了,這是底線,最基礎(chǔ)的基礎(chǔ),否則離開,不要霍霍Linux開發(fā)。不專業(yè)的Linux開發(fā)者作出的程序是與Linux文化或UNIX文化相背的,程序是走不遠(yuǎn)的,不可能像Bash,VIM這些神品一樣。所以做不好干脆離開。
接下來進入Linux系統(tǒng)編程,不二選擇,APUE,UNIX環(huán)境高級編程,一遍一遍的看,看10遍都嫌少,如果你可以在大學(xué)將這本書翻爛,里面的內(nèi)容都實踐過,有作品,你口頭表達(dá)能力夠強,你可以在面試時說服所有的考官。(可能有點夸張,但APUE絕對是圣經(jīng)一般的讀物,即使是Windows程序員也從其中汲取養(yǎng)分,Google創(chuàng)始人的案頭書籍,扎爾伯克的床頭讀物。)
這本書看完后你會對Linux系統(tǒng)編程有相當(dāng)?shù)牧私?,知道Linux與Windows平臺間開發(fā)的差異在哪?它們的優(yōu)缺點在哪?我的總結(jié)如下:做Windows平臺開發(fā),很苦,微軟的系統(tǒng)API總在擴容,想使用最新潮,最高效的功能,最適合當(dāng)前流行系統(tǒng)的功能你必須時刻學(xué)習(xí)。Linux不是,Linux系統(tǒng)的核心API就100來個,記憶力好完全可以背下來。而且經(jīng)久不變,為什么不變,因為要同UNIX兼容,符合POSIX標(biāo)準(zhǔn)。所以Linux平臺的開發(fā)大多是專注于底層的或服務(wù)器編程。這是其優(yōu)點,當(dāng)然圖形是Linux的軟肋,但我站在一個開發(fā)者的角度,我無所謂,因為命令行我也可以適應(yīng),如果有更好的圖形界面我就當(dāng)作恩賜吧。另外,Windows閉源,系統(tǒng)做了什么你更本不知道,永遠(yuǎn)被微軟牽著鼻子跑,想想如果微軟說Win8不支持QQ,那騰訊不得哭死。而Linux完全開源,你不喜歡,可以自己改,只要你技術(shù)夠。另外,Windows雖然使用的人多,但使用場合單一,專注與桌面。而Linux在各個方面都有發(fā)展,尤其在云計算,服務(wù)器軟件,嵌入式領(lǐng)域,企業(yè)級應(yīng)用上有廣大前景,而且兼容性一流,由于支持POSIX可以無縫的運行在UNIX系統(tǒng)之上,不管是蘋果的Mac還是IBM的AS400系列,都是完全支持的。另外,Linux的開發(fā)環(huán)境支持也絕對是一流的,不管是C/C++,Java,Bash,Python,PHP,Javascript,。。。。。。就連C#也支持。而微軟除Visual Stdio套件以外,都不怎么友好,不是嗎?
如果你看完APUE的感觸有很多,希望驗證你的某些想法或經(jīng)驗,推薦UNIX程序設(shè)計藝術(shù),世界頂級黑客將同你分享他的看法?,F(xiàn)在是時候做分流了。 大體上我分為四個方向:網(wǎng)絡(luò),圖形,嵌入式,設(shè)備驅(qū)動。
如果選擇網(wǎng)絡(luò),再細(xì)分,我對其他的不是他熟悉,只說服務(wù)器軟件編寫及高性能的并發(fā)程序編寫吧。相對來說這是網(wǎng)絡(luò)編程中技術(shù)含量最高的,也是底層的。需要很多的經(jīng)驗,看很多的書,做很多的項目。
我的看法是以下面的順序來看書:
APUE再深讀 – 尤其是進程,線程,IPC,套接字
多核程序設(shè)計 - Pthread一定得吃透了,你很NB
UNIX網(wǎng)絡(luò)編程 – 卷一,卷二
TCP/IP網(wǎng)絡(luò)詳解 – 卷一 再看上面兩本書時就該看了
TCP/IP 網(wǎng)絡(luò)詳解 – 卷二 我覺得看到卷二就差不多了,當(dāng)然卷三看了更好,努力,爭取看了
Lighttpd源代碼 - 這個服務(wù)器也很有名了
Nginx源代碼 – 相較于Apache,Nginx的源碼較少,如果能看個大致,很NB。看源代碼主要是要學(xué)習(xí)里面的套接字編程及并發(fā)控制,想想都激動。如果你有這些本事,可以試著往暴雪投簡歷,為他們寫服務(wù)器后臺,想一想全球的魔獸都運行在你的服務(wù)器軟件上。
Linux內(nèi)核TCP/IP協(xié)議棧 – 深入了解TCP/IP的實現(xiàn)
如果你還喜歡驅(qū)動程序設(shè)計,可以看看更底層的協(xié)議,如鏈路層的,寫什么路由器,網(wǎng)卡,網(wǎng)絡(luò)設(shè)備的驅(qū)動及嵌入式系統(tǒng)軟件應(yīng)該也不成問題了。當(dāng)然一般的網(wǎng)絡(luò)公司,就算百度級別的也該毫不猶豫的雇用你。只是看后面這些書需要時間與經(jīng)驗,所以35歲以前辦到吧!跳槽到給你未來的地方!
圖形方向,我覺得圖形方向也是很有前途的,以下幾個方面:
Opengl的工業(yè)及游戲開發(fā),國外較成熟。
影視動畫特效,如皮克斯,也是國外較成熟。
GPU計算技術(shù),可以應(yīng)用在瀏覽器網(wǎng)頁渲染上,GPU計算資源利用上,由于開源的原因,有很多的文檔程序可以參考。如果能進火狐開發(fā),或google做瀏覽器開發(fā),應(yīng)該會很好 。
嵌入式方向:嵌入式方向沒說的,Linux很重要
掌握多個架構(gòu),不僅X86的,ARM的,單片機什么的也必須得懂。硬件不懂我預(yù)見你會死在半路上,我也想走嵌入式方向,但我覺得就學(xué)校教授嵌入式的方法,我連學(xué)電子的那幫學(xué)生都競爭不過。奉勸大家,一定得懂硬件再去做,如果走到嵌入式應(yīng)用開發(fā),只能祝你好運,不要碰上像Nokia,Hp這樣的公司,否則你會很慘的。
驅(qū)動程序設(shè)計:軟件開發(fā)周期是很長的,硬件不同,很快。每個月誕生那么多的新硬件,如何讓他們在Linux上工作起來,這是你的工作。由于Linux的兼容性很好,如果不是太低層的驅(qū)動,基本C語言就可以搞定,系統(tǒng)架構(gòu)的影響不大,因為有系統(tǒng)支持,你可能做些許更改就可以在ARM上使用PC的硬件了,所以做硬件驅(qū)動開發(fā)不像嵌入式,對硬件知識的要求很高。可以從事的方向也很多,如家電啊,特別是如索尼,日立,希捷,富士康這樣的廠子,很稀缺的。
內(nèi)核是IT開發(fā)人員的加分項,一個計算機系統(tǒng)是一個硬件和軟件的共生體,它們互相依賴,不可分割。計算機的硬件,含有外圍設(shè)備、處理器、內(nèi)存、硬盤和其他的電子設(shè)備組成計算機的發(fā)動機。但是沒有軟件來操作和控制它,自身是不能工作的。完成這個控制工作的軟件就稱為操作系統(tǒng),在Linux的術(shù)語中被稱為“內(nèi)核”,也可以稱為“核心”。Linux內(nèi)核的主要模塊(或組件)分以下幾個部分:存儲管理、CPU和進程管理、文件系統(tǒng)、設(shè)備管理和驅(qū)動、網(wǎng)絡(luò)通信,以及系統(tǒng)的初始化(引導(dǎo))、系統(tǒng)調(diào)用等。
Linux 內(nèi)核實現(xiàn)了很多重要的體系結(jié)構(gòu)屬性。在或高或低的層次上,內(nèi)核被劃分為多個子系統(tǒng)。Linux 也可以看作是一個整體,因為它會將所有這些基本服務(wù)都集成到內(nèi)核中。這與微內(nèi)核的體系結(jié)構(gòu)不同,后者會提供一些基本的服務(wù),例如通信、I/O、內(nèi)存和進程管理,更具體的服務(wù)都是插入到微內(nèi)核層中的。
隨著時間的流逝,Linux 內(nèi)核在內(nèi)存和 CPU 使用方面具有較高的效率,并且非常穩(wěn)定。但是對于 Linux 來說,最為有趣的是在這種大小和復(fù)雜性的前提下,依然具有良好的可移植性。Linux 編譯后可在大量處理器和具有不同體系結(jié)構(gòu)約束和需求的平臺上運行。一個例子是 Linux 可以在一個具有內(nèi)存管理單元(MMU)的處理器上運行,也可以在那些不提供MMU的處理器上運行。Linux 內(nèi)核的uClinux移植提供了對非 MMU 的支持。
在IT行業(yè) 如:嵌入式開發(fā),驅(qū)動開發(fā),Android開發(fā),c++開發(fā),Java開發(fā)如果接觸到底層方面 那么 懂得內(nèi)核:會使自己的開發(fā)工作產(chǎn)生對應(yīng)的效益。 懂得內(nèi)核:會讓自己更加了解底層的原理與開發(fā)源碼。 內(nèi)核是面試的加分項 內(nèi)核是走向?qū)<业谋亟?jīng)之路 不管你是不是做內(nèi)核開發(fā),內(nèi)核技術(shù)是儲備技能,開闊視野,擴展技術(shù)面的不二選擇。
要轉(zhuǎn)向內(nèi)核開發(fā),嵌入式開發(fā)人員需要掌握以下知識:
1. C語言編程:C語言是內(nèi)核開發(fā)的主要編程語言,需要熟練掌握其語法和編程技巧。
2. 操作系統(tǒng)原理:需要了解操作系統(tǒng)的基本原理,包括進程管理、內(nèi)存管理、文件系統(tǒng)等。
3. Linux內(nèi)核:需要深入了解Linux內(nèi)核的架構(gòu)、模塊、驅(qū)動程序等。
4. 設(shè)備驅(qū)動開發(fā):需要掌握設(shè)備驅(qū)動的開發(fā)流程和技術(shù),包括字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備等。
5. 調(diào)試技能:需要掌握調(diào)試技能,包括使用調(diào)試工具、分析內(nèi)核崩潰等。
6. 硬件知識:需要了解硬件的基本原理和操作,包括處理器、內(nèi)存、外設(shè)等。
7. 開源社區(qū):需要了解開源社區(qū)的文化和開發(fā)流程,以便更好地參與內(nèi)核開發(fā)。
總之,轉(zhuǎn)向內(nèi)核開發(fā)需要廣泛的知識儲備和實踐經(jīng)驗,需要不斷學(xué)習(xí)和探索。
內(nèi)核學(xué)習(xí)路線推薦,喜歡研究內(nèi)核,想在內(nèi)核這塊深入學(xué)習(xí)的,可以參考。
操作系統(tǒng)原理/匯編專題
1:操作系統(tǒng)原理 進程管理:進程狀態(tài)與切換、進程互斥與同步、處理器調(diào)度、進程死鎖 內(nèi)存管理 :存儲結(jié)構(gòu)、分區(qū)存儲管理、段式管理、頁式管理、虛擬存儲?設(shè)備管理:磁盤高速緩存、RAID(磁盤陣列)、I/O緩沖 文件管理:文件組織結(jié)構(gòu)、堆文件原理、存儲空間管理、文件目錄管理 2:匯編語言精講 x86/x86_64體系結(jié)構(gòu):x86/x86_64體系結(jié)構(gòu)、匯編語言基礎(chǔ)、數(shù)據(jù)傳送、算法運算、尋址、過程與條件處理、浮點處理與指令編碼 ARM體系結(jié)構(gòu):ARM核微處理器、ARM常用指令系統(tǒng)、ARM匯編程序及調(diào)試、異常中斷/復(fù)位處理程序/SWI異常中斷、RealView MDK安裝與配置、ARM匯編與C混合實現(xiàn)、數(shù)據(jù)加載與存儲指令實現(xiàn)
進程管理專題
1:進程基礎(chǔ) Linux內(nèi)核源碼組織結(jié)構(gòu) 進程原理及進程狀態(tài) 生命周期及系統(tǒng)調(diào)用:寫時復(fù)制原理、進程內(nèi)存布局、進程堆棧管理、系統(tǒng)調(diào)用實現(xiàn) task_struct數(shù)據(jù)結(jié)構(gòu)分析 2 :進程調(diào)度 調(diào)度策略:SCHED_DEADLINE、SCHED_FIFO、SCHED_RR、SCHED_NORMAL 進程優(yōu)先級:調(diào)度優(yōu)先級、靜態(tài)優(yōu)先級、正常優(yōu)先級、實時優(yōu)先級 調(diào)度類分析:stop_sched_class、dl_sched_class、rt_sched_class、cfs_sched_class、idle_shced_class SMP調(diào)度:遷移線程/隔離處理器、限期調(diào)度類的處理器負(fù)載均衡、實時調(diào)度類的處理器負(fù)載均衡、公平調(diào)度類的處理器負(fù)載均衡
內(nèi)存管理專題
1:內(nèi)存原理 SMP/NUMA模型組織 物理內(nèi)存組織結(jié)構(gòu)與模型 頁表/頁表緩存:頁表框架目錄結(jié)構(gòu)、TLB表項格式與管理、地址空間標(biāo)識符(ASID)、虛擬機標(biāo)識符(VMID) 處理器緩存:緩存結(jié)構(gòu)與策略、SMP緩存一致性、高速緩存與TLB控制 內(nèi)存映射:數(shù)據(jù)結(jié)構(gòu)分析、創(chuàng)建內(nèi)存映射、刪除內(nèi)存映射、系統(tǒng)調(diào)用實現(xiàn) 2:虛擬內(nèi)存?塊分配器:內(nèi)存分配器原理、頁分配與頁釋放、SLAB塊分配器、SLOB塊分配器、SLUB塊分配器、系統(tǒng)調(diào)度接口 頁模塊大全:標(biāo)準(zhǔn)巨型頁、透明巨型頁、LRU算法與反向映射、頁直接與異步回收原理、回收不活動頁執(zhí)行方案、頁交換原理、回收slab緩存原理、頁錯誤異常處理、內(nèi)存碎片整理、發(fā)起內(nèi)存回收、交換區(qū)數(shù)據(jù)結(jié)構(gòu)/創(chuàng)建/激活、內(nèi)存耗盡技術(shù)原理、缺頁異常校正方法、KASAN檢測工具、處理交換缺頁異常、內(nèi)存屏障與內(nèi)核互斥技術(shù)。 3:內(nèi)存系統(tǒng)調(diào)用 kmalloc/vmalloc 內(nèi)存池原理與實現(xiàn)操作 內(nèi)存優(yōu)化參數(shù)與實現(xiàn) 頁緩存的實現(xiàn) 塊緩存的實現(xiàn) 4: perf性能分析工具 perf原理機制與安裝配置 perf采集數(shù)據(jù)命令29種工具應(yīng)用 perf采集數(shù)據(jù)至火焰圖分析
網(wǎng)絡(luò)協(xié)議棧專題
1: 網(wǎng)絡(luò)基礎(chǔ)架構(gòu) ICMP協(xié)議?用戶數(shù)據(jù)報協(xié)議(UDP) 傳輸控制協(xié)議(TCP) 流控制傳輸協(xié)議(SCTP) 數(shù)據(jù)報擁塞控制協(xié)議(DCCP) IPv4策略路由選擇 無線子系統(tǒng)模塊:802.11 MAC幀結(jié)構(gòu)分析、掃描/身份驗證/關(guān)聯(lián)、mac80211接收與傳輸實現(xiàn)、高吞吐量(802.11n)、網(wǎng)狀網(wǎng)絡(luò)(802.11s) IPv4重定向消息/FIB表 2:網(wǎng)絡(luò)協(xié)議棧 ARP(地址解析協(xié)議) 用戶數(shù)據(jù)報協(xié)議(UDP) 傳輸控制協(xié)議(TCP) 高級路由選擇:組播路由選擇、策略路由選擇、多路徑路由選擇 接收/發(fā)送IPv4數(shù)據(jù)包 接收/發(fā)送IPv6數(shù)據(jù)包 InfiniBand棧的架構(gòu):RDMA(遠(yuǎn)程直接內(nèi)存訪問 )結(jié)構(gòu)、InfiniBand組件與編址、InfiniBand功能與數(shù)據(jù)包 協(xié)議棧注冊/接收包/發(fā)送包流程方案 3:系統(tǒng)API調(diào)用 POSIX網(wǎng)絡(luò)API調(diào)用 epoll內(nèi)核原理與實現(xiàn) 網(wǎng)絡(luò)系統(tǒng)參數(shù)配置
設(shè)備驅(qū)動專題
1:設(shè)備驅(qū)動子系統(tǒng) I/O機制原理 資源分配與管理 字符設(shè)備子系統(tǒng) 塊設(shè)備子系統(tǒng) 網(wǎng)絡(luò)接口卡驅(qū)動 2: Linux設(shè)備模型 深度剖析LDM:LDM數(shù)據(jù)結(jié)構(gòu)、設(shè)備驅(qū)動程、kobject結(jié)構(gòu)、kobj_type、內(nèi)核對象集合 設(shè)備模型和sysfs:sysfs文件及屬性、允許輪詢sysfs屬性文件、 3:字符設(shè)備操作 主設(shè)備與次設(shè)備 打開設(shè)備文件 分配與注冊字符設(shè)備 寫文件操作實現(xiàn):open/release方法、read/write方法、llseek/poll方、填充file_operations結(jié)構(gòu) 插入和刪除模塊 4: 塊設(shè)備操作 塊設(shè)備表示與數(shù)據(jù)結(jié)構(gòu) BIO數(shù)據(jù)結(jié)構(gòu) ioctl系統(tǒng)調(diào)用 總線模塊: ISA總線、PCI/PCI-E總線、USB總線、VESA總線、I2C總線 5: 網(wǎng)卡設(shè)備驅(qū)動 數(shù)據(jù)結(jié)構(gòu):套接字緩沖區(qū)結(jié)構(gòu)、網(wǎng)絡(luò)接口結(jié)構(gòu) 緩沖區(qū)管理與并發(fā)控制 ISA網(wǎng)絡(luò)驅(qū)動程序 ATM異步傳輸模式 網(wǎng)絡(luò)吞吐量
內(nèi)核組件專題
1:時間管理 通用時間子系統(tǒng) 高分辨率定時器 動態(tài)時鐘數(shù)據(jù)結(jié)構(gòu) 定時器系統(tǒng)調(diào)用 2:頁與塊緩存 頁緩存結(jié)構(gòu)操作與實現(xiàn) 塊緩存結(jié)構(gòu)與實現(xiàn) 地址空間數(shù)據(jù)結(jié)構(gòu)與頁樹 3:數(shù)據(jù)同步 數(shù)制同步機制 inode同步與擁塞 強制回寫與完全同步 4:內(nèi)核活動 中斷類型/硬件IRQ irq_desc數(shù)據(jù)結(jié)構(gòu) 處理IRQ與軟中斷 創(chuàng)建/注冊/執(zhí)行tasklet 等待隊列與完成量
文件系統(tǒng)專題
1:虛擬文件系統(tǒng)VFS 文件系統(tǒng)類型與文件模型研究 數(shù)據(jù)結(jié)構(gòu):超級塊(super_block)、掛載描述符(mount結(jié)構(gòu)體)、索引結(jié)點(inode結(jié)構(gòu)體)、目錄項(dentry結(jié)構(gòu)體) 文件系統(tǒng)調(diào)用: 打開/關(guān)閉文件、 創(chuàng)建/刪除文件、 讀/寫文件、 文件回寫技術(shù)原理/接口實現(xiàn) 掛載文件系統(tǒng):系統(tǒng)調(diào)用mount處理流程、綁定掛載/掛載命名空間、掛載/注冊rootfs文件系統(tǒng)無 持久文件系統(tǒng):proc文件系統(tǒng)(proc數(shù)據(jù)結(jié)構(gòu)、裝載proc/管理proc數(shù)據(jù)項、數(shù)據(jù)讀取與寫入實現(xiàn))、 簡單文件系統(tǒng)(順序文件、調(diào)度文件系統(tǒng)、偽文件系統(tǒng)) 2:磁盤文件系統(tǒng) Ext2文件系統(tǒng):物理結(jié)構(gòu)與數(shù)據(jù)結(jié)構(gòu)、創(chuàng)建文件系統(tǒng)、操作文件系統(tǒng) Ext3文件系統(tǒng) Ext4文件系統(tǒng) 日志JBD2 3:用戶空間文件系統(tǒng) Fuse架構(gòu)設(shè)計與原理 Fuse內(nèi)核五大隊列 Fuse用戶空間流程與實現(xiàn)方案
內(nèi)核項目實戰(zhàn)專題
1-Linux內(nèi)核編譯與系統(tǒng)更換實現(xiàn)方法 2-進程間通信/管理(權(quán)限/優(yōu)先級)實現(xiàn)方案 3-NIC網(wǎng)卡驅(qū)動實現(xiàn) 4-mmap系統(tǒng)調(diào)用/映射用戶內(nèi)存實現(xiàn) 5-Linux內(nèi)存參數(shù)系統(tǒng)實現(xiàn) 6-調(diào)試與性能優(yōu)化(debugfs/printk/ftrace) 7-Slab塊分配器內(nèi)存分配實現(xiàn)機制 8-tasklet/內(nèi)線線程與定時器實現(xiàn) 9-Linux內(nèi)核proc文件系統(tǒng)實現(xiàn) 10-Linux內(nèi)核防火墻iptables實現(xiàn)
六、Linux內(nèi)核視頻講解
1、深度剖析Linux內(nèi)核SMP負(fù)載均衡-----視頻講解地址
2、深度剖析Linux內(nèi)核ARM64處理器架構(gòu)-----視頻講解地址
3、深度剖析Linux內(nèi)核ARM異常處理-----視頻講解地址
4、深度剖析Linux內(nèi)核CFS調(diào)度器-----視頻講解地址
5、深度剖析Linux內(nèi)核量化負(fù)載計算能力-----視頻講解地址
6、深度剖析Linux內(nèi)核進程及生命周期-----視頻講解地址
7、深度剖析Linux內(nèi)核CPU域初始化實現(xiàn)-----視頻講解地址
8、深度剖析Linux內(nèi)核藍(lán)牙子系統(tǒng)架構(gòu)-----視頻講解地址
9、深度剖析Linux內(nèi)核USB系統(tǒng)架構(gòu)-----視頻講解地址
10、深度剖析Linux內(nèi)核IO體系結(jié)構(gòu)與訪問設(shè)備-----視頻講解地址
11、深度剖析Linux內(nèi)核進程管理機制-----視頻講解地址
12、深度剖析Linux內(nèi)核MLFQ經(jīng)典調(diào)度算法-----視頻講解地址
13、深入剖析Linux內(nèi)核伙伴系統(tǒng)實現(xiàn)及API調(diào)度實戰(zhàn)-----視頻講解地址
14、深入剖析Linux內(nèi)核哈希表與運行隊列-----視頻講解地址
15、深入剖析Linux內(nèi)核NUMA調(diào)度器-----視頻講解地址
16、深度剖析Linux內(nèi)核perf性能優(yōu)化分析-----視頻講解地址
七、內(nèi)核項目實戰(zhàn)


以上就是Linux內(nèi)核學(xué)習(xí)路線,關(guān)于學(xué)習(xí)Linux內(nèi)核的建議,希望對小伙伴們有幫助。