虛擬個人電腦之建構

Eric Traut/朱怡霖譯

  1. 前言

  2.          為了讓麥金塔 (Macintosh) 電腦使用者,也能使用專為X86開發的作業系統及各種軟体,美國Connectix公司大約在兩年前,也就是199510月左右,開始進行虛擬個人電腦 (Virtual PC) 的研發,期能發展一套能在麥金塔電腦上模擬X86個人電腦及其週邊設備的軟體。這個研發計劃的目標是希望能利用軟體的方式,建立一個和X86個人電腦百分之百相容的環境。這個計劃的內容係以開發Pentium指令集模擬器為主,同時也包含全部的MMX指令。一部虛擬個人電腦之研發除了要進行軟體的逆向工程 (reverse engineering) 外,還需進行個人電腦主機板上各種裝置模擬程式之研發,如時下流行的SVGA顯示加速卡、以太網路卡、Sound Blaster Pro音效卡、IDE/ATAPI控制卡及PCI橋接器界面等週邊設備。 這個硬體設備模擬策略,使得麥金塔的使用者不但能執行Windows軟體及DOS的遊戲程式,同時也能安裝各種專為X86開發的作業系統,包括Windows 95,Windows NTNextOpen Step

     

  3. Pentium 處理機之模擬

  4.         虛擬個人電腦的核心是一個Pentium程式碼再編譯模擬器 (recompiling emulator) 它是一個以 Power PC組合語言所開發的軟體,主要作用是將Pentium一系列指令轉換為具備相同功能,且最佳化Power PC指令。指令轉換是以基本區段(basic block)為一個單元來進行,所謂基本區段是經過解碼的一連串X86指令,且以會造成程式執行流程突然改變的指令(如典型的jump call或是從副程式返回合(return)的指令)做結束。當再編譯器進行X86指令解碼的同時,它會分析上述這些[條件式程式碼] 在程式中出現的地方建立基本區段。最後,再編譯器將針對基本區段產生相同功能的Power PC程式 詳細過程如圖一所示, 說明如下:

    Dd.jpg (23610 bytes)

                 圖一 虛擬個人電腦操作流程圖

     

                    (1)指令分派器從Pentium的指令指標暫存器(IP ,instruction pointer)讀取區碼的位址。

                    (2)指令分派器查詢程式區碼對照表,並檢查這一基本區段碼X86所對映的Power PC程式碼是否存在。

                    (3)假如區碼對照表中包含該程式碼,指令分派器將立即執行位於轉換碼快取區中的Power PC程式。

                    (4)假如區碼對照表中沒有該程式碼,指令分派器會呼叫編譯器開始執行。

                    (5)編譯器開始讀取X86指令,直到基本區碼的最後一個結束指令。

                    (6)編譯器將轉換後的程式碼放置到轉換碼快取區中。

                    (7)編譯器將PentiumIP暫存器內容及快取區中的程式碼位址,儲存到程式區碼對照表中。

                    (8)若程式碼中包含I/O指令,則模擬該ASIC裝置(依據I/O埠位址判斷)的模組將會被執行。

                    (9)該模組中的程序若不是傳回執行值,就是再次呼叫Mac做業系統驅動程式中的相關程序。

    Pentium模擬器運用下面技巧,俾提高程式執行速度:

    (1)轉換碼快取區(Translation cache)

             雖然模擬器是完全利用Power PC組合語言開發的,但在將Pentium程式轉換成最佳化的Power PC程式指令時,仍然需要花費大量的時間。為了有效減少轉換所花費的時間,模擬器會將轉換完成的基本區碼存放在轉換碼快取區中。

    (2)誇指令最佳化(Interinstruction optimization)

            由於Pentium處理機是複雜指令集電腦(CISC)架構,因此大部份的指令都會執行一個以上的運算動作。如加法ADD指令不單只是進行兩個變數的加法運算,它同時還會改變一些條件式旗標暫存器的內含值,以利程式判斷這個加法運算值是否為零或者結果為負值,因此利用旗標暫存器將可決定程式是否要執行特定的條件式跳躍動作。再編譯模擬器會分析基本區碼中的X86指令,並且判斷程式所運用到的旗標暫存器產生相對應的Power PC程式控制碼。在圖二程式碼轉換圖中的前面兩段程式,顯示了為何單一的Pentium指令會轉換成三個Power PC指令,而相同的三個Pentium指令卻能從原本應有的九個指令最佳化成五個Power PC指令。

    (3)記憶體位址轉換(Address translation)

             Pentium處理機最難模擬的部份係屬處理機內建的記憶體管理單元(MMUMemory Management Unit)。這個硬體元件所負責的功能是將記憶體的線性(邏輯)位址轉換為實際的位址。作業系統通常利用此記憶體管理功能,達成虛擬記憶體(Virtual memory)及主記憶體的保護功能。由於Pentium處理機的暫存器容量比較小,因此大約四個存取記憶體的Pentium指令中有三個會存取到相同的記憶體位址。程式中存取到的每一記憶體位址,本質上都必需經由模擬器做記憶體位址的轉換,才能從該位址中讀取或寫入資料。如果利用軟體來模擬MMU的功能,對系統將會有非常不良的影響,同時程式執行效能也會大打折扣。很幸運的這個不良的影響可以免除,Connectix的工程師利用程式控制Power PCMMU,使它能夠仿效PentiumMMU功能,如此就能利用硬體設備來管理記憶體的轉換功能。同時Pentium的記憶體分頁(memory page)特色也能應用Power PCMMU來達成。舉例來說,假如虛擬個人電腦所模擬的作業系統,將某個記憶體分頁標記為寫入保護,那麼系統的分頁對應表將被修改,而所對應的Power PC記憶體分頁,也將具有寫入保護的特性。

                            圖二 轉換程式碼

         ▼單一Pentium 指令的轉換

         Pentium指令                                         Power PC指令

         ADD                EAX,20                          li              rTemp1,20

                                                                        Addco      PF,rTemp1,rEAX

                                                                        mr            rEAX,rPF

         Pentium 指令區碼(Instruction Block)的轉換

         Pentium指令                                          Power PC指令

         ADD               EAX,20                           add           rEAX,rEAX,20

         ADD               EBX,30                           add           rEAX,rEBX,30

         ADD               ECX,40                           li               rTemp1,40

                                                                       Addco        rPF,rTemp1,rECX

                                                                        mr             rECX,rPF

        Pentium I/O指令碼的轉換

        Pentium指令                                        Power PC指令

        MOV               AL,8                              li                rAL,8

        MOV               DX,0x1F0                      li               rDX,0x1f0

        OUT                DX,AL                            bl              HandlelDEPortWrite

        ADD                DA,7                               addi           rDX,RDX,7

         IN                  AL,DX                            bl               HandlelDEPortRrad

         RET                                                    addi           rlp,rlp,8

                                                                      b                Dispatch ToNextBlock

    (4)記憶體節區範圍檢查(Segment bounds checking)

             Pentium處理機的架構中包含著落伍的記憶體節區概念,每一次記憶體的存取,如指令的讀取、堆疊的運作、資料的載入及資料的回存,都必須包含相關連的記憶體節區位址。當記憶體存取超出該節區所屬的範圍時,PentiumMMU就會產生一般性的保護程式錯誤(GPFGeneral Protection Fault)訊號。作業系統不止是利用GPF訊號來偵出應用程式所隱含的臭蟲。它還能讓程式切換到具特殊權利的驅動程式層級,以執行某些應用程式所不能執行的程式碼。因此Pentium 模擬器必需能適切的偵查出記憶體節區範圍的錯誤。雖說Power PC 沒有類似Pentium記憶體節區的硬體角色,但Connectix工程師利用Power PC trap 指令所開發的節區範圍檢測功能,和Pentium比起來也不遜色,甚至不會有多餘的負擔。

     

  5. 硬體設備之模擬

  6.   除了Pentium處理機之外,典型的PC主機板上還包含了許多系統晶片和處理機共同地運作。為了相容性的考量,程式必須正確的模擬這些晶片的運作。Intel 架構提供I/O位址空間的存取方式,以讓程式控制CPU以外的硬體設備。程式設計師可以利用INOUT指令來控制I/O位址空間。利用這兩個指令時,程式必須明白的指定所應用的I/O輸出埠(位址)。虛擬個人電腦會將存取到I/O 位址的指令,轉換為呼叫模擬該系統晶片的程式模組。例如,當虛擬個人電腦遇到存取輸出埠0x21IN指令時,它會呼叫中段控制器模擬模組中,負責傳回目前中斷遮罩(interrupt mask)的服務程式。如在程式碼轉換圖中的第三段程式所示,每一個I/O位址的存取都將轉換為呼叫相對應的程式模組。

      在PC主機板上有許多額外的晶片,負責控制系統的輸出及輸入裝置,如硬碟、CD-ROM光諜機、鍵盤及滑鼠。為了具備Mac作葉系統及所有麥金塔硬體的相容性,虛擬個人電腦乃是經由Mac作業系統的驅動程式來進行所有輸入與輸出的運作。當某個軟體需要經由PCIDE硬碟控制卡從硬碟讀取某個磁區的資料時,這個動作將被轉換為經由Mac作業系統的SCSI驅動程式讀取硬碟的資料。

      PC中最難被模擬的硬體元件,包括精準的時間訊號產生器。舉例來說說,聲音是一種即時性的動作,任何一點時間的紊亂,都會導致應答聲或經由數位取樣的流行音樂無法按時到達。由於虛擬個人電腦是架構在Mac作業系統上,而且必須同時模擬為數眾多的PC系統晶片,因此程式不太可能一直提供精準的時間訊號。為了彌補這個缺失,虛擬個人電腦在設計上將和使用者有互動關係的程式,如聲音及影像程式,設定為具有最高優先權的執行次序。

  7. 執行效能

  8.   無疑地模擬系統的執行速度,將會比真正的硬體設備慢。因此Connectix 公司的設計工程師特別注重執行效率的調整,對於模擬流行的PC遊戲軟體及能提高生產力的軟體程式所需的硬體設備,都要求達到可接受的執行效率。這對於需要同時模擬Pentium處理機及PC主機板上所有晶片的Power PC處理機而言,更具備挑戰性。

            執行虛擬個人電腦的硬體系統,對於它的執行效能會有十分顯著的影響,因此若能使用最新一代具備高速時鐘頻率的計時器,以及內含大量快取記憶體的Power PC 處理機,其執行效率會比較好。在進行指令轉換時,將會產生大量程式碼,因此系統L2快取記憶體的速度及容量大小,對於執行效率的改善也有很深的影響。

            一般模擬器可能可能會因執行效率較慢,而讓使用者受到打擊。然而本計劃虛擬個人電腦之研發,的確很成功地從十分低階的角度完全模擬整部PC的運作,所有的模擬程式讓使用者都無法查覺,它不是在真正的PC 硬體上執行。   

     

  9. 參考資料

      本文譯自1997年11月Eric Traut所發表的 Building the Virtual PC 文章,Eric Traut (traut@connectix.com) 是Connectix公司虛擬個人電腦發展小組的首席工程師。在Apple電腦甚行的時期,他曾開發過模擬各種Power PC上 Mac作業系統的680x0動態程式碼再編譯模擬器。