兩個系統的內核結構不一樣,沒什麽可比性,都有各自的優勢。
Linux 內核和 Windows 內核有什麽區別?
內核
什麽是內核呢?
電腦是由各種外部硬件器材組成的,比如記憶體、cpu、硬碟等,如果每個套用都要和這些硬件器材對接通訊協定,那這樣太累了,所以這個中間人就由內核來負責, 讓內核作為套用連線硬件器材的橋梁 ,應用程式只需關心與內核互動,不用關心硬件的細節。
內核有哪些能力呢?
現代作業系統,內核一般會提供 4 個基本能力:
內核是怎麽工作的?
內核具有很高的許可權,可以控制 cpu、記憶體、硬碟等硬件,而應用程式具有的許可權很小,因此大多數作業系統,把記憶體分成了兩個區域:
使用者空間的程式碼只能存取一個局部的記憶體空間,而內核空間的程式碼可以存取所有記憶體空間。因此,當程式使用使用者空間時,我們常說該程式在 使用者態 執行,而當程式使內核空間時,程式則在 內核態 執行。
應用程式如果需要進入內核空間,就需要透過系統呼叫,下面來看看系統呼叫的過程:
內核程式執行在內核態,使用者程式執行在使用者態。當應用程式使用系統呼叫時,會產生一個中斷。發生中斷後, CPU 會中斷當前在執行的使用者程式,轉而跳轉到中斷處理常式,也就是開始執行內核程式。內核處理完後,主動觸發中斷,把 CPU 執行許可權交回給使用者程式,回到使用者態繼續工作。
Linux 的設計
Linux 的開山始祖是來自一位名叫 Linus Torvalds 的芬蘭小夥子,他在 1991 年用 C 語言寫出了第一版的 Linux 作業系統,那年他 22 歲。
完成第一版 Linux 後,Linux Torvalds 就在網絡上釋出了 Linux 內核的原始碼,每個人都可以免費下載和使用。
Linux 內核設計的理念主要有這幾個點:
MutiTask
MutiTask 的意思是 多工 ,代表著 Linux 是一個多工的作業系統。
多工意味著可以有多個任務同時執行,這裏的「同時」可以是並行或並列:
SMP
SMP 的意思是 對稱多處理 ,代表著每個 CPU 的地位是相等的,對資源的使用許可權也是相同的,多個 CPU 共享同一個記憶體,每個 CPU 都可以存取完整的記憶體和硬件資源。
這個特點決定了 Linux 作業系統不會有某個 CPU 單獨服務應用程式或內核程式,而是每個程式都可以被分配到任意一個 CPU 上被執行。
ELF
ELF 的意思是 可執行檔連結格式 ,它是 Linux 作業系統中可執行檔的儲存格式,你可以從下圖看到它的結構:
ELF 把檔分成了一個個分段,每一個段都有自己的作用,具體每個段的作用這裏我就不詳細說明了,感興趣的同學可以去看【程式設計師的自我修養——連結、裝載和庫】這本書。
另外,ELF 檔有兩種索引,Program header table 中記錄了「執行時」所需的段,而 Section header table 記錄了二進制檔中各個「段的首地址」。
那 ELF 檔怎麽生成的呢?
我們編寫的程式碼,首先透過「編譯器」編譯成組譯程式碼,接著透過「組譯器」變成目標碼,也就是目標文件,最後透過「連結器」把多個目標文件以及呼叫的各種函數庫連結起來,形成一個可執行檔,也就是 ELF 檔。
那 ELF 檔是怎麽被執行的呢?
執行 ELF 檔的時候,會透過「裝載器」把 ELF 檔裝載到記憶體裏,CPU 讀取記憶體中的指令和數據,於是程式就被執行起來了。
Monolithic Kernel
Monolithic Kernel 的意思是 整塊性核心 ,Linux 內核架構就是整塊性核心,意味著 Linux 的內核是一個完整的可執行程式,且擁有最高的許可權。
整塊性核心的特征是系統內核的所有模組,比如行程排程、記憶體管理、檔案系統、器材驅動等,都執行在內核態。
不過,Linux 也實作了動態載入內核模組的功能,例如大部份器材驅動是以可載入模組的形式存在的,與內核其他模組解藕,讓驅動開發和驅動載入更為方便、靈活。
與整塊性核心相反的是 微內核 ,微內核架構的內核只保留最基本的能力,比如行程排程、虛擬機器記憶體、中斷等,把一些套用放到了使用者空間,比如驅動程式、檔案系統等。這樣服務與服務之間是隔離的,單個服務出現故障或者完全攻擊,也不會導致整個作業系統掛掉,提高了作業系統的穩定性和可靠性。
微內核內核功能少,可移植性高,相比整塊性核心有一點不好的地方在於,由於驅動程式不在內核中,而且驅動程式一般會頻繁呼叫底層能力的,於是驅動和硬件器材互動就需要頻繁切換到內核態,這樣會帶來效能損耗。華為的鴻蒙作業系統的內核架構就是微內核。
還有一種內核叫 混合類別內核 ,它的架構有點像微內核,內核裏面會有一個最小版本的內核,然後其他模組會在這個基礎上搭建,然後實作的時候會跟整塊性核心類似,也就是把整個內核做成一個完整的程式,大部份服務都在內核中,這就像是整塊性核心的方式包裹著一個微內核。
Windows 設計
當今 Windows 7、Windows 10 使用的內核叫 Windows NT,NT 全稱叫 New Technology。
下圖是 Windows NT 的結構圖片:
Windows 和 Linux 一樣,同樣支持 MutiTask 和 SMP,但不同的是, Window 的內核設計是混合型內核 ,在上圖你可以看到內核中有一個 MicroKernel 模組,這個就是最小版本的內核,而整個內核實作是一個完整的程式,含有非常多模組。
Windows 的可執行檔的格式與 Linux 也不同,所以這兩個系統的可執行檔是不可以在對方上執行的。
Windows 的可執行檔格式叫 PE,稱為
可移植執行檔
,副檔名通常是
.exe
、
.dll
、
.sys
等。
PE 的結構你可以從下圖中看到,它與 ELF 結構有一點相似。
總結
對於內核的架構一般有這三種類別:
Linux 的內核設計是采用了整塊性核心,Window 的內核設計則是采用了混合內核。
這兩個作業系統的可執行檔格式也不一樣, Linux 可執行檔格式叫作 ELF,Windows 可執行檔格式叫作 PE。
參考資料
- https:// en.wikipedia.org/wiki/M onolithic_kernel
- https:// en.wikipedia.org/wiki/E xecutable_and_Linkable_Format
- https:// en.wikipedia.org/wiki/W indows_NT
-----------------
說幾句。
小林在知乎寫了很多 圖解網絡和作業系統 的系列文章,很高興收獲到很多知乎朋友的認可和支持,正好最近圖解網絡和作業系統的文章連載的有 20+ 篇 了,也算有個體系了。
所以為了方便知乎的朋友們閱讀, 小林把自己原創的圖解網絡和圖解作業系統整理成了 PDF ,一整理後,沒想到每個圖解都輸出了 15 萬字 + 500 張圖, 質素也是杠杠的,有很多朋友特地私信我,看了我的圖解拿到了大廠的offer。
圖解系統 PDF 開源下載:
圖解網絡 PDF 開源下載:
最後祝大家前程似錦,在編碼的道路上一馬平川。
如果文章對你幫助的話,可以給@小林coding
點個贊,點個收藏,評論下更先顯溫情!