操作系統(tǒng)如何實現(xiàn):什么是宏內核、微內核?
操作系統(tǒng)和普通的大型應用程序項目類似,都涉及代碼組織方式的問題,但操作系統(tǒng)的獨特之處在于其核心部分必須運行在內核態(tài),kernel model,所謂內核態(tài)嚴格講是指在該狀態(tài)下程序擁有對硬件(hardware)的所有控制權,運行在用戶態(tài)的程序做不到這一點。
有的同學可能會有疑問,操作系統(tǒng)(或者說內核)不都是核心部分嗎?嚴格來講像進程管理調度、內存管理等就是核心部分,但像驅動等就不是那么核心了,那么這一部分也需要放在內核態(tài)嗎?
圍繞這一劃分,出現(xiàn)了兩種操作系統(tǒng)的設計方式,關于這兩種設計方法的爭論就和復雜指令集(CISC)與精簡指令集(RISC)哪個更好一樣至今沒有非常明確的定論。

大一統(tǒng),全部運行在內核態(tài)
最簡單的劃分就是沒有劃分,我們可以把所有內核代碼放在內核態(tài),內核中的任何代碼都擁有控制硬件的全部特權,顯然這種設計方法非常簡單,因為操作系統(tǒng)設計者不用費心去想哪一部分該放在內核態(tài)。
由于全部內核程序都運行在內核態(tài),編譯好的內核程序就是一個單獨的二進制可執(zhí)行文件,這時的操作系統(tǒng)運行起來后就是一個大進程,所有內核代碼運行在一個單獨的地址空間中,這和我們實現(xiàn)的稍微復雜的單進程應用程序類似,這種大一統(tǒng)的設計就是所謂的宏內核,monolithic kernel,個人認為叫“一體化內核”更形象些。

這種組織方式和TCP/IP協(xié)議棧的分層實現(xiàn)有點類似。
現(xiàn)在內核代碼已經組織好了,畢竟內核是為上層應用提供服務的,那么上層應用該怎樣調用內核代碼呢?這就是系統(tǒng)調用的作用,system call。

【文章福利】小編推薦自己的Linux內核技術交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ?


上層應用程序通過系統(tǒng)調用與內核進行交互。
由于內核代碼唯一同一個地址空間中,因此內核中各部分的交互極為簡單,就是普通的函數(shù)調用,文件系統(tǒng)中的某塊cache可以非常容易的被虛擬內存系統(tǒng)共享使用。
但宏內核也是有缺點的,由于內核代碼位于同一個地址空間,代碼趨于復雜化,復雜就容易出錯,但內核和普通程序不同,一旦內核中某一模塊出現(xiàn)bug將導致整個內核崩潰,底層的內核崩潰后上層的應用程序就無法繼續(xù)正常推進,整個系統(tǒng)就下圖一樣。。crash

當然也有人不在乎在這一點,Linus認為內核中有bug正常,有bug就找到它、修復它而不是用某種機制試圖忽略它,沒錯,C++中的異常就是試圖忽略bug的機制,這就是為什么很多公司的規(guī)范中禁止使用異常的原因。
總之,內核崩潰后就必須重啟計算機。
保留核心,非必要不留在內核
為減少內核崩潰的風險,一個簡單的辦法就是讓內核盡量精簡,只保留核心部分運行在內核態(tài),其它代碼以用戶態(tài)進程的形式運行,就像這樣:

運行在用戶態(tài)的操作系統(tǒng)程序被稱為server,像負責文件操作的File Server等,此時用戶進程想要使用操作系統(tǒng)提供的服務的話就必須借助進程間通信,inter-process communication,即IPC,借助內核,消息從一個進程發(fā)送到另一個進程然后等待返回。
這樣,內核只需要對上層應用提供一些簡單的接口即可,像創(chuàng)建進程、發(fā)送消息等,這種實現(xiàn)方式可以讓內核盡可能簡單,因為大部分內核程序都運行在用戶態(tài),且運行在不同的地址空間中,此時設備驅動中的bug不會影響到內核,這種操作系統(tǒng)的實現(xiàn)方式就被稱為微內核, micro kernel。
就像宏內核那樣,微內核也有自己的缺點,那就是性能。由于宏內核的代碼都在同一個地址空間中,因此模塊間的交互可以非常簡單,簡單的函數(shù)調用即可,但模塊間交互對微內核來說則可能涉及進程間通信,看上圖,如果某個應用程序需要請求使用File Server,這條鏈路涉及到:
請求:應用程序 -> 內核 -> File server 返回:Filer server -> 內核 -> 應用程序
每一個"->"都涉及上下文切換,而這對宏內核來說則簡單很多。
現(xiàn)實中是什么樣子?
現(xiàn)實的操作系統(tǒng)中兩種實現(xiàn)方式都很常見,Linux以及許多Unix就是典型的宏內核,而Mac OS X 以及 Windows NT則一般認為是微內核,華為的鴻蒙Harmony OS則宣傳是微內核。

有趣的是,對Linus創(chuàng)建Linux影響極大的MINIX操作系統(tǒng)也是微內核,而Linux則是宏內核,難怪MINIX的作者——也是操作系統(tǒng)這門課的教授說過,如果Linus是他的學生的話那么操作系統(tǒng)系統(tǒng)這門課的期末考試Linus可能很難通過,哈哈,因為MINX的作者認為在Linux被創(chuàng)造出來的上世紀90年代竟然還有人以宏內核的方式來編寫操作系統(tǒng),這簡直不可思議,而Linus則不以為意,并進行了火爆的回擊,
可以看到操作系統(tǒng)的設計方式就和CPU關于復雜指令集與精簡指令集的設計一樣分成了兩派,關于宏內核與微內核孰優(yōu)孰劣爭論至今依然沒有定論。
