假設(shè)這里的虛擬化是指在一個(gè)OS下虛擬化另外一個(gè)OS(ESX那種hypervisor直接跑在硬件上的做法,其實(shí)大同小異),另外假設(shè)這里的虛擬化是" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 虛擬機(jī)是怎么實(shí)現(xiàn)的?

虛擬機(jī)是怎么實(shí)現(xiàn)的?

時(shí)間:2024-01-06 06:12:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2024-01-06 06:12:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)

虛擬機(jī)是怎么實(shí)現(xiàn)的?:?jiǎn)栴}有點(diǎn)大,籠統(tǒng)的試答一下??颖容^深,最好有基本的OS基礎(chǔ)才好理解。

假設(shè)這里的虛擬化是指在一個(gè)OS下虛擬化另外一個(gè)OS(ESX那種hypervisor直接跑在硬件上的做法,其實(shí)大同小異),另外假設(shè)這里的虛擬化是指full virtualization而不是Xen那種para-virtualization。最后假設(shè)虛擬化的是一個(gè)早期的x86機(jī)子(沒有hardware supported virtualization的存在)。

要回答這個(gè)問題,首先看為什么一個(gè)OS無(wú)法直接與另外的OS共存。答案很簡(jiǎn)單,OS作為硬件上第一層軟件,認(rèn)為自己擁有全部的硬件的訪問和控制權(quán),且自己是唯一的控制者。在這種情況下,如果兩個(gè)OS共存,必然產(chǎn)生問題。

OS主要負(fù)責(zé)管理的是CPU和內(nèi)存,以及眾多的IO設(shè)備。于是我們可以分別討論。hypervisor是實(shí)現(xiàn)虛擬化的關(guān)鍵,它會(huì)以一個(gè)內(nèi)核態(tài)的驅(qū)動(dòng)存在。


CPU的虛擬化:

背景知識(shí):x86 CPU有一項(xiàng)權(quán)限機(jī)制,把CPU的狀態(tài)置于RING 0到RING 3分別使CPU具有最高的權(quán)限到最低的權(quán)限。以Linux為例,內(nèi)核運(yùn)行于RING 0上,而其余全部用戶進(jìn)程運(yùn)行于RING 3上(Xen比較奇葩,Linux在Xen下面會(huì)運(yùn)行于RING 1)。在用戶權(quán)限下,所有的IO設(shè)備是不可操作的,另外,有些控制寄存寄是無(wú)法訪問的,一些privilege的指令是不能運(yùn)行的。因此一個(gè)用戶進(jìn)程要想讀寫文件,進(jìn)行一些操作,就要依賴于內(nèi)核。系統(tǒng)調(diào)用能夠使CPU運(yùn)行于RING 0,并執(zhí)行內(nèi)核代碼(具體方法見一些操作系統(tǒng)教程)。

背景說(shuō)完。一個(gè)CPU的全部狀態(tài)其實(shí)就是所有寄存器的值,只要保證任何操作之后寄存寄的值在OS看來(lái)是正確的,guest OS就可以正常執(zhí)行。hypervisor會(huì)為每個(gè)虛擬的CPU創(chuàng)建一個(gè)數(shù)據(jù)結(jié)構(gòu),模擬CPU的全部寄存器的值,在適當(dāng)?shù)臅r(shí)候跟蹤并修改這些值。

那么考慮虛擬化一個(gè)CPU,在虛擬化的guest OS里面,CPU無(wú)論如何也不可能運(yùn)行于RING 0,因?yàn)檫@樣的話,host OS必然會(huì)crash掉。因此,當(dāng)一個(gè)guest OS想要進(jìn)入到RING 0執(zhí)行內(nèi)核代碼時(shí),hypervisor會(huì)向guest OS說(shuō)謊,并告訴它,你已經(jīng)在RING 0上了,而實(shí)際上,所有的指令還是在RING 3上。當(dāng)guest OS訪問到任何privilege的東西時(shí),hypervisor會(huì)接到fault,此時(shí)hypervisor會(huì)判斷這個(gè)指令是什么,并修改相應(yīng)的虛擬寄存器的狀態(tài),然后返回。這樣guest OS就可以正常的運(yùn)行。需要指出的是,在大多數(shù)的指令下代碼是直接跑在硬件上的,而不需要軟件介入。只有在一些權(quán)限高的請(qǐng)求下,軟件會(huì)介入,并維護(hù)虛擬的CPU狀態(tài)。

內(nèi)存的虛擬化:

背景知識(shí):虛擬內(nèi)存,頁(yè)表結(jié)構(gòu)等。OS的基礎(chǔ)內(nèi)容,不表。

hypervisor虛擬化內(nèi)存的方法是創(chuàng)建一個(gè)shadow page table。正常的情況下,一個(gè)page table可以用來(lái)實(shí)現(xiàn)從虛擬內(nèi)存到物理內(nèi)存的翻譯。在虛擬化的情況下,由于所謂的物理內(nèi)存仍然是虛擬的,因此shadow page table就要做到:虛擬內(nèi)存->虛擬的物理內(nèi)存->真正的物理內(nèi)存。

以下是細(xì)節(jié),如果看著鬧心,請(qǐng)忽略。hypervisor會(huì)維護(hù)一個(gè)從虛擬內(nèi)存到物理內(nèi)存的映射,當(dāng)guest OS更換自己的page table,也就是改變CR3寄存器的值,hypervisor會(huì)因?yàn)橛脩魬B(tài)的權(quán)限不足而接到一個(gè)general exception,hypervisor會(huì)記錄用戶想要更換的新的頁(yè)表,并放上一個(gè)空的shadow page table,然后返回。這個(gè)空的shadow page table會(huì)在接下來(lái)的執(zhí)行中造成CPU無(wú)法進(jìn)行地址翻譯,而產(chǎn)生page fault。在fault發(fā)生后,hypervisor會(huì)得到一個(gè)虛擬地址,然后根據(jù)之前記錄的用戶的頁(yè)表結(jié)構(gòu),翻譯出一個(gè)虛擬機(jī)器地址,然后再把這個(gè)虛擬的機(jī)器地址,由hypervisor維護(hù)的映射翻譯為實(shí)際的機(jī)器地址,然后裝入shadow page table,并返回執(zhí)行。如此,就實(shí)現(xiàn)了:虛擬內(nèi)存->虛擬的物理內(nèi)存->真正的物理內(nèi)存。

I/O虛擬化:

背景知識(shí):memory mapped I/O device。大多數(shù)的PCI設(shè)備都是直接將自己的某些控制寄存器映射到物理內(nèi)存空間上,CPU訪問這些控制寄存器的方法和訪問內(nèi)存相同。CPU通過(guò)修改和讀取這些寄存器來(lái)操作I/O設(shè)備。

虛擬化的方法很簡(jiǎn)單,沒當(dāng)hypervisor接到page fault,并發(fā)現(xiàn)實(shí)際上虛擬的物理內(nèi)存地址對(duì)應(yīng)的是一個(gè)I/O設(shè)備,hypervisor就用軟件模擬這個(gè)設(shè)備的工作情況,并返回。比如當(dāng)CPU想要寫磁盤時(shí),hypervisor就把相應(yīng)的東西寫到一個(gè)host OS的文件上,這個(gè)文件實(shí)際上就模擬了虛擬的磁盤。


這里忽略了很多異常處理等等細(xì)節(jié),但求簡(jiǎn)化,可是貌似還是寫多了。以上。

關(guān)鍵詞:實(shí)現(xiàn),虛擬

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉