SOGO論壇
  登入   註冊   找回密碼
查看: 769|回覆: 0
列印 上一主題 下一主題

[技術文章] 跨平台虛擬機 [複製連結]

Rank: 11Rank: 11Rank: 11Rank: 11

熱心參予論壇活動及用心回覆主題勳章 數位硬體勳章

狀態︰ 離線
跳轉到指定樓層
1
發表於 2012-7-13 09:40:34 |只看該作者 |倒序瀏覽
設計原理

QEMU 是一種相當快速的虛擬機,比起使用 bytecode 解譯的方式要快上許多,這是怎麼做到的呢?

QEMU 的設計原理乃是將目的檔中的機器碼反組譯成 C 語言指令,然後再利用 gcc 將這個 C 語言程式編譯為機器語言,然後直接在目標平台上執行,因此不需要撰寫目的檔的解譯程式,這是一種設計虛擬機的獨特技巧,請參考下列文章。

    http://usenix.com/events/usenix0 ... bellard/bellard.pdf

但是,即使讀完了這篇文章,我仍然無法完全理解其中的設計原理,如何將機器碼反組譯成 C 語言呢?有一天,當我被問到這個問題,重新仔細思考之後,似乎一切都豁然開朗了。

假如我們用 CPU0 的指令為例,如果有一個 CPU0 組合語言如下所示。

    LD    R1, [300]
    LDI    R2, 100
    CMP    R1, 0
    JEQ    END
    ADD    R3, R1, R2
    ST    R3, [200]
END :     RET

那麼,我們可以將其反向轉譯為如下的 C 語言程式。

    R1 = K300;
    R2 = 100;
    if (R1 == 0)
      goto END;
    R3 = R1 + R2;
    R3 = K200;
END :     return

R1:    RESW 1
R2:    RESW 1
K200:     RESW 1
K300:     RESW 1

如此,編譯後的 C 語言的程式,其行為就會和 CPU0 程式的行為一致,如此就完成了整個虛擬機器的設計,而且不需要使用解譯的方式,而是使用編譯的方式完成了虛擬機器的設計,這種模式會比解譯的方式快上許多。

在這種架構下,所有的暫存器存取都會被翻譯成記憶體的存取,這樣雖然會讓編譯後的存取速度較為緩慢一些,但是由於編譯器本身又會安排目標機器的暫存器的使用方式,因此又會再度增快速度。

這種方式真是一種相當聰明且簡單的設計方式啊!
喜歡嗎?分享這篇文章給親朋好友︰
               感謝作者     

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-6-9 03:45

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部