計算機虛擬技術有那麼難嗎,比如vmware?

我一直下意識以為這個應該挺簡單的,可能某幾個個人就搗鼓出來了,應用也應該不廣泛。
但是看了下vmware公司,市值400多億美元。應用相當廣泛。這是為啥


從問題的內容來看,LZ對計算機的硬體、操作系統沒有什麼概念,所以這裡不會展開,只是簡單說一下。

我不知道LZ所謂的「下意識」指的是什麼,但是從技術原理上說,主要的工作量和難點在於搭建起一整套可靠的Hypervisor,而這個工作存在「技術難度較大和工作量較多」的情況。並不像LZ想的那麼簡單。

舉個簡單的例子,VMware的Hypervisor上的多台虛擬機同時讀寫同一塊物理硬碟上的不同文件,這就牽涉到很麻煩的IO同步的問題。想解決好,一方面要利用Intel CPU除了ring0和ring3之外的另外2個運行級別,另外還要將不同VM上的IO操作統一接管過來,難度和工作量可想而知。

而這僅僅是Hypervisor中很基礎的一個功能點,還有很多同樣級別的功能點,還要和操作系統、CPU等一干硬體進行適配,沒點技術根本就別想把它弄出來,即使弄出來也別想穩定,即使穩定了效率也不一定高。

LZ可以去看看它的競爭對手,Citrix公司的XenServer 7.0以上版本的源代碼,官網都有提供下載地址,即使XenServer被吐槽不夠穩定,操作不夠方便,效率不夠高,但是從代碼量上來看就已經能夠嚇走一干人等了,而VMware vSphere至少和XenServer是一個等級上的,LZ可以自己感受一下先。


2006年之後的確變簡單了。1998年之前的x86是號稱無法完全虛擬化的,然後「某幾個個人」搞了出來,於是就有了vmware。不過就算今天虛擬化再怎麼簡單,我也不相信能問出這種問題的題主能寫一個vmm出來。

================
趁著編譯,補充點乾貨:

早期vmm難以實現的原因:
- 最大難題:x86的某些指令,在非ring 0的情況下執行,行為和在ring 0下不同,並且不會產生fault,這導致了trap-n-emulate形式的virtualization沒辦法直接實現,這也是早期被認為是無法虛擬化的主要原因。解決方法是binary translation,代碼極其複雜,需要深厚內力才能讀懂,更別說寫出來。compiler、OS、architecture的知識一樣不能少。
- MMU的虛擬化。虛擬內存提供了virtual address -&> physical address的mapping,但是要想virtualize一個guest OS,那麼就要做到virtual address -&> guest virtual physical address -&> machine address的mapping。於是就要在MMU裡面動手腳,創建一個shadow page table,完成virtual address -&> machine address的直接翻譯,為了保持正確性,必須對OS透明地維護好TLB,並監視guest OS對自己認為的真正的page table的一切修改。這個過程可以簡單粗暴,只要guest一load CR3就清空shadow page table,flush TLB。也可是十分細膩,對shadow page table做更加細緻的更新。前者實現複雜度略低,性能自然很差,因為TLB miss rate奇高,並且由於要經常清空shadow page table,page fault也更多。後者性能好,但是實現異常複雜,cache consistency難以維護。
- IO。如果不計性能,這塊其實比較容易解決,但是也需要對PCI device的工作機制有著深厚的理解。早期的vmm對IO幾乎就是直接emulate。
- CPU的虛擬化,CPU的型號一大堆,每個型號之間的指令集和指令行為都有不同。還有很多CPU有bug,於是為了over come這些,monitor裡面要做很多ad hoc的修改。
- 其他:BIOS,perforamce monitoring,hardware counters,graphics,guest crash handling,interrupt delivery等

今天vmm難以實現:
- CPU種類繁多
- PCI pass through的維護
- 達到近乎native running的速度
- 高並發I/O
- concurrent bugs和lock contention
- numa
- security
- cache consistency
...

最後,題主可能是把virtualization當成是emulation了。即使後者本身也很複雜,參考qemu。


發動機技術有那麼難嗎?不就是高中學的那點物理嗎,應該挺簡單的,可能某幾個人就搞出來了。

vmware的主營業務之一是把一個虛擬機無痛地從一個機器搬到另一個機器上。嗯,樓主可以聯想一下變4裡面能變成流體的變形金剛……


要弄出一個VMM,首先得把Intel Software Developer Manuals ABC三冊融會貫通,並把它體現到一堆***.c文件中。。。

明天要答辯,先馬克,答辯完再來寫。
-----------------------------------------------------------------------------------------------------
咯咯咯咯咯咯咯咯,畢業答辯結束啦╰(?? ▽ ??)╯,接著來回答這個問題。

先說CPU虛擬化,在硬體虛擬化技術推出之前,VMware使用動態二進位翻譯(Dynamic Binary Translation,DBT)技術,其中的工作個人認為和搞編譯器後端的那幫人從事的差不多,只不過DBT的輸入已經是一段二進位指令,DBT要將其翻譯成另一段「對虛擬化友好」(能降權在Ring3 執行並在適當的時候讓VMM得到通知)的二進位指令。概要地說,大部分算術運算指令(add、inc之類)可以保持原樣或僅需微小改動,涉及處理器狀態的指令(如cli、load/store cr3、r/w msr等)需要產生到VMM的function call並由VMM模擬執行,跳轉指令也需要做特殊處理。其實光寫一個x86的disassembler就已經夠費勁的了,更不必說這種還要對指令進行精密調整的工作了。

再來說內存的虛擬化。。。

再來說外設的虛擬化。。。

再來說一說虛擬化中幾個有趣特性的實現。

1、SMP VM的實現
2、VM中高性能I/O的實現


vmware公司的產品你接觸過多少。別只看到vmware workstation喔。你看看vsphere的功能你能實現幾個。


2003年底,
有個美國客戶委託我們公司開發一個vmware一樣的虛擬軟體,預算約600萬刀。
我們仔細評估後,不敢接這個項目。


題主先來實現一個docker吧。


是,應用不應該很廣泛。30台各種型號的物理機跑了200個虛擬機,而且偶爾壞一兩台完全不影響,確實應用不是很廣泛,怎麼能值400億美元呢。


1.幾個人是寫不出來的,有可能0.1版本是個人寫的,但當前的版本幾個人寫不出來。
2.虛擬化技術非常複雜,涉及OS(win,Linux,BSD),CPU,計算機架構,活脫脫的IT軟硬體工業知識都用到了。技術上細節對LZ意義不大,入門請翻看Intel虛擬化手冊對照kernel代碼。
3.虛擬化應用非常廣泛,像樣的IT公司如Intel,HP,IBM,RedHat,MS,HW,浪潮都在玩,雲計算會一統未來的伺服器市場,而虛擬化是雲計算的基石,不想死都要跟上來。互聯網大佬如Amazon,Google,alibaba更是虎視眈眈。
4.VMware值錢是因為:它開虛擬化規模應用方案先河,有一整套的閉源雲計算方案,有很強的規模效應和先發優勢,其他廠商還在OpenStack和KVM領域玩耍,開源方案在性能上目前不佔優勢,易用性更是簡陋。整個伺服器市場上的大半蛋糕都被VMware的盯上了,400億也不算多。


技術細節的部分樓上的各位已經答得差不多了,我只想說,樓主請對自己未知的領域保持一些敬畏,不要下意識的就認為是個簡單的東西。


首先你要有硬體支持你
VMware workstations是全模擬虛擬化
VMware vsphere是硬體輔助虛擬化 CPU並不模擬 依靠intel自己的VT功能來實現


推薦閱讀:

3000~4000筆記本,聯想thinkpad e系列好還是戴爾靈越系列,三星的怎麼樣?其他牌子呢?
如何評價Dell XPS15 9560(2017年款)?
如何評價dell最新precision移動工作站5510, 7510, 7710?
有沒有可能存在故意不通過圖靈測試的 AI?
有什麼好用的免費的解壓軟體?

TAG:計算機 | 虛擬機 | VMware威睿 | 計算機科學 |