怎樣向一個外行人解釋操作系統內核?去看《黑客帝國》
今年早些時候,我新加入了一個大多數從事研究社會科學和政治小組,然后我得向他們介紹一下我目前正在從事的工作。在這大概有10個人的小組中,有一兩個人對內核的概念是有一個初步的了解(實際上因為他們是工科學生),但是小組中的其他人卻對內核茫然無知—他們等著我給他們說明解釋一下。
那么,對于那些有點基本概念的工科生,首選方法就是打一個有關于汽車的比方(至少得是男性聽眾)。然而,實際上你能把汽車上的什么東西來比作內核呢?你是不能直接把內核比作發動機,或者底盤,甚至是車輛行駛的道路。當你試著去解釋一個內核程序員能夠利用操作系統做什么的時候就更糟糕了。在將汽車作為喻體時,內核到底是什么呢?一個內核程序員并不能直接定義為一個技工。那么,定義為汽車設計師之類的嗎?經過長時間的斷斷續續的解釋和遲疑,我試著先向小組中的女孩們解釋,這就像是內核開發者為奔跑的汽車設計物理定律。很遺憾,她們仍然不相信。
你有更好地解釋嗎?
《黑客帝國(The Matrix)》于1999年上映的,因此,很快我就對操作系統開始感興趣,最后我還在FreeBSD(一種免費的Unix系統)項目中成為一名內核開發員。但是同時,我一直學習并癡迷于《黑客帝國(The Matrix)》,花費了大量的時間。
在二十一世紀初的某個時候,大概是在03或04年,我寫下了一篇文章,我將《黑客帝國》中人物和他們發生的事以及它的續集與一個(虛擬的)操作系統做一個系統的類比。為了將久遠的這篇文章保存下來,防止內容的丟失在被遺忘的服務器上,就將它遷移到云上,我在下面復制粘貼了該文章的初始內容。提示:你可以將該比喻引申的更遠。
既然操作系統的設計,實現和維護是我最大的興趣之一,而且我在第一時間就觀看了《黑客帝國》,于是便對電影里的一些概念進行了思考,并認為它們與操作系統存在某種程度上的相似之處:
Matrix世界:
相當于一個正在運行的具有用戶空間的操作系統(我們人類居住的普通世界,內核(“Matrix”本身))。顯然的,這是一個頗有缺陷的操作系統。。。
民眾:
相當于進程,包括內核進程和用戶進程。一般進程,“非特權”進程和具有root權限的后臺進程(“特工”)還是有很大的區別。具有root權限的后臺進程可以使用特權端口,銷毀隨機進程,管理內存等等。
Matrix:
相當于內核。它看上去是基于消息傳遞的內核結構,而并非是微內核結構(盡管它們具有微內核的某些部分,比如擁有大量內核進程,進程之間都是嚴格獨立的,以及已提到的消息傳遞機制)。內核管理所有的進程,以及進程上的操作(比如保持進程活躍,為進程服務,回收進程)。但是這仍有一個明顯的安全缺陷:某些用戶進程能夠將它們的部分代碼傳送到內核空間并執行(因為一個bug)。只有某些系統調用受到影響(類似于 ”phones”),這種擴大了的特權篡改了用戶進程的返回棧,因此,如果該進程接收到一個信號,它會產生段錯誤并被作為垃圾回收(你如果在Matrix中被殺掉的話,那么你就真的死掉了)。
先知(Oracle):
相當于進程(任務)調度器。擁有處理監聽(資源利用率)的所有數據以及提前(這很顯然)知道怎樣對它們進行最優調度。
特工(Agents):
相當于系統監控/入侵防護/具有啟發式操作的防護系統(IDS(入侵檢測系統)/IPS(信息處理系統))。它們中絕大多數都有一個內核部分(或內核模塊)但基本上卻是那些具有超級用戶特權的后臺進程在用戶空間運行。它們的職責是發現試圖入侵系統安全的進程并銷毀掉。
列車員:
相當于內核和用戶空間的網關/信息傳遞隊列。你如果想要合法地在用戶空間和內核進行數據傳遞必須通過這里來進行。當然,你也可能永遠被困在排隊隊列中。
邪惡宗師—梅羅紋奇(Merovingian):
相當于網絡/IPC(進程間通信)棧。它的職責是掌握進程之間都發生了什么。輸入/輸出數據的一個偶然錯誤將以一個bug的形式表現出來。
“鬼魅”(Ghost):
相當于老版本API/KPI的兼容器。由于歷史原因,這些代碼并不完善,但與某些內核進程相連的代碼卻不應該不完整。
“建筑師”(Architect):
相當于硬件上的內核監控(管理者),負責監控進程,銷毀那些“畸形”進程并對銷毀的進程進行重啟。由于它是一個實時的具有高度可靠性的系統,在硬件上進行調試和監控顯然具有最高的優先級,而且還絕對是可靠的(因此,為了降低出錯的可能性,也降低它的復雜性)。由于它頻繁地進行可用性檢查,造成了過度的錯誤配置,消耗了太多的資源,因此影響到了操作系統的正常運作。
關鍵人物—制鑰者:
相當于安全/特權子系統。它很穩定,但不幸的是需要依賴不完善的VM(虛擬內存)系統和IPC系統,因此它可被進程利用來獲取更多的特權。
Matrix系統設計:
在系統高度負載的情況下(大量的進程,頻繁的內存讀寫),VM(虛擬內存)系統,進程管理系統和調度器之間有一個設計缺陷。這是一個復合錯誤,至少會導致三種問題的產生:1、內存頁被破壞或者內存頁分配給那些不屬于它們的進程。由于內核和用戶空間共享虛擬內存,為了防止敏感數據的暴露,提高安全性,任何一方的進程都可以因為得到另一方的內存頁而被銷毀。2、進程間通信,這是非常糟糕的,甚至比進程的數據結構被破壞或者內存裝載太頻繁而造成死鎖,而不得不等待緩沖區還要糟糕。3、系統監控變得不穩定,循環地銷毀和重啟進程,察覺不到這樣的操作會額外增加內存和進程的負擔而變得更糟糕,最后極大地增長了進程間虛擬內存頁被破壞的速度。
史密斯特工:
相當于有特權的IPC后臺程序,具有部分內核模塊功能。它與內核模塊關系密切,且能夠不通過完整性檢查而與內核共享數據結構。一旦它被另一個特權進程銷毀掉,它也能藏身于一個系統調用中間以便于監控者重啟它,此時它的進程描述符也被破壞,這樣使得它的大部分程序代碼將在內核中執行。它將繼續以這種受損狀態長時間工作,鍥入到一個循環中,并將進程錯誤地標記為安全漏洞,同時重寫它的某些內存頁。
尼奧(Neo):
最初是一個用戶空間的網絡服務進程,虛擬內存的損壞導致它被賦予了超級用戶的特權以及具有CPU高優先級。最后它得到可執行的內存頁與IDS進程Simth的混合,但卻不是數據頁。很快它也開始銷毀進程,包括Smith和它自己被損壞的部分。
結局:
最后Smith進程試圖殺死調度者進程,但由于他本是也是通過該調度者調度的,他并不能這么做。系統變得畸形是因為調度者不能再執行任務,包括中斷服務,但是在調度者的虛擬內存鏡像(同樣該鏡像也偶然地與Neo進程進行了部分共享)里的部分Smith代碼卻仍然可以執行。由于只有兩個進程可以運行,他們都想殺掉對方。與此同時,由于沒有中斷服務,硬件的監視時鐘別喚醒,它插入了一個NMI(不可屏蔽的中斷),這樣就又喚醒了監控系統。這就使得系統處于臨界狀態并開始殺掉所有的進程,然后重啟被殺掉的進程來使系統再次啟動。結束!
分析總結
在操作系統的設計時候有一個內在的缺陷,特別是在虛擬內存,進程間通信和監控子系統這幾方面,這將導致進程間的全局內存被破壞以及在少量進程的地址空間產生致命的缺陷。
建議:
要保證適宜的進程優先級,必須進行更多的微調,減少優先級反轉和失衡。很可能要重寫虛擬內存系統,開發消耗更少資源的版本來取代IDS系統。如果系統負載處于某個閥值之上,系統監視器必須要進行修正,而不會再啟動大量的操作。
好了,這就是一篇有關The Matrix且不涉及任何形式“自由意志”的闡述。
原文鏈接:http://www.techug.com/jul-how-do-the-matrix-as-an-operating-system