版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
QEMU軟件架構(gòu)分析6QEMU概述QEMU三種運(yùn)行模式QEMU軟件架構(gòu)QEMU內(nèi)存模型QEMU的PCI總線與設(shè)備第6章QEMU軟件架構(gòu)分析6.1QEMU概述QEMU是一個(gè)開源的模擬器項(xiàng)目,能夠模擬整個(gè)系統(tǒng)的硬件,在GNU/Linux平臺(tái)上使用廣泛,并不像VMware那樣僅僅針對(duì)x86體系架構(gòu)。QEMU可以運(yùn)行于多種操作系統(tǒng)和不同的CPU體系架構(gòu)中,允許在虛擬機(jī)運(yùn)行時(shí)保存虛擬機(jī)的狀態(tài),進(jìn)行實(shí)時(shí)遷移與操作系統(tǒng)級(jí)別的調(diào)試。QEMU的安裝包中提供了qemu-img這個(gè)強(qiáng)大的工具來創(chuàng)建、轉(zhuǎn)換或者加密虛擬機(jī)映像,且支持從其他虛擬機(jī)格式中啟動(dòng)。qemu-nbd能夠?qū)EMU的映像文件通過NDB協(xié)議共享給其他機(jī)器。
6.1.1QEMU實(shí)現(xiàn)原理QEMU采用動(dòng)態(tài)翻譯的技術(shù),先將目標(biāo)代碼翻譯成一系列等價(jià)的被稱為“微操作”(Micro-Operations)的指令,然后再對(duì)這些指令進(jìn)行拷貝、修改、鏈接,最后產(chǎn)生一塊本地代碼。這些微操作排列復(fù)雜,從簡(jiǎn)單的寄存器轉(zhuǎn)換模擬到整數(shù)/浮點(diǎn)數(shù)學(xué)函數(shù)模擬再到load/store操作模擬,其中l(wèi)oad/store操作的模擬需要目標(biāo)操作系統(tǒng)分頁機(jī)制的支持。當(dāng)異步的中斷產(chǎn)生時(shí),中斷處理函數(shù)就會(huì)遍歷翻譯后的代碼所處的全局鏈表來在主機(jī)上執(zhí)行翻譯后的代碼,這就保證了控制流從目標(biāo)代碼跳轉(zhuǎn)到QEMU代碼。第6章QEMU軟件架構(gòu)分析6.1.2QEMU支持模擬的硬件QEMU從非常低的層次對(duì)硬件進(jìn)行模擬,對(duì)于像總線和外圍設(shè)備如顯卡、網(wǎng)卡、磁盤控制器等都有相對(duì)應(yīng)的軟件表示,但是僅對(duì)有限的硬件集合進(jìn)行精確的模擬,比如對(duì)中斷控制器,總線驅(qū)動(dòng),磁盤驅(qū)動(dòng),鍵盤,鼠標(biāo),顯卡以及網(wǎng)卡的模擬。隨著時(shí)間的推移,可模擬的硬件集合將會(huì)擴(kuò)展到客戶操作系統(tǒng)所能夠支持的盡可能多的設(shè)備。QEMU利用運(yùn)行在模擬機(jī)中的BIOS來初始化硬件的某些部分,這種設(shè)計(jì)思想使得對(duì)設(shè)備的仿真忠于原始的硬件。第6章QEMU軟件架構(gòu)分析除了模擬之外,設(shè)備驅(qū)動(dòng)也可利用主機(jī)的功能來提供模擬和達(dá)到用戶要求,舉例如下:(1)幀緩沖區(qū)通過用戶可選擇的接口被暴露出來,對(duì)于QEMU來說,幀緩沖有SDLwindow,VNCServer和無圖形界面的輸出三個(gè)可供選擇的選項(xiàng)。(2)?QEMU中的網(wǎng)絡(luò)可以是被禁止的,可以是被橋接到主機(jī)的,可以是使用虛擬以太網(wǎng)協(xié)議創(chuàng)建的Unix套接字,還可以是QEMU完全模擬出來的。第6章QEMU軟件架構(gòu)分析圖6-1QEMU支持x86架構(gòu)下的硬件設(shè)備
支持的設(shè)備Qemu的執(zhí)行參數(shù)單個(gè)或多個(gè)使用?-smp參數(shù)設(shè)置硬盤和光驅(qū)設(shè)備使用?-hda和?-cdrom參數(shù)模擬軟盤使用?-fda參數(shù)模擬內(nèi)存使用?-m參數(shù)模擬指定容量的多種顯卡和聲卡使用?-vga和?-soundhw參數(shù)多種設(shè)備使用?-parallel參數(shù)多種設(shè)備使用?-serial參數(shù)多種設(shè)備使用?-usb和?-usbdevice參數(shù)使用?-soundhwpcspk參數(shù)設(shè)備使用?-bt參數(shù)多種使用?-netnic,
model=參數(shù)內(nèi)建服務(wù)器使用?-netuser參數(shù)內(nèi)建服務(wù)器使用?-netuser參數(shù)內(nèi)建服務(wù)器使用?-netuser,
smb=參數(shù)內(nèi)建服務(wù)器使用?-netuser,
tftp=參數(shù)第6章QEMU軟件架構(gòu)分析6.1.3QEMU特性QEMU是一種快速的多體系結(jié)構(gòu)仿真器,通過動(dòng)態(tài)翻譯的技術(shù)達(dá)到了優(yōu)異的仿真速度。目前,QEMU支持兩種操作模式:(1)全系統(tǒng)仿真模式。在這種模式下,QEMU完整地仿真目標(biāo)平臺(tái),此時(shí),QEMU就相當(dāng)于一臺(tái)完整的PC機(jī),包括了一個(gè)或多個(gè)處理器以及各種外圍設(shè)備。這種模式可以用來運(yùn)行不同的操作系統(tǒng)或調(diào)試操作系統(tǒng)的代碼。(2)用戶態(tài)仿真模式。在這種模式下,QEMU能夠運(yùn)行不同于主機(jī)平臺(tái)的其他平臺(tái)的程序。另外,在這種模式下能夠進(jìn)行方便的交叉編譯和調(diào)試。第6章QEMU軟件架構(gòu)分析對(duì)于全系統(tǒng)仿真模式,QEMU目前可以支持的硬件列表有:①x86orx86_64體系結(jié)構(gòu)處理器。②ISAPC(沒有PCI總線的PC)。③PowerPC處理器。④32/64?bit的SPARC處理器。⑤32/64?bit的MIPS處理器。⑥ARM體系結(jié)構(gòu)的處理器。⑦PXA270、PXA255。⑧OMAP310、OMAP2420、OMAP310。第6章QEMU軟件架構(gòu)分析QEMU不需要宿主機(jī)內(nèi)核驅(qū)動(dòng)就可以運(yùn)行,所以它非常安全并且易于使用。QEMU的通用特性有:①用戶態(tài)空間或者全系統(tǒng)模擬。②在合理的時(shí)間內(nèi)動(dòng)態(tài)翻譯成本地代碼。③可以在x86、x86_64和PowerPC32/64等架構(gòu)的宿主機(jī)上運(yùn)行。之前的版本還可以支持Alpha和S390架構(gòu)的宿主機(jī),只是TCG還不支持。④支持代碼的自動(dòng)修改。⑤支持精確的異常提示。⑥支持浮點(diǎn)數(shù)運(yùn)算庫(完全軟件模擬和本地宿主機(jī)FPU指令)。第6章QEMU軟件架構(gòu)分析QEMU全系統(tǒng)仿真特性有:①為了保證最大的可移植性,QEMU使用了一個(gè)全軟件的MMU。②QEMU可以選擇性地使用一個(gè)內(nèi)核級(jí)的加速器,比如KVM。加速器本地執(zhí)行一些客戶機(jī)代碼,同時(shí)繼續(xù)仿真機(jī)器中的其他部分。③可以仿真不同的硬件設(shè)備,在一些情況下,宿主機(jī)的設(shè)備(比如串口、并口、USB設(shè)備等)能夠被客戶機(jī)操作系統(tǒng)所使用。宿主機(jī)設(shè)備可以被用來和外部外圍設(shè)備進(jìn)行通信。第6章QEMU軟件架構(gòu)分析QEMU用戶態(tài)仿真的特性有:①通用Linux系統(tǒng)調(diào)用轉(zhuǎn)換,包括大部分的ioctls系統(tǒng)函數(shù)。②函數(shù)clone()仿真使用本地CPU克隆函數(shù)來調(diào)用Linux的線程調(diào)度。③通過宿主信號(hào)到目標(biāo)信號(hào)的重映射從而保證信號(hào)的精確處理。第6章QEMU軟件架構(gòu)分析6.2QEMU三種運(yùn)行模式QEMU作為一個(gè)開源的硬件模擬器項(xiàng)目,除了支持x86體系架構(gòu)之外,還支持ARM、MIPS、PowerPC、IA64等多種CPU硬件架構(gòu),由于QEMU采用模塊化的設(shè)計(jì)方法,因此可以很方便地支持各種外設(shè)硬件,同時(shí)底層可以集成不同的虛擬化加速模塊提升硬件模擬的性能。對(duì)于QEMU來說,除了支持KVM之外,還支持全虛擬機(jī)和kqemu加速模塊等方式,針對(duì)這三種方式的軟件架構(gòu)如圖6-1所示。第6章QEMU軟件架構(gòu)分析圖6-1QEMU的三種模式架構(gòu)第6章QEMU軟件架構(gòu)分析第一種模式是通過kqemu加速模塊來實(shí)現(xiàn)內(nèi)核態(tài)的加速,在系統(tǒng)內(nèi)核中打入kqemu的相關(guān)模塊,而在用戶態(tài)的QEMU就可以通過訪問?/dev/kqemu設(shè)備文件來實(shí)現(xiàn)設(shè)備模擬的加速,這種情況主要適用于虛擬機(jī)和宿主機(jī)都運(yùn)行于同一架構(gòu)的情況下進(jìn)行虛擬化。第三種模式利用Linux內(nèi)核中集成的KVM加速模塊。KVM加速模塊通過?/dev/kvm字符設(shè)備文件向用戶態(tài)程序提供操作接口,其實(shí)現(xiàn)的核心是libkvm庫,將?/dev/kvm的ioctl類型的API轉(zhuǎn)化成傳統(tǒng)意義上的函數(shù)API調(diào)用,最終提供給QEMU的適配層,由QEMU來完成整個(gè)虛擬化的工作。第6章QEMU軟件架構(gòu)分析第二種模式是在不借用任何底層加速模塊的情況下直接在用戶態(tài)運(yùn)行QEMU,由QEMU對(duì)目標(biāo)虛擬機(jī)中的所有指令進(jìn)行翻譯后執(zhí)行,相當(dāng)于全虛擬化。在這種模式下,QEMU虛擬的CPU硬件設(shè)備是不受限制的,所以可以運(yùn)行不同形態(tài)的體系結(jié)構(gòu),比如Android應(yīng)用開發(fā)環(huán)境中就是采用QEMU來模擬ARM架構(gòu)下的操作系統(tǒng)。這種模式的缺點(diǎn)是每一條目標(biāo)機(jī)的執(zhí)行指令都需要翻譯成宿主機(jī)指令,這樣會(huì)耗費(fèi)少則數(shù)個(gè),多則成千上萬個(gè)宿主機(jī)的指令周期來模擬實(shí)現(xiàn),所以虛擬性能不是很理想。第6章QEMU軟件架構(gòu)分析6.3QEMU軟件架構(gòu)6.3.1QEMU源碼架構(gòu)1、代碼結(jié)構(gòu)QEMU是一個(gè)模擬器,它能夠動(dòng)態(tài)模擬特定架構(gòu)的CPU指令,如x86、PowerPC、ARM等等。QEMU模擬的架構(gòu)叫客戶機(jī)架構(gòu),運(yùn)行QEMU的系統(tǒng)架構(gòu)叫宿主機(jī)架構(gòu),QEMU中有一個(gè)模塊叫做微型代碼生成器(TCG),它用來將客戶機(jī)代碼翻譯成宿主機(jī)代碼,如圖6-2所示。第6章QEMU軟件架構(gòu)分析圖6-2QEMU指令動(dòng)態(tài)翻譯過程圖第6章QEMU軟件架構(gòu)分析開始執(zhí)行:主要比較重要的c文件有:vl.c、cpus.c、exec-all.c、exec.c和cpu-exec.c。硬件模擬:所有的硬件設(shè)備都在?/hw/?目錄下面,所有的設(shè)備都有獨(dú)自的文件,包括總線、串口、網(wǎng)卡、鼠標(biāo),等等。它們通過設(shè)備模塊串在一起,在vl.c中的machine_init中初始化。目標(biāo)機(jī)器:現(xiàn)在QEMU模擬的CPU架構(gòu)有Alpha、ARM、Cris、i386、M68K、PPC、Sparc、Mips、MicroBlaze、S390X和SH4。第6章QEMU軟件架構(gòu)分析2、TCG動(dòng)態(tài)翻譯QEMU在0.9.1版本之前使用DynGen翻譯C代碼,當(dāng)我們需要的時(shí)候TCG會(huì)動(dòng)態(tài)的轉(zhuǎn)變代碼,其目的是用更多的時(shí)間去執(zhí)行生成的代碼。當(dāng)新的代碼從TB中生成以后,將會(huì)被保存到一個(gè)CACHE中,因?yàn)楹芏嘞嗤腡B會(huì)被反復(fù)的進(jìn)行操作,所以這樣類似于內(nèi)存的CACHE,能夠提高使用效率。而CACHE的刷新使用LRU(LeastRecentlyUsed)算法,代碼轉(zhuǎn)換過程如圖6-3所示。第6章QEMU軟件架構(gòu)分析圖6-3TCG代碼轉(zhuǎn)換過程圖第6章QEMU軟件架構(gòu)分析函數(shù)的后端會(huì)恢復(fù)前端的狀態(tài),主要執(zhí)行以下兩個(gè)過程:(1)恢復(fù)堆棧的指針,包括棧頂和基地址。(2)修改cs(代碼段寄存器)和ip(指令指針寄存器),程序回到之前的前端記錄點(diǎn)。TCG就如編譯器一樣可以產(chǎn)生目標(biāo)代碼,代碼會(huì)保存在緩沖區(qū)中,當(dāng)進(jìn)入前端和后端的時(shí)候就會(huì)將TCG生成的緩沖代碼插入到目標(biāo)代碼中,接下來分析代碼動(dòng)態(tài)翻譯的過程。動(dòng)態(tài)翻譯的基本思想就是把每一條Target指令切分成為若干條微操作,每條微操作由一段簡(jiǎn)單的C代碼來實(shí)現(xiàn),運(yùn)行時(shí)通過一個(gè)動(dòng)態(tài)代碼生成器把這些微操作組合成一個(gè)函數(shù),最后執(zhí)行這個(gè)函數(shù),就相當(dāng)于執(zhí)行了一條Target指令。第6章QEMU軟件架構(gòu)分析3、TB鏈在QEMU中,從代碼CACHE到靜態(tài)代碼再回到代碼CACHE,這個(gè)過程比較耗時(shí),所以在QEMU中涉及了一個(gè)TB鏈將所有TB連在一起,可以讓一個(gè)TB執(zhí)行完以后直接跳到下一個(gè)TB,而不用每次都返回到靜態(tài)代碼部分。具體過程如圖6-4所示。第6章QEMU軟件架構(gòu)分析圖6-4TB鏈的執(zhí)行流程圖第6章QEMU軟件架構(gòu)分析4、QEMU的代碼分析接下來介紹QEMU代碼中到底怎么來執(zhí)行這個(gè)TCG以及它是如何生成宿主機(jī)代碼的。main_loop(...){/vl.c}:函數(shù)main_loop初始化qemu_main_loop_start()然后進(jìn)入無限循環(huán)cpu_exec_all(),這個(gè)是QEMU的一個(gè)主要循環(huán),它會(huì)不斷地判斷一些條件,如虛擬機(jī)的關(guān)機(jī)斷電之類的。qemu_main_loop_start(...){/cpus.c}:函數(shù)設(shè)置系統(tǒng)變量qemu_system_ready=1然后重啟所有的線程并且等待一個(gè)條件。第6章QEMU軟件架構(gòu)分析5、QEMU中的ioctl1)創(chuàng)建KVM在?/vl.c中通過kvm_init()將會(huì)創(chuàng)建各種KVM的結(jié)構(gòu)體變量,并且通過ioctl與已經(jīng)初始化好的KVM模塊進(jìn)行通訊,創(chuàng)建虛擬機(jī),然后創(chuàng)建vCPU等。2)?KVM_RUNioctl是使用最頻繁的,整個(gè)KVM運(yùn)行就是在不停地執(zhí)行ioctl,當(dāng)KVM需要QEMU處理一些指令和I/O的時(shí)候就會(huì)退出,通過ioctl退回到QEMU進(jìn)行處理,否則會(huì)一直在KVM中執(zhí)行。第6章QEMU軟件架構(gòu)分析3)?KVM_IRQ_LINEioctl和KVM_RUN是不同步的,它的調(diào)用頻率也非常高,它就是一般中斷設(shè)備的中斷注入入口。當(dāng)設(shè)備有中斷就通過ioctl最終調(diào)用KVM里面的kvm_set_irq將中斷注入到虛擬的中斷控制器。在KVM中會(huì)進(jìn)一步判斷屬于什么中斷類型,然后在合適的時(shí)機(jī)寫入VMCS。當(dāng)然在KVM_RUN中會(huì)不斷地同步虛擬中斷控制器,來獲取需要注入的中斷,這些中斷包括QEMU和KVM本身的,并在重新進(jìn)入客戶機(jī)之前注入中斷。第6章QEMU軟件架構(gòu)分析6.3.2QEMU線程事件模型1、QEMU的事件驅(qū)動(dòng)核心一個(gè)事件驅(qū)動(dòng)的架構(gòu)是以一個(gè)派發(fā)事件到處理函數(shù)的循環(huán)為核心的。QEMU的主事件循環(huán)是main_loop_wait(),它主要完成以下工作:(1)等待文件描述符變成可讀或可寫。文件描述符是一個(gè)關(guān)鍵角色,因?yàn)閒iles、sockets、pipes以及其他各種各樣的資源都是文件描述符(filedescriptors)。(2)處理到期的定時(shí)器(timer)。(3)執(zhí)行bottom-halves(BHs),它和定時(shí)器類似會(huì)立即過期。BHs用來放置回調(diào)函數(shù)的重入和溢出。第6章QEMU軟件架構(gòu)分析回調(diào)函數(shù)對(duì)于它們的環(huán)境有兩條規(guī)則:①程序中沒有其他核心代碼同時(shí)在執(zhí)行,所以不需要考慮同步問題。對(duì)于核心代碼來說,回調(diào)函數(shù)是線性和原子執(zhí)行的。在任意給定的時(shí)間里只有一個(gè)線程控制執(zhí)行核心代碼。②不應(yīng)該執(zhí)行可阻斷系統(tǒng)調(diào)用或是長(zhǎng)運(yùn)行計(jì)算(Long-runningComputations)。由于事件循環(huán)在繼續(xù)其他事件時(shí)會(huì)等待當(dāng)前回調(diào)函數(shù)返回,所以如果違反這條規(guī)定會(huì)導(dǎo)致guest暫停并且使管理器變得無響應(yīng)。第6章QEMU軟件架構(gòu)分析2、QEMU中的線程分類主線程:主線程執(zhí)行循環(huán),主要做三件事情。(1)執(zhí)行select操作,查詢文件描述符有無讀寫操作。(2)執(zhí)行定時(shí)器回調(diào)函數(shù)。(3)執(zhí)行下半部(BHs)回調(diào)函數(shù)。采用BHs的原因主要是避免可重入性和調(diào)用棧溢出。執(zhí)行客戶機(jī)代碼的線程:只討論KVM執(zhí)行客戶機(jī)代碼情況(不考慮TCG,TCG采用動(dòng)態(tài)翻譯技術(shù)),如果有多個(gè)vCPU,就意味著存在多個(gè)線程。主線程與執(zhí)行客戶機(jī)代碼線程同步:主線程與執(zhí)行客戶機(jī)代碼線程不能同時(shí)運(yùn)行,主要通過一個(gè)全局互斥鎖實(shí)現(xiàn)。第6章QEMU軟件架構(gòu)分析3、QEMU線程代碼分析1)主線程2)執(zhí)行客戶機(jī)代碼的線程3)異步I/O文件操作線程4)主線程與執(zhí)行客戶機(jī)代碼線程第6章QEMU軟件架構(gòu)分析6.3.3libkvm模塊libkvm模塊是QEMU和KVM內(nèi)核模塊中間的通信模塊,雖然KVM的應(yīng)用程序編程接口比較穩(wěn)定,同時(shí)也提供了?/dev/kvm設(shè)備文件作為KVM的API接口。但是考慮到未來的擴(kuò)展性,KVM開發(fā)小組提供了libkvm模塊,此模塊包裝了針對(duì)設(shè)備文件?/dev/kvm的具體的ioctl操作,同時(shí)還提供了關(guān)于KVM的相關(guān)初始化函數(shù),這樣就使libkvm模塊成為了一個(gè)可重復(fù)使用的用戶空間的控制模塊,供其他程序開發(fā)包所使用,比如libvirt等。第6章QEMU軟件架構(gòu)分析6.3.4Virtio組件
Virtio是半虛擬化Hypervisor中位于設(shè)備上的抽象層。Virtio由RustyRussell開發(fā),他當(dāng)時(shí)的目的是支持自己的虛擬化解決方案lguest。Linux是Hypervisor的展臺(tái),Linux提供各種Hypervisor解決方案,這些解決方案都有自己的優(yōu)缺點(diǎn)。這些解決方案包括KVM、lguest和User-modeLinux等。在Linux上配備這些不同的Hypervisor解決方案會(huì)給操作系統(tǒng)帶來負(fù)擔(dān),負(fù)擔(dān)的大小取決于各個(gè)解決方案的需求。Virtio并沒有提供多種設(shè)備模擬機(jī)制(針對(duì)網(wǎng)絡(luò)、塊設(shè)備和其他驅(qū)動(dòng)程序),而是為這些設(shè)備模擬提供一個(gè)通用的前端,從而實(shí)現(xiàn)標(biāo)準(zhǔn)化接口和增加代碼的跨平臺(tái)重用。第6章QEMU軟件架構(gòu)分析圖6-5完全虛擬化環(huán)境下的設(shè)備模擬第6章QEMU軟件架構(gòu)分析圖6-6半虛擬化環(huán)境下的設(shè)備模擬第6章QEMU軟件架構(gòu)分析硬件隨著虛擬化技術(shù)而不斷改變。新的處理器通過納入高級(jí)指令來讓客戶操作系統(tǒng)到Hypervisor的過渡更加高效。此外,硬件也隨著輸入/輸出(I/O)虛擬化而不斷改變。但是在傳統(tǒng)的完全虛擬化環(huán)境中,Hypervisor必須捕捉這些請(qǐng)求,然后模擬物理硬件的行為。盡管這樣做提供了很大的靈活性(即運(yùn)行未更改的操作系統(tǒng)),但它的效率比較低。圖6-6所示為半虛擬化示例。在這里,客戶操作系統(tǒng)知道它在Hypervisor上運(yùn)行,并包含了充當(dāng)前端的驅(qū)動(dòng)程序。第6章QEMU軟件架構(gòu)分析1、Virtio組件是針對(duì)Linux的抽象Virtio是對(duì)半虛擬化Hypervisor中的一組通用模擬設(shè)備的抽象。該設(shè)置還允許Hypervisor導(dǎo)出一組通用的模擬設(shè)備,并通過一個(gè)通用的應(yīng)用編程接口(API)讓它們變得可用。圖6-7展示了Virtio組件的重要性。有了半虛擬化Hypervisor之后,客戶操作系統(tǒng)能夠?qū)崿F(xiàn)一組通用的接口,在一組后端驅(qū)動(dòng)程序之后采用特定的設(shè)備模擬。后端驅(qū)動(dòng)程序不需要是通用的,因?yàn)樗鼈冎粚?shí)現(xiàn)前端所需的行為。第6章QEMU軟件架構(gòu)分析圖6-7Virtio的驅(qū)動(dòng)程序抽象第6章QEMU軟件架構(gòu)分析注意:在現(xiàn)實(shí)中,設(shè)備模擬發(fā)生在使用QEMU的用戶空間,因此后端驅(qū)動(dòng)程序與Hypervisor的用戶空間交互,通過QEMU為I/O提供便利。QEMU是一個(gè)系統(tǒng)模擬器,它不僅提供客戶操作系統(tǒng)虛擬化平臺(tái),還提供整個(gè)系統(tǒng)(PCI主機(jī)控制器、磁盤、網(wǎng)絡(luò)、視頻硬件、USB控制器和其他硬件設(shè)備)的模擬。第6章QEMU軟件架構(gòu)分析2、Virtio架構(gòu)除了前端驅(qū)動(dòng)程序(在客戶操作系統(tǒng)中實(shí)現(xiàn))和后端驅(qū)動(dòng)程序(在Hypervisor中實(shí)現(xiàn))之外,Virtio還定義了兩個(gè)層次來支持客戶操作系統(tǒng)到Hypervisor的通信。上層(virtio層)是虛擬隊(duì)列接口,它在概念上將前端驅(qū)動(dòng)程序附加到后端驅(qū)動(dòng)程序。驅(qū)動(dòng)程序可以使用0個(gè)或多個(gè)隊(duì)列,具體數(shù)量取決于需求。例如,Virtio
網(wǎng)絡(luò)驅(qū)動(dòng)程序使用兩個(gè)虛擬隊(duì)列(一個(gè)用于接收,另一個(gè)用于發(fā)送),而Virtio塊驅(qū)動(dòng)程序僅使用一個(gè)虛擬隊(duì)列。虛擬隊(duì)列實(shí)際上被視為跨越客戶操作系統(tǒng)和Hypervisor的銜接點(diǎn)。第6章QEMU軟件架構(gòu)分析
如圖6-8所示,列出了5個(gè)前端驅(qū)動(dòng)程序,分別為塊設(shè)備(比如磁盤)、網(wǎng)絡(luò)設(shè)備、PCI模擬、balloon驅(qū)動(dòng)程序和console驅(qū)動(dòng)程序。每個(gè)前端驅(qū)動(dòng)程序在Hypervisor中有一個(gè)對(duì)應(yīng)的后端驅(qū)動(dòng)程序。第6章QEMU軟件架構(gòu)分析圖6-8Virtio框架的高級(jí)架構(gòu)第6章QEMU軟件架構(gòu)分析從客戶操作系統(tǒng)的角度來看,對(duì)象層次結(jié)構(gòu)的定義如圖6-9所示。在頂級(jí)的是virtio_driver,它在客戶操作系統(tǒng)中表示前端驅(qū)動(dòng)程序。與該驅(qū)動(dòng)程序匹配的設(shè)備由virtio_device(設(shè)備在客戶操作系統(tǒng)中的表示)封裝。這引用virtio_config_ops結(jié)構(gòu)(它定義了配置virtio設(shè)備的操作)。virtio_device由virtqueue引用(它包含一個(gè)到它服務(wù)的virtio_device的引用)。隊(duì)列操作是virtioAPI的核心,接下來詳細(xì)介紹virtqueue_ops的操作。第6章QEMU軟件架構(gòu)分析圖6-9Virtio前端的對(duì)象層次結(jié)構(gòu)第6章QEMU軟件架構(gòu)分析3、核心API對(duì)于add_buf,客戶操作系統(tǒng)提供用于將請(qǐng)求添加到隊(duì)列的virtqueue、散集列表(地址和長(zhǎng)度數(shù)組)、用作輸出條目(目標(biāo)是底層Hypervisor)的緩沖池?cái)?shù)量,以及用作輸入條目(Hypervisor將為它們儲(chǔ)存數(shù)據(jù)并返回到客戶操作系統(tǒng))的緩沖池?cái)?shù)量。當(dāng)通過add_buf向Hypervisor發(fā)出請(qǐng)求時(shí),客戶操作系統(tǒng)能夠通過kick函數(shù)通知Hypervisor新的請(qǐng)求。為了獲得最佳的性能,客戶操作系統(tǒng)應(yīng)該在通過kick發(fā)出通知之前將盡可能多的緩沖池裝載到virtqueue中。第6章QEMU軟件架構(gòu)分析通過get_buf函數(shù)觸發(fā)來自Hypervisor的響應(yīng)??蛻舨僮飨到y(tǒng)僅需調(diào)用該函數(shù)或通過提供的virtqueuecallback函數(shù)等待通知就可以實(shí)現(xiàn)輪詢。當(dāng)客戶操作系統(tǒng)知道緩沖區(qū)可用時(shí),調(diào)用get_buf返回完成的緩沖區(qū)。virtqueueAPI的最后兩個(gè)函數(shù)是enable_cb和disable_cb。可以使用這兩個(gè)函數(shù)來啟用或禁用回調(diào)進(jìn)程(通過在virtqueue中由virtqueue初始化的callback函數(shù))。注意,該回調(diào)函數(shù)和Hypervisor位于獨(dú)立的地址空間中,因此調(diào)用通過一個(gè)間接的Hypervisor來觸發(fā)(比如kvm_hypercall)。第6章QEMU軟件架構(gòu)分析6.4QEMU內(nèi)存模型QEMU內(nèi)存API仿真了QEMU的內(nèi)存,I/O總線以及對(duì)應(yīng)的控制器,主要包括以下部分的仿真:(1)常規(guī)內(nèi)存。(2)?I/O映射內(nèi)存(MMIO)。(3)內(nèi)存控制器(將物理內(nèi)存動(dòng)態(tài)地映射到不同的虛擬地址空間)。QEMU內(nèi)存模型主要包括以下功能:(1)跟蹤目標(biāo)機(jī)內(nèi)存的變化。(2)為KVM建立共享內(nèi)存(CoalescedMemory)。(3)為KVM建立ioeventfdregions。第6章QEMU軟件架構(gòu)分析QEMU中包含四種類型的MemoryRegions,通過C數(shù)據(jù)結(jié)構(gòu)structMemoryRegion來表示:(1)?RAMRegion:目標(biāo)機(jī)可用的主機(jī)上的一段虛擬地址空間。(2)?MMIORegion:注冊(cè)了read和write回調(diào)函數(shù)(callbacksfunctions)的一段目標(biāo)機(jī)地址空間,對(duì)這段空間的讀寫操作將會(huì)調(diào)用主機(jī)上的回調(diào)函數(shù)。(3)?Container:多個(gè)MemoryRegions的集合,每個(gè)MR在Container中有不同的offset。(4)?Alias:某個(gè)MR的subsection,Alias類型的MR可以指向任何其他類型的MR。第6章QEMU軟件架構(gòu)分析當(dāng)目標(biāo)系統(tǒng)訪問某個(gè)地址空間時(shí),QEMU內(nèi)存管理系統(tǒng)按照如下規(guī)則選擇一個(gè)MR:(1)從根節(jié)點(diǎn)按照降序的優(yōu)先級(jí)進(jìn)行匹配。(2)如果當(dāng)前的MR是葉子節(jié)點(diǎn),搜索過程終止。(3)如果當(dāng)前MR是Container,相同的算法在Container中搜索。(4)如果當(dāng)前MR是Alias,搜索從Alias指向的MR繼續(xù)進(jìn)行。第6章QEMU軟件架構(gòu)分析圖6-10PC內(nèi)存映射圖第6章QEMU軟件架構(gòu)分析
圖6-10是簡(jiǎn)單的PC內(nèi)存映射圖,4G的RAM地址空間通過兩個(gè)AliasMR被映射到目標(biāo)系統(tǒng)的地址空間中。其中l(wèi)omem采用一一映射的方式共映射了4G地址空間的前3.5G,himem映射剩下的0.5G的地址空間(圖6-10中被稱為pci-hole)。內(nèi)存控制器將640k~768k的RAM地址重新映射到PCI地址空間,命名為vga-window,并且比原來RAM中的這段地址空間有更高的優(yōu)先級(jí),保證了訪問這段地址空間是訪問PCI地址空間中的這段地址空間。第6章QEMU軟件架構(gòu)分析6.5QEMU的PCI總線與設(shè)備6.5.1PCI結(jié)構(gòu)簡(jiǎn)介每一個(gè)PCI設(shè)備都對(duì)應(yīng)一段內(nèi)存空間,里面按照地址位置放置PCI設(shè)備的信息,如表6-2所示,包括廠家信息、bar信息、中斷等,也可以理解成一個(gè)數(shù)組,一些設(shè)備一出廠,相關(guān)的信息已經(jīng)寫在里面,這里的模擬設(shè)備的所有信息都要進(jìn)行動(dòng)態(tài)的讀和寫,在這里只列出了相關(guān)的數(shù)據(jù)。第6章QEMU軟件架構(gòu)分析
PCI設(shè)備內(nèi)存低地址
PCI設(shè)備內(nèi)存高地址0x000x040x080x0C0x00VendorIDDevIDcommand
0x10bar0addrbar1addrbar2addrbar3addr0x20bar4addrbar5addr
0x30
interruptline表6-2PCI設(shè)備信息表第6章QEMU軟件架構(gòu)分析6.5.2QEMU的PCI總線QEMU在初始化硬件的時(shí)候,最開始的函
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版卷簾門銷售與安裝及售后服務(wù)合同3篇
- 城市排水系統(tǒng)改造招標(biāo)意見
- 2024年停車場(chǎng)新能源汽車充電設(shè)施建設(shè)合同3篇
- 電視媒體收費(fèi)規(guī)范:發(fā)票管理辦法
- 城市供水項(xiàng)目鉆井工程施工合同
- 水廠石材施工合同
- 辦事處員工福利與關(guān)懷措施
- 醫(yī)療文創(chuàng)企業(yè)人才引進(jìn)協(xié)議書
- 污水處理承臺(tái)施工合同
- 礦山校車司機(jī)招聘合同
- 撤場(chǎng)通知書( 模板)
- 施工人員三級(jí)安全教育記錄表
- 2023-2024學(xué)年北京市海淀區(qū)八年級(jí)上學(xué)期數(shù)學(xué)期末質(zhì)量檢測(cè)模擬卷合集2套(含解析)
- 銅排設(shè)計(jì)技術(shù)規(guī)范
- 英國文學(xué)史及選讀復(fù)習(xí)要點(diǎn)總結(jié)
- 貴州省貴陽市花溪區(qū)2023-2024學(xué)年數(shù)學(xué)三年級(jí)第一學(xué)期期末聯(lián)考試題含答案
- 整改回復(fù)書樣板后邊附帶圖片
- 中小學(xué)校園人車分流方案模板
- 廣東省惠州市博羅縣2022-2023學(xué)年六年級(jí)上學(xué)期期末數(shù)學(xué)試卷
- 魚類外部形態(tài)-魚類的皮膚及其衍生物
- GB/T 42220-2022金鑲玉鑲嵌工藝質(zhì)量評(píng)價(jià)
評(píng)論
0/150
提交評(píng)論