前情提要。處理器由內到外,無論是記憶體虛擬化,外部的I/O虛擬化、中斷處理虛擬化、外部I/O裝置虛擬化甚至GPU虛擬化,其重點只有1條:透過硬體輔助,直接分配硬體資源給不同的虛擬機,避免VMM要跑一堆所謂的「Shadow XXX」模擬層,請各位科科不要被一堆技術行銷名詞淹沒了。
記憶體虛擬化:標籤式TLB、第二層分頁表、隔離記憶體位址
x86的記憶體虛擬化技術大致上是在2007年到2008年問世,也就是AMD的原生四核「Barcelona」和Intel的「Nehalem」時期,重心在於加速「虛擬位址到實體位址間的對映」。
近代高效能處理器為了加速從虛擬到實體之間的記憶體位址轉換,都會設置TLB(Translation Lookaside Buffer,轉譯後備緩衝區)這個小型快取記憶體,對存取巨量記憶體資料的效能表現有舉足輕重的影響,在沒有硬體支援的情況,VMM一切換虛擬機,就會讓TLB的資料「洗牌」,反覆清除與載入TLB的內容,重挫整體的記憶體效能。
所以「標籤式(Tagged)TLB」隨之而生,TLB每個欄位會紀錄虛擬機編號(Intel叫做APID,AMD稱為ASID),方便VMM進行資源分配及管理,例如讓某些經常執行的虛擬機保留更多的TLB空間等等,反之亦同。但標籤式TLB與VPID大幅增加了TLB的複雜度,結果AMD Barcelona就跑出TLB大臭蟲,Intel Nehalem據傳也因TLB設計出毛病而延後上市時程,只能說天底下沒有白吃的午餐,只有吃不到午餐的白痴(如筆者)。
在硬體輔助的虛擬化技術之前,管理多組用戶端作業系統的記憶體位址,VMM得耗費大量的處理器時脈週期去維護「影子分頁表(Shadow Page Table,SPT)」,計算不同作業系統的實際記憶體位址,AMD就曾表示「比例高達75%」,越頻繁切換作業系統,越會降低效能。
當然分頁表亦可如法炮制,Intel EPT(Extended Page Table)/AMD RVI(Rapid Virtualization Indexing)提供第二層硬體分頁表,紀錄每個虛擬機器的實際記憶體位址,可避免軟體模擬手段浪費處理器效能。講的精確一點,兩者都是「用來標定分頁表目錄的CR3(Control Register 3)快取」,看得懂這句話的意思就是非常厲害的科科了。
結合標籤式TLB和雙層分頁表,「虛擬位址到實體位址間的對映」就如同原生作業系統般的通通讓硬體搞定。
多個作業系統共用一塊記憶體,勢必得避免相互「侵犯」不應該使用的記憶體位址,AMD的DEV(Device Exclusion Vector)讓記憶體控制器隔離作業系統所使用的記憶體,更可提昇安全性。Intel當然也有類似的技術,但似乎沒特別大書特書就是了。
但記憶體虛擬化並非終點,在處理器之外還有更多難搞的項目,有待各位科科去探險。科科。