QEMU原始碼分析系列 一)

2021-05-28 06:34:38 字數 1606 閱讀 6234

1 qemu概述

qemu是一種快速的多體系結構**器,通過動態翻譯的技術達到了優異的**速度。目前,qemu支援兩種操作模式:

對於全系統**模式,qemu目前可以支援的硬體列表如下:

對於使用者態**模式,qemu支援的硬體列表如下:x86 (32 and 64 bit), powerpc (32 and 64 bit), arm, mips (32 bit only), sparc (32 and 64 bit), alpha, coldfire(m68k), crisv32 and microblaze cpus are supported.

1.1 qemu 的本質

眾所周知,bochs 是一款可移植的ia-32**器,它利用模擬的技術來**目標系統,具體來說,將是將目標系統的指令分解,然後模擬分解後的指令以達到同樣的效果。這種方法將每一條目標指令分解成多條主機系統的指令,很明顯會大大降低**的速度。

qemu則是採用動態翻譯的技術,先將目標**翻譯成一系列等價的被稱為「微操作」(micro-operations)的指令,然後再對這些指令進行拷貝,修改,連線,最後產生一塊本地**。這些微操作排列複雜,從簡單的暫存器轉換模擬到整數/浮點數學函式模擬再到load/store操作模擬,其中load/store操作的模擬需要目標作業系統分頁機制的支援。

qemu對客戶**的翻譯是按塊進行的,並且翻譯後的**被快取起來以便將來重用。在沒有中斷的情況下,翻譯後的**僅僅是被鏈結到乙個全域性的鍊錶上,目的是保證整個控制流保持在目標**中,當非同步的中斷產生時,中斷處理函式就會遍歷串連翻譯後**的全域性鍊錶來在主機上執行翻譯後的**,這就保證了控制流從目標**跳轉到qemu**。簡單概括下:指定某個中斷來控制翻譯**的執行,即每當產生這個中斷時才會去執行翻譯後的**,沒有中斷時僅僅只是個翻譯過程而已。這樣做的好處就是,**是是按塊翻譯,按塊執行的,不像bochs翻譯一條指令,馬上就執行一條指令。

1.2 qemu能夠模擬的硬體

bochs和qemu從非常低的層次對硬體進行模擬,對於像匯流排和外圍裝置如顯示卡,網絡卡,磁碟控制器等都有相對應的軟體的表示,但是二者僅對有限的硬體集合進行精確的模擬,比如對中斷控制器,匯流排驅動,磁碟驅動,鍵盤,滑鼠,顯示卡以及網絡卡的模擬。隨著時間的推移,可模擬的硬體集合將會擴充套件到客戶作業系統能夠支援的盡可能多的裝置。qemu和bochs都利用執行在模擬機中的bioses來初始化硬體的某些部分,這種設計思想使得對裝置的**忠於原始的硬體。

除了模擬之外,裝置驅動利用主機的功能來提供模擬和使用者要求的功能,下面來看幾個例子:

1.3 可移植性

qemu採用了模組化的設計思想,**器中與目標平台相關的部分被分離到它們自己的檔案和目錄中。對於核心部分,驅動部分和動態翻譯器來說,所有目標平台都宣告相同的介面,在整個qemu的111,000行**中,目標平台相關的元件**大約佔了1/3,特別地,x86目標平台的大約不超過8000行。與bochs不同的是,qemu對目標平台的描述非常的緊湊,因此,可以模擬大量的目標平台。

qemu要求公開有關編譯執行的資訊以便動態翻譯器使用,幸運地是,這些資訊中的絕大部分對於偵錯程式,動態聯結器和單獨編譯來說都是非常必要的。另外,qemu完全由c語言編寫,在主機和目標平台環境之間建立了乙個隔離層。值得一提的是動態翻譯器使用了帶gnu擴充套件的c編寫,這種結構化的可移植性,再加上gcc對大量系統的支援,使得qemu在主機系統之間的可移植性大大增加。

qemu原始碼分析系列 二

在qemu原始碼分析系列 一 簡單介紹了下qemu相關的背景知識,本文將詳細分析qemu的核心 動態翻譯器。為了更容易理解動態翻譯技術,我們暫時忽略掉qemu的其他模組,如使用者互動模組,硬體模擬等模組,而是從資料結構的設計,資料結構之間的操作及其應用等方面來進行詳細地分析,重點關注動態翻譯器和微操...

qemu原始碼分析系列 二

在qemu原始碼分析系列 一 簡單介紹了下qemu相關的背景知識,本文將詳細分析qemu的核心 動態翻譯器。為了更容易理解動態翻譯技術,我們暫時忽略掉qemu的其他模組,如使用者互動模組,硬體模擬等模組,而是從資料結構的設計,資料結構之間的操作及其應用等方面來進行詳細地分析,重點關注動態翻譯器和微操...

Redis原始碼分析系列

redis目前熱門nosql記憶體資料庫,量不是很大,本系列是本人閱讀redis原始碼時記錄的筆記,由於時間倉促和水平有限,文中難免會有錯誤之處,歡迎讀者指出,共同學習進步,本文使用的redis版本是2.8.19。redis之hash資料結構 redis之intset資料結構 redis之skipl...