虛擬化技術(shù)分析:動(dòng)態(tài)地址轉(zhuǎn)換
盡管虛擬化在主機(jī)上是很成熟的技術(shù),我們最近還是經(jīng)常聽(tīng)聞?dòng)嘘P(guān)該技術(shù)的討論。早在1967年,CP-67虛擬機(jī)管理程序就已經(jīng)支持虛擬機(jī)和虛擬化系統(tǒng)鏡像。在這個(gè)虛擬機(jī)管理程序下,整個(gè)磁盤(pán)可以被虛擬為多個(gè)小型磁盤(pán)。例如像讀卡器、打卡機(jī)和打印機(jī)等單元記錄設(shè)備,甚至無(wú)需實(shí)際物理設(shè)備存在就能被虛擬出來(lái)。從硬件的角度來(lái)看,此時(shí)的System/360 Model 67并沒(méi)有提供虛擬化設(shè)備的支持,是CP-67虛擬機(jī)管理程序自己提供了所需的虛擬化。然而CP-67并不能虛擬化主內(nèi)存,它還是需要Model 67的協(xié)助來(lái)完成。
System/360 Model 67可以借助CP-67創(chuàng)建的表,來(lái)實(shí)施動(dòng)態(tài)地址轉(zhuǎn)換(DAT)。通過(guò)這種方式,虛擬機(jī)中一個(gè)特定內(nèi)存塊可以被映射到實(shí)際內(nèi)存中的任意塊。實(shí)際內(nèi)存中非連續(xù)的內(nèi)存塊在虛擬機(jī)中可能就是連續(xù)的。更有趣的是,“虛擬內(nèi)存”中的塊有可能并不映射到實(shí)際內(nèi)存中。相反,它會(huì)被CP-67映射到磁盤(pán)上的數(shù)據(jù)塊,這個(gè)數(shù)據(jù)塊只有在被引用時(shí)才讀入真實(shí)的內(nèi)存數(shù)據(jù)。這樣的設(shè)計(jì)使得客戶操作系統(tǒng)認(rèn)為數(shù)據(jù)一直在內(nèi)存中。這便所謂的分頁(yè)技術(shù),同時(shí)也是虛擬化技術(shù)的基礎(chǔ)。今天的z/os系統(tǒng)正是利用這種機(jī)制隔離不同的應(yīng)用和程序。
轉(zhuǎn)譯后備緩沖區(qū)(TLB)提供了實(shí)用性
動(dòng)態(tài)地址轉(zhuǎn)換是一個(gè)偉大的想法,但如果每次訪問(wèn)內(nèi)存中指令或者操作數(shù)地址,都需要進(jìn)行地址轉(zhuǎn)換,那這個(gè)時(shí)間花費(fèi)是不可接受的。大多數(shù)大型機(jī)的指令涉及多個(gè)地址,如果沒(méi)有突破性的創(chuàng)新,動(dòng)態(tài)地址轉(zhuǎn)換反而會(huì)降低機(jī)器運(yùn)行效率。這時(shí)出現(xiàn)了讓動(dòng)態(tài)地址轉(zhuǎn)換依舊可用的創(chuàng)新,那就是轉(zhuǎn)譯后備緩沖區(qū)(TLB)。TLB是一種可以記錄并快速訪問(wèn)前一次轉(zhuǎn)譯結(jié)果的結(jié)構(gòu)。
在這里我們不會(huì)太深入講解TLB的工程設(shè)計(jì),但仍有幾點(diǎn)需要留意。TLB是一個(gè)二維數(shù)組,其內(nèi)容就是一系列的條目。如圖1-01所示,它是長(zhǎng)度為32個(gè)條目,寬度為4個(gè)條目的TLB。每個(gè)條目包含一個(gè)已被轉(zhuǎn)譯的虛擬地址和一個(gè)真實(shí)地址。使用索引和內(nèi)容可尋址存儲(chǔ)器,我們可以從TLB中獲得正確的先前轉(zhuǎn)譯。如果先前轉(zhuǎn)譯并沒(méi)有在TLB中,其它電子元件就會(huì)讀取內(nèi)存中的表并進(jìn)行轉(zhuǎn)換,然后將結(jié)果寫(xiě)入到TLB的相應(yīng)列中,以備后續(xù)使用。
使用大型的TLB是非常有用的,這樣就能最小化內(nèi)存中表的訪問(wèn)。然而不幸的是,大型電子電路的速度訪問(wèn)會(huì)非常緩慢,因?yàn)樾盘?hào)必須在更大的結(jié)構(gòu)中傳播更遠(yuǎn)的距離。此外,內(nèi)容尋址存儲(chǔ)器所需的電路數(shù)增長(zhǎng)是非線性的。所以TLB一般來(lái)說(shuō)都比較小。幸運(yùn)的是我們已經(jīng)有一些技術(shù)可以提升有效容量,因此無(wú)需使用很大的TLB。
圖1-01 一級(jí)TLB
***化TLB的容量
起初,單一的TLB可用于轉(zhuǎn)譯指令地址和操作數(shù)地址。但同時(shí)也有兩個(gè)地方需要轉(zhuǎn)譯,那就是指令提取邏輯和操作數(shù)訪問(wèn)邏輯。一個(gè)能有效增加容量的方法是使用兩套TLB,一個(gè)用于處理指令地址,另一個(gè)用于處理操作數(shù)地址。處理指令的TLB一般物理位置上臨近指令存取邏輯,處理數(shù)據(jù)的則被放置在操作數(shù)地址邏輯附近。即使這樣的設(shè)計(jì)需要額外邏輯來(lái)維護(hù)這兩個(gè)TLB的交互,但這個(gè)額外花銷是值得的,因?yàn)樗鼛?lái)了效率的提升。
另外可做的是增加TLB的層級(jí),這些額外增加的層級(jí)可以是大容量和低速度的設(shè)備,因?yàn)樗鼈儍H會(huì)在小型高速TLB未***時(shí)使用。這種添加層級(jí)的方法已被用于處理器高速緩存幾十年了。每個(gè)次級(jí)層次都容量更大,同時(shí)需要更多的周期來(lái)訪問(wèn)。為此IBM工程師用非線性的方式實(shí)現(xiàn)了二級(jí)轉(zhuǎn)譯后備緩沖區(qū)(TLB2)。在內(nèi)存中的DAT表并不再是線性表,而是更復(fù)雜的多層結(jié)構(gòu)(如圖2-01所示)。例如在雙層表中,***級(jí)表稱為段表,它包含內(nèi)存映射到二級(jí)表的入口;二級(jí)表稱為頁(yè)面表,它包含256個(gè)用于映射4K內(nèi)存的條目。
圖2-01 存儲(chǔ)中的DAT表結(jié)構(gòu)
現(xiàn)代的z系統(tǒng)處理器的TLB2有兩種類型的條目(如圖2-02所示),大小為1MB的段和大小為4K的頁(yè)。當(dāng)轉(zhuǎn)譯在***層TLB(TLB1)中找不到時(shí),TLB2就會(huì)搜索4KB頁(yè)條目所提供的轉(zhuǎn)譯。如果沒(méi)有找到,TLB2就會(huì)在段條目中搜索包含待轉(zhuǎn)譯的地址。如果這個(gè)條目被找到,就不會(huì)再使用內(nèi)存中表的轉(zhuǎn)譯,因?yàn)閷?duì)應(yīng)的頁(yè)表可以直接被訪問(wèn),而無(wú)需訪問(wèn)存儲(chǔ)器中的段表。因此如使用TLB2,額外的轉(zhuǎn)譯可以通過(guò)訪問(wèn)內(nèi)存中的表來(lái)實(shí)現(xiàn),至少減少了這些訪問(wèn)的次數(shù)。
圖2-02 二級(jí)TLB的結(jié)構(gòu)
增加TLB有效容量的另一種方法是支持更大的頁(yè)面,使得僅需要較少的條目就能覆蓋給定的虛擬地址。在z系統(tǒng)的處理器中,這個(gè)特性得到了支持。首先在Z10的處理器上,TLB1會(huì)繼續(xù)支持4KB的條目,但TLB2可以容納1MB的頁(yè)條目。這些1MB的頁(yè)條目可以無(wú)需訪問(wèn)內(nèi)存中的表來(lái)創(chuàng)建TLB1所需的4KB條目。在z196處理器中,TLB1已經(jīng)可以支持1MB的頁(yè)條目。在這個(gè)處理器中,添加了特殊的數(shù)據(jù)TLB1用于1MB頁(yè)條目的處理,同時(shí)指令TLB1也被增強(qiáng)用于支持4KB和1MB兩個(gè)頁(yè)條目。在zEC12還引入了2GB頁(yè)條目的支持。在這種結(jié)構(gòu)下,有一個(gè)小型的數(shù)據(jù)TLB1持有一些2GB的頁(yè)條目,而一些非常大的頁(yè)條目被用作DB2緩沖區(qū)域和JAVA堆的有效映射。
虛擬化的創(chuàng)新還在繼續(xù)
本文的簡(jiǎn)介并沒(méi)有談到z/VM虛擬機(jī)支持客戶機(jī)的虛擬內(nèi)存。為了實(shí)現(xiàn)這種功能,z系統(tǒng)的處理器支持兩層的轉(zhuǎn)譯。首先,客戶機(jī)的虛擬地址被轉(zhuǎn)譯成客戶機(jī)的實(shí)際地址。但是客戶機(jī)的真實(shí)地址是主機(jī)端的虛擬地址,它需要轉(zhuǎn)譯成主機(jī)的真實(shí)地址。在這里我們不會(huì)就本話題做進(jìn)一步探討,僅僅有一點(diǎn)提醒大家注意,那便是兩層轉(zhuǎn)譯涉及到許多表的訪問(wèn),因?yàn)榭蛻舯淼霓D(zhuǎn)譯還涉及到額外的主機(jī)轉(zhuǎn)譯。還有許多更復(fù)雜的操作在z系統(tǒng)硬件上實(shí)現(xiàn),這種實(shí)現(xiàn)使得對(duì)上層操作是透明的。