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。
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)
- 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 個模塊,如下圖所示述召。
- 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 個子模塊俭茧,如下圖所示。
- 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 個子模塊青责,如下圖所示。
- 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 個子模塊隐绵,如下圖所示之众。
- 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 ---- 幫助雇庙、說明文檔。