核心,是指的作業系統核心。
所有的作業系統都有核心,無論是Windows還是Linux,都管理着三個重要的資源:計算,網絡,存儲。
計算指CPU和記憶體,網絡即網絡裝置,存儲即硬碟之類的。

核心是個大管家,想象你的機器上跑着很多的程式,有word,有excel,看着視訊,聽着音樂,每個程式都要使用CPU和記憶體,都要上網,都要存硬碟,如果沒有一個大管家管着,大家随便用,就亂了。是以需要管家來協調排程整個資源,誰先用,誰後用,誰用多少,誰放在這裡,誰放在那裡,都需要管家操心。
是以在這個計算機大家庭裡面,管家有着比普通的程式更高的權限,運作在核心态,而其他的普通程式運作在使用者态,使用者态的程式一旦要申請公共的資源,就需要向管家申請,管家幫它配置設定好,它才能用。
為了區分核心态和使用者态,CPU專門設定四個特權等級0,1,2,3 來做這個事情。
當時寫Linux核心的時候,估計大牛們還不知道将來虛拟機會大放異彩,大牛們想,一共兩級特權,一個核心态,一個使用者态,卻有四個等級,好奢侈,好富裕,就敞開了用,核心态運作在第0等級,使用者态運作在第3等級,占了兩頭,太不會過日子了。
大牛們在寫Linux核心的時候,如果使用者态程式做事情,就将扳手掰到第3等級,一旦要申請使用更多的資源,就需要申請将扳手掰到第0等級,核心才能在高權限通路這些資源,申請完資源,傳回到使用者态,扳手再掰回去。
這個程式一直非常順利的運作着,直到虛拟機的出現。
如果大家用過Vmware桌面版,或者Virtualbox桌面版,你可以用這個虛拟化軟體建立虛拟機,在虛拟機裡面安裝一個Linux或者windows,外面的作業系統也可以是Linux或者Windows。
當你使用虛拟機軟體的時候,和你的excel一樣,都是在你的工作列裡面并排的放着,是一個普通的應用。
當你進入虛拟機的時候,虛拟機裡面的excel也是一個普通的應用。
但是當你設身處地的站在虛拟機裡面的核心的角度思考一下人生,你就困惑了,我到底個啥?
在硬體上的作業系統來看,我是一個普通的應用,隻能運作在使用者态。可是大牛們生我的時候,我的每一行代碼,都告訴我,我是個核心啊,應該運作在核心态,當虛拟機裡面的excel要通路網絡的時候,向我請求,我的代碼就要努力的去操作網絡資源,我努力,但是我做不到,我沒有權限!
我分裂了。
虛拟化層,也就是Vmware或者Virtualbox需要幫我解決這個問題。
第一種方式,完全虛拟化,其實就是騙我。虛拟化軟體模拟假的CPU,記憶體,網絡,硬碟給我,讓我自我感覺良好,終于又像個核心了。
真正的工作模式是這樣的。
虛拟機核心:我要在CPU上跑一個指令!
虛拟化軟體:沒問題,你是核心嘛,可以跑
虛拟化軟體轉過頭去找實體機核心:報告管家,我管理的虛拟機裡面的一個要執行一個CPU指令,幫忙來一小段時間空閑的CPU時間,讓我代他跑個指令。
實體機核心:你等着,另一個跑着呢。好嘞,他終于跑完了,該你了。
虛拟化軟體:我代他跑,終于跑完了,出來結果了
虛拟化軟體轉頭給虛拟機核心:哥們,跑完了,結果是這個,我說你是核心吧,絕對有權限,沒問題,下次跑指令找我啊。
虛拟機核心:看來我真的是核心呢。可是哥,好像這點指令跑的有點慢啊。
虛拟化軟體:這就不錯啦,好幾個排着隊跑呢。
記憶體的申請模式如下。
虛拟機核心:我啟動需要4G記憶體,我好分給我上面的應用。
虛拟化軟體:沒問題,才4G,你是核心嘛,馬上申請好。
虛拟化軟體轉頭給實體機核心:報告,管家,我啟動了一個虛拟機,需要4G記憶體,給我4個房間呗。
實體機核心:怎麼又一個虛拟機啊,好吧,給你90,91,92,93四個房間。
虛拟化軟體轉頭給虛拟機核心:哥們,記憶體有了,0,1,2,3這個四個房間都是你的,你看,你是核心嘛,獨占資源,從0編号的就是你的。
虛拟機核心:看來我真的是核心啊,能從頭開始用。那好,我就在房間2的第三個櫃子裡面放個東西吧。
虛拟化軟體:要放東西啊,沒問題。心裡想:我查檢視,這個虛拟機是90号房間開頭的,他要在房間2放東西,那就相當于在房間92放東西。
虛拟化軟體轉頭給實體機核心:報告,管家,我上面的虛拟機要在92号房間的第三個櫃子裡面放個東西。
好了,說完了CPU和記憶體的例子,不細說網絡和硬碟了,也是類似,都是虛拟化軟體模拟一個給虛拟機核心看的,其實啥事兒都需要虛拟化軟體轉一遍。
這種方式一個壞處,就是慢,往往慢到不能忍受。
于是虛拟化軟體想,我能不能不當傳話筒,還是要讓虛拟機核心正視自己的身份,别說你是核心,你還真喘上了,你不是實體機,你是虛拟機。
但是怎麼解決權限等級的問題呢?于是Intel的VT-x和AMD的AMD-V從硬體層面幫上了忙。當初誰讓你們這些寫核心的大牛用等級這麼奢侈,用完了0,就是3,也不省着點用,沒辦法,隻好另起爐竈弄一個新的标志位,表示目前是在虛拟機狀态下,還是真正的實體機核心下。
對于虛拟機核心來講,隻要将标志位設為虛拟機狀态,則可以直接在CPU上執行大部分的指令,不需要虛拟化軟體在中間轉述,除非遇到特别敏感的指令,才需要将标志位設為實體機核心态運作,這樣大大提高了效率。
是以安裝虛拟機的時候,務必要将實體CPU的這個标志位打開,是否打開對于Intel可以檢視grep "vmx" /proc/cpuinfo,對于AMD可以檢視grep "svm" /proc/cpuinfo
這叫做硬體輔助虛拟化。
另外就是通路網絡或者硬碟的時候,為了取得更高的性能,也需要讓虛拟機核心加載特殊的驅動,也是讓虛拟機核心從代碼層面就重新定位自己的身份,不能像通路實體機一樣通路網絡或者硬碟,而是用一種特殊的方式:我知道我不是實體機核心,我知道我是虛拟機,我沒那麼高的權限,我很可能和很多虛拟機共享實體資源,是以我要學會排隊,我寫硬碟其實寫的是一個實體機上的檔案,那我的寫檔案的緩存方式是不是可以變一下,我發送網絡包,根本就不是發給真正的網絡裝置,而是給虛拟的裝置,我可不可以直接在記憶體裡面拷貝給他,等等等等。
一旦我知道我不是實體機核心,痛定思痛,隻好重新認識自己,反而能找出很多方式來優化我的資源通路。
這叫做類虛拟化或者半虛拟化。
如果您想更技術的了解本文背後的原理,請看書《系統虛拟化——原理與實作》
歡迎關注微信公衆号