目錄
一、什麼是內核?
1.1 內核的能力
二、操作系統分層
三、內核是如何工作的?
四、Linux 的設計
4.1 Multitask and SMP(Symmetric multiprocessing)
4.2 ELF(Executable and Linkable Format)
4.3 Monolithic Kernel
4.4 在內核層和在用戶層有什麼區別?
五、Window 設計
六、總結
一、什麼是內核?
說到操作系統,就必須說內核。內核是操作系統中應用連接硬體設備的橋樑。
1.1 內核的能力
對於一個現代的操作系統來說,它的內核至少應該提供以下 4 種基本能力:
- 管理進程、線程(決定哪個進程、線程使用 CPU);
- 管理內存(決定內存用來做什麼);
- 連接硬體設備(為進程、和設備間提供通信能力);
- 提供系統調用(接收進程發送來的系統調用)。
二、操作系統分層
從上面 4 種能力來看操作系統和內核之間的關係,通常可以把操作系統分成 3 層,最底層的硬體設備抽象、中間的內核和最上層的應用。


三、內核是如何工作的?
內核許可權非常高,它可以管理進程、可以直接訪問所有的內存,因此確實需要和進程之間有一定的隔離。這個隔離用類似請求/響應的模型,非常符合常理。


但不同的是在瀏覽器、服務端模型中,瀏覽器和服務端是用不同的機器在執行,因此不需要共享一個 CPU。但是在進程調用內核的過程中,這裡是存在資源共享的。
比如,一個機器有 4 個 CPU,不可能讓內核用一個 CPU,其他進程用剩下的 CPU。這樣太浪費資源了。
再比如,進程向內核請求 100M 的內存,內核把 100M 的數據傳回去。 這個模型不可行,因為傳輸太慢了。
所以,這裡多數操作系統的設計都遵循一個原則:進程向內核發起一個請求,然後將 CPU 執行許可權讓出給內核。內核接手 CPU 執行許可權,然後完成請求,再轉讓出 CPU 執行許可權給調用進程。
四、Linux 的設計
Linux 操作系統第一版是1991 年林納斯托·瓦茲(一個芬蘭的小夥子,當時 22 歲)用 C 語音寫的。 寫完之後他在網路上發布了 Linux 內核的源代碼。又經過了 3 年的努力,在 1994 年發布了完整的核心 Version 1.0。
4.1 Multitask and SMP(Symmetric multiprocessing)
MultiTask 指多任務,Linux 是一個多任務的操作系統。多任務就是多個任務可以同時執行,這裡的「同時」並不是要求並發,而是在一段時間內可以執行多個任務。當然 Linux 支持並發。
SMP 指對稱多處理。其實是說 Linux 下每個處理器的地位是相等的,內存對多個處理器來說是共享的,每個處理器都可以訪問完整的內存和硬體資源。 這個特點決定了在 Linux 上不會存在一個特定的處理器處理用戶程序或者內核程序,它們可以被分配到任何一個處理器上執行。
4.2 ELF(Executable and Linkable Format)


這個名詞翻譯過來叫作可執行文件鏈接格式。這是一種從 Unix 繼承而來的可執行文件的存儲格式。我們可以看到 ELF 中把文件分成了一個個分段(Segment),每個段都有自己的作用。
4.3 Monolithic Kernel
這個名詞翻譯過來就是宏內核,宏內核反義詞就是 Microkernel ,微內核的意思。Linux 是宏內核架構,這說明 Linux 的內核是一個完整的可執行程序,且內核用最高許可權來運行。宏內核的特點就是有很多程序會打包在內核中,比如,文件系統、驅動、內存管理等。當然這並不是說,每次安裝驅動都需要重新編譯內核,現在 Linux 也可以動態載入內核模塊。所以哪些模塊在內核層,哪些模塊在用戶層,這是一種系統層的拆分,並不是很強的物理隔離。
與宏內核對應,接下來說說微內核,內核只保留最基本的能力。比如進程調度、虛擬內存、中斷。多數應用,甚至包括驅動程序、文件系統,是在用戶空間管理的。


4.4 在內核層和在用戶層有什麼區別?
感覺分層其實差不多。 我這裡說一個很大的區別,比如說驅動程序是需要頻繁調用底層能力的,如果在內核中,性能肯定會好很多。對於微內核設計,驅動在內核外,驅動和硬體設備交互就需要頻繁做內核態的切換。
當然微內核也有它的好處,比如說微內核體積更小、可移植性更強。不過我認為,隨著計算能力、存儲技術越來越發達,體積小、安裝快已經不能算是一個很大的優勢了。現在更重要的是如何有效利用硬體設備的性能。
之所以這麼思考,也可能因為我是帶著現代的目光回望當時人們對內核的評判,事實上,當時 Linux 團隊也因此爭論過很長一段時間。 但是我覺得歷史往往是螺旋上升的,說不定將來性能發展到了一個新的階段,像微內核的靈活性、可以提供強大的抽象能力這樣的特點,又重新受到人們的重視。
還有一種就是混合類型內核。 混合類型的特點就是架構像微內核,內核中會有一個最小版本的內核,其他功能會在這個能力上搭建。但是實現的時候,是用宏內核的方式實現的,就是內核被做成了一個完整的程序,大部分功能都包含在內核中。就是在宏內核之內有抽象出了一個微內核。
五、Window 設計
Windows 和 Linux 的設計有很大程度的相似性。Windows也有內核,它的內核是 C/C++ 寫的。準確地說,Windows 有兩個內核版本。一個是早期的Windows 9x 內核,早期的 Win95, Win98 都是這個內核。我們今天用的 Windows 7, Windows 10 是另一個內核,叫作 Windows NT。NT 指的是 New Technology。接下來我們討論的都是 NT 版本的內核。
下面我找到一張 Windows 內核架構的圖片給你一個直觀感受。


Windows 同樣支持 Multitask 和 SMP(對稱多處理)。Windows 的內核設計屬於混合類型。你可以看到內核中有一個 Microkernel 模塊。而整個內核實現又像宏內核一樣,含有的能力非常多,是一個完整的整體。
Windows 下也有自己的可執行文件格式,這個格式叫作 Portable Executable(PE),也就是可移植執行文件,擴展名通常是.exe、.dll、.sys等。
PE 文件的結構和 ELF 結構有很多相通的地方,我找到了一張圖片幫助你更直觀地理解。


Windows 還有很多獨特的能力,比如 Hyper-V 虛擬化技術.
六、總結
這一講我們學習了內核的基礎知識,包括內核的作用、整體架構以及 3 種內核類型(宏內核、微內核和混合類型內核)。
內核很小(微內核)方便移植,因為體積小、安裝快;內核大(宏內核),方便優化性能,畢竟內核更了解計算機中的資源。
Linux 內核和 Windows 內核有什麼區別?
【解析】 Windows 有兩個內核,最新的是 NT 內核,目前主流的 Windows 產品都是 NT 內核。NT 內核和 Linux 內核非常相似,沒有太大的結構化差異。
從整體設計上來看,Linux 是宏內核,NT 內核屬於混合型內核。和微內核不同,宏內核和混合類型內核從實現上來看是一個完整的程序。只不過混合類型內核內部也抽象出了微內核的概念,從內核內部看混合型內核的架構更像微內核。
另外 NT 內核和 Linux 內核還存在著許多其他的差異,比如:
- Linux 內核是一個開源的內核;
- 它們支持的可執行文件格式不同;
- 它們用到的虛擬化技術不同。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/252752.html
微信掃一掃
支付寶掃一掃