當前位置: 華文問答 > 數碼

Windows 內核和 Linux 內核誰更復雜?

2019-11-19數碼

兩個系統的內核結構不一樣,沒什麽可比性,都有各自的優勢。

Linux 內核和 Windows 內核有什麽區別?

內核

什麽是內核呢?

電腦是由各種外部硬件器材組成的,比如記憶體、cpu、硬碟等,如果每個套用都要和這些硬件器材對接通訊協定,那這樣太累了,所以這個中間人就由內核來負責, 讓內核作為套用連線硬件器材的橋梁 ,應用程式只需關心與內核互動,不用關心硬件的細節。

內核有哪些能力呢?

現代作業系統,內核一般會提供 4 個基本能力:

  • 管理行程、執行緒,決定哪個行程、執行緒使用 CPU,也就是行程排程的能力;
  • 管理記憶體,決定記憶體的分配和回收,也就是記憶體管理的能力;
  • 管理硬件器材,為行程與硬件器材之間提供通訊能力,也就是硬件通訊能力;
  • 提供系統呼叫,如果應用程式要執行更高許可權執行的服務,那麽就需要有系統呼叫,它是使用者程式與作業系統之間的介面。
  • 內核是怎麽工作的?

    內核具有很高的許可權,可以控制 cpu、記憶體、硬碟等硬件,而應用程式具有的許可權很小,因此大多數作業系統,把記憶體分成了兩個區域:

  • 內核空間,這個記憶體空間只有內核程式可以存取;
  • 使用者空間,這個記憶體空間專門給應用程式使用;
  • 使用者空間的程式碼只能存取一個局部的記憶體空間,而內核空間的程式碼可以存取所有記憶體空間。因此,當程式使用使用者空間時,我們常說該程式在 使用者態 執行,而當程式使內核空間時,程式則在 內核態 執行。

    應用程式如果需要進入內核空間,就需要透過系統呼叫,下面來看看系統呼叫的過程:

    內核程式執行在內核態,使用者程式執行在使用者態。當應用程式使用系統呼叫時,會產生一個中斷。發生中斷後, CPU 會中斷當前在執行的使用者程式,轉而跳轉到中斷處理常式,也就是開始執行內核程式。內核處理完後,主動觸發中斷,把 CPU 執行許可權交回給使用者程式,回到使用者態繼續工作。

    Linux 的設計

    Linux 的開山始祖是來自一位名叫 Linus Torvalds 的芬蘭小夥子,他在 1991 年用 C 語言寫出了第一版的 Linux 作業系統,那年他 22 歲。

    完成第一版 Linux 後,Linux Torvalds 就在網絡上釋出了 Linux 內核的原始碼,每個人都可以免費下載和使用。

    Linux 內核設計的理念主要有這幾個點:

  • MutiTask ,多工
  • SMP ,對稱多處理
  • ELF ,可執行檔連結格式
  • Monolithic Kernel ,整塊性核心
  • MutiTask

    MutiTask 的意思是 多工 ,代表著 Linux 是一個多工的作業系統。

    多工意味著可以有多個任務同時執行,這裏的「同時」可以是並行或並列:

  • 對於單核 CPU 時,可以讓每個任務執行一小段時間,時間到就切換另外一個任務,從宏觀角度看,一段時間內執行了多個任務,這被稱為並行。
  • 對於多核 CPU 時,多個任務可以同時被不同核心的 CPU 同時執行,這被稱為並列。
  • 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。

    參考資料

    1. https:// en.wikipedia.org/wiki/M onolithic_kernel
    2. https:// en.wikipedia.org/wiki/E xecutable_and_Linkable_Format
    3. https:// en.wikipedia.org/wiki/W indows_NT

    -----------------

    說幾句。

    小林在知乎寫了很多 圖解網絡和作業系統 的系列文章,很高興收獲到很多知乎朋友的認可和支持,正好最近圖解網絡和作業系統的文章連載的有 20+ 篇 了,也算有個體系了。

    所以為了方便知乎的朋友們閱讀, 小林把自己原創的圖解網絡和圖解作業系統整理成了 PDF ,一整理後,沒想到每個圖解都輸出了 15 萬字 + 500 張圖, 質素也是杠杠的,有很多朋友特地私信我,看了我的圖解拿到了大廠的offer。

    圖解系統 PDF 開源下載:

    圖解網絡 PDF 開源下載:

    最後祝大家前程似錦,在編碼的道路上一馬平川。

    如果文章對你幫助的話,可以給@小林coding

    點個贊,點個收藏,評論下更先顯溫情!