【Linux】內(nèi)核簡介

1.Linux 的體系結(jié)構(gòu)

User Space 是用戶空間即應(yīng)用程序執(zhí)行的地方杜秸。Kernel Space 是內(nèi)核空間柑潦,分為 3 層:① 最上層實系統(tǒng)調(diào)用接口绊含,即內(nèi)核向用戶提供服務(wù)的接口必尼,例如 io read 和 write缤谎。應(yīng)用程序通過軟件中斷后抒倚,調(diào)用系統(tǒng)內(nèi)核提供的功能。② 內(nèi)核程序坷澡。③ 最下層是體系結(jié)構(gòu)的代碼托呕,通常稱為 BSP。

image.png

Linux 內(nèi)核簡介
內(nèi)核是操作系統(tǒng)最基本的部分频敛,提供了安全訪問計算機硬件的基本能力项郊。這種訪問是有限的,并且內(nèi)核決定應(yīng)用程序在什么時候?qū)δ巢糠钟布僮鞫嚅L時間斟赚。內(nèi)核負責管理系統(tǒng)的進程着降、內(nèi)存、設(shè)備驅(qū)動程序拗军、文件和網(wǎng)絡(luò)系統(tǒng)任洞,決定著系統(tǒng)的性能和穩(wěn)定性蓄喇。

問題 1:內(nèi)核的實質(zhì)是什么?
答:內(nèi)核的實質(zhì)也是一種應(yīng)用程序交掏,只不過它是直接操作硬件的妆偏。內(nèi)核直接面對硬件,調(diào)用硬件接口即硬件廠商提供的指令集耀销。內(nèi)核是直接面向硬件的楼眷,故可用資源權(quán)限很大,但內(nèi)核是工作在有限地址空間內(nèi)的熊尉,例如 Linux 的32位系統(tǒng)在線性地址空間中罐柳,內(nèi)核只認為自己有 1G 的空間,剩下的 3G 給用戶態(tài)的應(yīng)用程序狰住。

說明:編寫內(nèi)核級應(yīng)用程序的時候张吉,為了避免過于底層,因此內(nèi)核可以動態(tài)編譯后催植,重啟加載該程序肮蛹,例如驅(qū)動程序通過動態(tài)編譯生成可執(zhí)行文件,然后系統(tǒng)重啟后加載該驅(qū)動就可以使用相應(yīng)的設(shè)備创南。

問題 2:從動態(tài)角度如何分析 Linux 主機的運行狀態(tài)
答:用戶態(tài)的應(yīng)用程序邏輯上是運行在內(nèi)核伦忠,但實際是直接工作在硬件上的。簡單來說稿辙,任意應(yīng)用程序數(shù)據(jù)都在內(nèi)存中昆码,數(shù)據(jù)處理都是在 CPU,只是應(yīng)用程序不能隨意使用這些硬件資源邻储,需要接受內(nèi)核的管理赋咽。當用戶態(tài)的應(yīng)用程序需要訪問硬件資源時,首先通過系統(tǒng)調(diào)用接口向 CPU 發(fā)起特權(quán)請求吨娜,一旦 CPU 收到特權(quán)請求就會喚醒內(nèi)核脓匿,從而執(zhí)行內(nèi)核中的某段代碼,然后將結(jié)果返回給應(yīng)用程序宦赠。接著內(nèi)核代碼退出陪毡,內(nèi)核程序暫停。

問題 3:CPU 占用與內(nèi)核的關(guān)系
答:內(nèi)核將 CPU 虛擬化提供給進程勾扭,使得內(nèi)存中每一個進程都以為直接是獨占 CPU缤骨。內(nèi)核將 CPU 切成時間片,隨著時間流逝完成了在進程之間分配計算能力尺借,即內(nèi)核把 CPU 以時間的方式提供了計算能力。

2.內(nèi)核的整體架構(gòu)與子系統(tǒng)

image.png
  • Process Scheduler 進程管理:負責管理 CPU 資源精拟,使得讓各個進程以時間片的方式使用 CPU 資源
  • Memory Manager 內(nèi)存管理:負責管理 Memory(內(nèi)存)資源燎斩,是的各個進程可以安全地共享機器的內(nèi)存資源虱歪。另外,內(nèi)存管理會提供虛擬內(nèi)存的機制栅表,可以讓進程使用多于系統(tǒng)可用的 Memory笋鄙,不用的內(nèi)存會通過文件系統(tǒng)保存在外部非易失存儲器中,需要使用的時候再取回到內(nèi)存中怪瓶。
  • VFS(Virtual File System)虛擬文件系統(tǒng):將不同功能的外部設(shè)備萧落,例如 Disk 設(shè)備(硬盤、磁盤洗贰、NAND Flash找岖、Nor Flash 等)、輸入輸出設(shè)備敛滋、顯示設(shè)備等许布,抽象為可以通過統(tǒng)一的文件操作接口(open、close绎晃、read蜜唾、write等)來訪問。
  • Network 網(wǎng)絡(luò)系統(tǒng):負責管理系統(tǒng)的網(wǎng)絡(luò)設(shè)備庶艾,并實現(xiàn)多種多樣的網(wǎng)絡(luò)標準袁余。
  • IPC(Inter-Process Communication)進程間通信:不管理任何的硬件,主要負責 Linux 系統(tǒng)中進程之間的通信

2.1 Process Scheduler 進程管理

進程調(diào)度是 Linux 內(nèi)核中最重要的子系統(tǒng)咱揍,主要提供對 CPU 的訪問控制颖榜。進程調(diào)度子系統(tǒng)的 4 個模塊,如下圖所示述召。

image.png
  • System Call Interface 系統(tǒng)調(diào)用接口:系統(tǒng)調(diào)用接口將需要提供給用戶空間的接口開放出去朱转,同時屏蔽掉不需要用戶空間程序關(guān)心的細節(jié)。例如應(yīng)用程序的主進程可以利用系統(tǒng)調(diào)用接口积暖,創(chuàng)建藤为、暫停和恢復(fù)子線程。
  • Architecture-independent Scheduler 模塊:體系結(jié)構(gòu)無關(guān)的部分夺刑,即與 CPU缅疟、內(nèi)存等硬件無關(guān)的模塊。它與 Scheduling Policy 模塊溝通決定接下來要執(zhí)行哪個進程遍愿,最后通過 Architecture-specific Schedulers 模塊 resume 指定的進程存淫。
  • Scheduling Policy 進程調(diào)度策略:決定哪個或哪幾個的進程將擁有 CPU 切片時間。
  • Architecture-specific Schedulers 模塊:體系結(jié)構(gòu)相關(guān)的部分沼填,即與 CPU桅咆、內(nèi)存等硬件相關(guān)聯(lián)的模塊。將對不同 CPU 的控制抽象為統(tǒng)一的接口坞笙,主要在 suspend 和 resume 進程時使用岩饼,牽涉到CPU的寄存器訪問荚虚、匯編指令操作等。

2.2 Memory Manager 內(nèi)存管理

內(nèi)存管理也是 Linux 內(nèi)核中最重要的子系統(tǒng)籍茧,主要提供對內(nèi)存資源的訪問控制版述。Linux 系統(tǒng)會在硬件物理內(nèi)存和進程所使用的內(nèi)存(虛擬內(nèi)存)之間建立一種映射關(guān)系。這種映射是以進程為單位寞冯,不同的進程可以使用相同的虛擬內(nèi)存渴析,而這些相同的虛擬內(nèi)存,可以映射到不同的物理內(nèi)存上吮龄。內(nèi)存管理子系統(tǒng)包括 3 個子模塊俭茧,如下圖所示。

image.png
  • System Call Interface 系統(tǒng)調(diào)用接口:通過該接口向用戶態(tài)的應(yīng)用程序提供內(nèi)存的分配螟蝙、釋放恢恼,文件的 map 等功能。
  • Architecture-independent Scheduler 模塊:提供所有的內(nèi)存管理機制胰默,包括以進程為單位的 memory mapping场斑、虛擬內(nèi)存的 Swapping 等。
  • Architecture-specific Schedulers 模塊:提供用于訪問內(nèi)存硬件的虛擬接口牵署。

2.3 VFS 虛擬文件系統(tǒng)

虛擬文件系統(tǒng) VFS 就是管理各種各樣的文件系統(tǒng)漏隐,屏蔽其差異,以統(tǒng)一的方式為用戶程序提供訪問文件的奴迅。VFS 子系統(tǒng)包括 6 個子模塊青责,如下圖所示。

image.png
  • System Independent Interface 模塊:負責以統(tǒng)一的接口表示硬件設(shè)備和邏輯文件系統(tǒng)取具,包括快設(shè)備和字符設(shè)備脖隶。
  • Logical Systems 模塊:每一種文件系統(tǒng)都會對應(yīng)一個 Logical System 邏輯文件系統(tǒng),實現(xiàn)了具體的文件系統(tǒng)邏輯暇检。
  • Device Independent Interface 模塊:定義了硬件設(shè)備的統(tǒng)一方式即統(tǒng)一設(shè)備模型产阱,所有的設(shè)備驅(qū)動都遵守這個定義,可以降低開發(fā)的難度块仆。
  • Device Drivers 模塊:設(shè)備驅(qū)動模塊用于控制所有的外部設(shè)備及控制器构蹬。由于存在大量不能相互兼容的硬件設(shè)備,特別是嵌入式產(chǎn)品悔据,所以也有非常多的設(shè)備驅(qū)動庄敛。因此,Linux 內(nèi)核中將近一半的 Source Code 都是設(shè)備驅(qū)動科汗。

2.4 Network 網(wǎng)絡(luò)系統(tǒng)

網(wǎng)絡(luò)子系統(tǒng)在 Linux 內(nèi)核中主要負責管理各種網(wǎng)絡(luò)設(shè)備藻烤,并實現(xiàn)各種網(wǎng)絡(luò)協(xié)議棧,最終實現(xiàn)通過網(wǎng)絡(luò)連接其它系統(tǒng)的功能,包括 5 個子模塊隐绵,如下圖所示之众。

image.png
  • Protocol Independent Interface 模塊:屏蔽不同的硬件設(shè)備和網(wǎng)絡(luò)協(xié)議,以相同的格式提供接口即 Socket
  • Network Protocols 模塊:實現(xiàn)各種網(wǎng)絡(luò)傳輸協(xié)議依许,例如 IP、TCP缀蹄、UDP 等
  • Device Independent Interface 模塊:定義了硬件設(shè)備的統(tǒng)一方式即統(tǒng)一設(shè)備模型峭跳,所有的設(shè)備驅(qū)動都遵守這個定義,可以降低開發(fā)的難度缺前。
  • Network Device Drivers 模塊:網(wǎng)絡(luò)設(shè)備的驅(qū)動蛀醉,類似 VFS 子系統(tǒng)中的設(shè)備驅(qū)動。

3.內(nèi)核源代碼的目錄結(jié)構(gòu)

Linux 內(nèi)核源代碼包括三個主要部分衅码。

  • 內(nèi)核核心代碼:上面所描述的各個子系統(tǒng)和子模塊拯刁,以及其它的支撐子系統(tǒng),例如電源管理逝段、Linux初始化等
  • 其它非核心代碼:例如庫文件(因為Linux內(nèi)核是一個自包含的內(nèi)核垛玻,即內(nèi)核不依賴其它的任何軟件,自己就可以編譯通過)奶躯、固件集合帚桩、KVM(虛擬機技術(shù))等
  • 編譯腳本、配置文件嘹黔、幫助文檔账嚎、版權(quán)說明等輔助性文件
include/ ---- 內(nèi)核頭文件,需要提供給外部模塊(例如用戶空間代碼)使用儡蔓。

kernel/ ---- Linux 內(nèi)核的核心代碼郭蕉,包含了 2.1 小節(jié)所描述的進程調(diào)度子系統(tǒng),以及和進程調(diào)度相關(guān)的模塊

mm/ ---- 內(nèi)存管理子系統(tǒng) 2.2 小節(jié)

fs/ ---- VFS 子系統(tǒng) 2.3 小節(jié)喂江。

net/ ---- 不包括網(wǎng)絡(luò)設(shè)備驅(qū)動的網(wǎng)絡(luò)子系統(tǒng) 2.4 小節(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 ---- 幫助雇庙、說明文檔。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灶伊,一起剝皮案震驚了整個濱河市疆前,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聘萨,老刑警劉巖竹椒,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異米辐,居然都是意外死亡胸完,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門翘贮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赊窥,“玉大人,你說我怎么就攤上這事狸页∠悄埽” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長址遇。 經(jīng)常有香客問我熄阻,道長,這世上最難降的妖魔是什么倔约? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任秃殉,我火速辦了婚禮,結(jié)果婚禮上跺株,老公的妹妹穿的比我還像新娘复濒。我一直安慰自己,他們只是感情好乒省,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畦木,像睡著了一般袖扛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上十籍,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天蛆封,我揣著相機與錄音,去河邊找鬼勾栗。 笑死惨篱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的围俘。 我是一名探鬼主播砸讳,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼界牡!你這毒婦竟也來了簿寂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宿亡,失蹤者是張志新(化名)和其女友劉穎常遂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挽荠,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡克胳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了圈匆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漠另。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖臭脓,靈堂內(nèi)的尸體忽然破棺而出酗钞,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布砚作,位于F島的核電站窘奏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏葫录。R本人自食惡果不足惜着裹,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望米同。 院中可真熱鬧骇扇,春花似錦、人聲如沸面粮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熬苍。三九已至稍走,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柴底,已是汗流浹背婿脸。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柄驻,地道東北人狐树。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像鸿脓,于是被迫代替她去往敵國和親抑钟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容