版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
云計算虛擬化技術(shù)基礎(chǔ)與實(shí)踐
QEMU虛擬化原理目錄CONTENT01.QEMU運(yùn)行模式02.QEMU軟件構(gòu)成03.QEMU內(nèi)存模型04.QEMU的PCI總線與設(shè)備本章重點(diǎn)理解QEMU的運(yùn)行模式。了解QEMU的軟件構(gòu)成。理解QEMU的內(nèi)存模型。理解QEMU的PCI總線與設(shè)備。QEMU運(yùn)行模式01QEMU運(yùn)行模式QEMU作為一個開源的硬件模擬器項目,除了支持x86體系架構(gòu)之外,還支持ARM、MIPS、PowerPC、IA64等多種CPU硬件架構(gòu)。QEMU除了支持KVM之外,還支持全虛擬機(jī)和kqemu加速模塊等方式QEMU的三種模塊架構(gòu)QEMU軟件構(gòu)成QEMU源碼架構(gòu)QEMU線程事件模型Libkvm模塊Virtio組件02QEMU軟件構(gòu)成QEMU的軟件架構(gòu)QEMU主要由以下幾個部分組成:Hypervisor控制仿真。TinyCodeGenerator(TCG)在虛擬機(jī)器代碼和宿主機(jī)代碼之間進(jìn)行轉(zhuǎn)換。軟件內(nèi)存管理單元(MMU)處理內(nèi)存訪問。磁盤子系統(tǒng)處理不同的磁盤映像格式。設(shè)備子系統(tǒng)處理網(wǎng)卡和其他硬件設(shè)備。1.QEMU源碼架構(gòu)QEMU源碼的獲取可以訪問QEMU的官方網(wǎng)站:/download/。QEMU的源碼總體上分為指令翻譯(位于tcg目錄下的文件)、硬件模擬(位于hw目錄下的文件)、網(wǎng)絡(luò)傳輸(位于slirp目錄下的文件)和文件系統(tǒng)(block前綴文件)四個部分,其主程序涉及的相關(guān)文件有vl.c、cpu-exec.c、exec.c、translate-all.c、thunk.c、disas.c。1.QEMU源碼架構(gòu)代碼結(jié)構(gòu)QEMU中有一個模塊叫做微型代碼生成器(TCG,TinyCodeGenerator),它用來將客戶機(jī)代碼翻譯成宿主機(jī)代碼。
QEMU指令動態(tài)翻譯過程1.QEMU源碼架構(gòu)QEMU的主要功能就是不斷提取客戶機(jī)代碼并且轉(zhuǎn)化成宿主機(jī)指定架構(gòu)的代碼。整個翻譯任務(wù)分為兩個部分:第一個部分將客戶機(jī)代碼轉(zhuǎn)化成TCG中間代碼,然后再將中間代碼轉(zhuǎn)化成宿主機(jī)代碼。開始執(zhí)行:比較重要的C語言文件有:vl.c、cpus.c、exec-all.c、exec.c和cpu-exec.c。硬件模擬:所有的硬件設(shè)備都在/hw/目錄下面,所有的設(shè)備都有獨(dú)自的文件,包括總線,串口,網(wǎng)卡,鼠標(biāo)等等。目標(biāo)機(jī)器:現(xiàn)在QEMU可以模擬的CPU架構(gòu)有:Alpha,ARM,Cris,i386,Mips,MicroBlaze,S390X和SH4等。主機(jī):使用TCG代碼生成主機(jī)的代碼,存放在/tcg/目錄中。代碼結(jié)構(gòu)1.QEMU源碼架構(gòu)2.TCG動態(tài)翻譯TCG代碼轉(zhuǎn)換過程1.QEMU源碼架構(gòu)3.TB鏈在QEMU中,從代碼CACHE到靜態(tài)代碼再回到代碼CACHE,這個過程比較耗時,所以在QEMU中涉及了一個TB鏈將所有TB連在一起,可以讓一個TB執(zhí)行完以后直接跳到下一個TB,而不用每次都返回到靜態(tài)代碼部分。TB鏈的執(zhí)行流程1.QEMU源碼架構(gòu)4.QEMU的TCG代碼分析main_loop(...){/vl.c}:函數(shù)main_loop初始化qemu_main_loop_start()然后進(jìn)入無限循環(huán)cpu_exec_all(),這個是QEMU的一個主要循環(huán)。qemu_main_loop_start(...){/cpus.c}:函數(shù)設(shè)置系統(tǒng)變量qemu_system_ready=1,然后重啟所有的線程并且等待一個條件變量。cpu_exec(...){/cpu-exec.c}:是CPU指令執(zhí)行的主函數(shù)。disas_insn(){/target-arch/translate.c}:真正的實(shí)現(xiàn)將客戶機(jī)代碼翻譯成TCG代碼。tcg_gen_code(...){/tcg/tcg.c}:將TCG的代碼轉(zhuǎn)化成主機(jī)代碼1.QEMU源碼架構(gòu)5.QEMU中的ioctl創(chuàng)建KVM在/vl.c中通過kvm_init()將會創(chuàng)建各種KVM的結(jié)構(gòu)體變量,并且通過ioctl與已經(jīng)初始化好的KVM模塊進(jìn)行通訊,創(chuàng)建虛擬機(jī),然后創(chuàng)建vCPU等等。KVM_RUN當(dāng)KVM需要QEMU處理一些指令和I/O時,就會通過這個ioctl退回到QEMU進(jìn)行處理,否則會一直在KVM中執(zhí)行。KVM_IRQ_LINE當(dāng)設(shè)備有中斷時,通過ioctl調(diào)用KVM里面的kvm_set_irq將中斷注入到虛擬的中斷控制器。2.QEMU線程事件模型1.QEMU的事件驅(qū)動核心一個事件驅(qū)動的架構(gòu)是以派發(fā)一個事件到處理函數(shù)的循環(huán)為核心的。QEMU的主事件循環(huán)是main_loop_wait(),它主要完成以下工作:1)等待文件描述符變成可讀或可寫。文件描述符是一個關(guān)鍵角色,因為files、sockets、pipes以及其他各種各樣的資源都使用文件描述符(filedescriptors)。文件描述符的增加使用qemu_set_fd_handler()函數(shù)。2)處理到期的定時器(timer)。定時器的添加使用qemu_mod_timer()函數(shù)。3)執(zhí)行bottom-halves(BHs),它和定時器類似會立即過期。BHs用來放置回調(diào)函數(shù)的重入和溢出。2.QEMU線程事件模型2.QEMU的線程分類主線程執(zhí)行循環(huán),主要做三件事情:1)執(zhí)行select操作,查詢文件描述符有無讀寫操作。2)執(zhí)行定時器回調(diào)函數(shù)。3)執(zhí)行下半部(BHs)回調(diào)函數(shù)。采用BHs的原因主要是避免可重入性和調(diào)用棧溢出。執(zhí)行客戶機(jī)代碼的線程:只討論KVM執(zhí)行客戶機(jī)代碼情況(不考慮TCG,TCG采用動態(tài)翻譯技術(shù)),如果有多個vCPU,就意味著存在多個線程。異步I/O文件操作線程:提交I/O操作請求到隊列中,該線程從隊列取請求,并進(jìn)行處理。主線程與執(zhí)行客戶機(jī)代碼同步線程:主線程與執(zhí)行客戶機(jī)代碼線程不能同時運(yùn)行,要通過一個全局互斥鎖實(shí)現(xiàn)。3.Libkvm模塊但是考慮到未來的擴(kuò)展性,KVM開發(fā)小組提供了Libkvm模塊,此模塊包裝了針對設(shè)備文件/dev/kvm的具體ioctl操作,同時還提供了關(guān)于KVM的相關(guān)初始化函數(shù),這樣就使Libkvm模塊成為了一個可復(fù)用的用戶空間的控制模塊,供其他程序開發(fā)包所使用,比如Libvirt等。Libkvm模塊是QEMU和KVM內(nèi)核模塊中間的通信模塊,雖然KVM的應(yīng)用程序編程接口比較穩(wěn)定,同時也提供了/dev/kvm設(shè)備文件作為KVM的API接口。4.Virtio組件Virtio是半虛擬化Hypervisor中位于設(shè)備之上的抽象層。在開始學(xué)習(xí)Virtio組件的內(nèi)容之前,需要先了解半虛擬化和模擬設(shè)備的相關(guān)內(nèi)容。完全虛擬化環(huán)境下的設(shè)備模擬半虛擬化環(huán)境下的設(shè)備模擬4.Virtio組件1.Virtio的驅(qū)動程序抽象Virtio的驅(qū)動程序抽象4.Virtio組件2.Virtio架構(gòu)除了前端驅(qū)動程序(Front-enddrivers,在客戶操作系統(tǒng)中實(shí)現(xiàn))和后端驅(qū)動程序(Back-enddrivers,在Hypervisor中實(shí)現(xiàn))之外,Virtio還定義了兩個層次來支持客戶操作系統(tǒng)到Hypervisor的通信。上層(virtio層)是虛擬隊列接口;下層是transport層,負(fù)責(zé)virtio層和后端驅(qū)動進(jìn)而到Hypervisor的交互。Virtio框架架構(gòu)4.Virtio組件Virtio前端的對象層次結(jié)構(gòu)4.Virtio組件3.核心APIvirtio_device和virtqueue將客戶機(jī)操作系統(tǒng)中的驅(qū)動程序與Hypervisor驅(qū)動程序鏈接起來。virtqueue支持自己獨(dú)有的API集合,使用函數(shù)add_buf向Hypervisor提供請求。客戶機(jī)操作系統(tǒng)通過get_buf函數(shù)觸發(fā)來自Hypervisor的響應(yīng),并調(diào)用該函數(shù)或通過virtqueuecallback函數(shù)等待通知來實(shí)現(xiàn)輪詢。virtqueueAPI的最后兩個函數(shù)是enable_cb和disable_cb,分別用來啟用或禁用回調(diào)進(jìn)程(通過在virtqueue中初始化的callback函數(shù)實(shí)現(xiàn))。QEMU內(nèi)存模型03QEMU內(nèi)存模型QEMU內(nèi)存API仿真了QEMU的內(nèi)存,I/O總線以及對應(yīng)的控制器,主要包括以下部分的仿真:1.常規(guī)內(nèi)存。2.I/O映射內(nèi)存(MMIO)。3.內(nèi)存控制器(將物理內(nèi)存動態(tài)的映射到不同的虛擬地址空間)。QEMU內(nèi)存模型主要包括以下功能:1.跟蹤目標(biāo)機(jī)內(nèi)存的變化。2.為KVM建立共享內(nèi)存(CoalescedMemory)。3.為KVM建立ioeventfdregions。QEMU內(nèi)存模型QEMU中包含四種類型的MemoryRegions,通過C數(shù)據(jù)結(jié)構(gòu)structMemoryRegion來表示。1.RAMRegion:目標(biāo)機(jī)可用的主機(jī)上的一段虛擬地址空間。2.MMIORegion:注冊了read和write回調(diào)函數(shù)(callbacksfunctions)的一段目標(biāo)機(jī)地址空間,對這段空間的讀寫操作將會調(diào)用主機(jī)上的回調(diào)函數(shù)。3.Container:多個MemoryRegions的集合,每個MR(MemoryRegions)在Container中有不同的offset。4.Alias:某個MR的subsection,Alias類型的MR可以指向任何其他類型的MR。QEMU內(nèi)存模型當(dāng)目標(biāo)系統(tǒng)訪問某個地址空間時,QEMU內(nèi)存管理系統(tǒng)按照如下規(guī)則選擇一個MR:1.從根節(jié)點(diǎn)按照降序的優(yōu)先級進(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)行。QEMU的PCI總線與設(shè)備PCI結(jié)構(gòu)簡介QEMU的PCI總線QEMU的PCI-PCI橋QEMU的PCI設(shè)備041.PCI結(jié)構(gòu)簡介每一個PCI設(shè)備都對應(yīng)一段內(nèi)存空間,里面按照地址位置放置PCI設(shè)備的信息,包括廠家信息,bar信息,中斷等等,也可以理解成一個數(shù)組,一些設(shè)備一出廠,相關(guān)的信息已經(jīng)寫在里面,模擬設(shè)備的所有信息都要進(jìn)行動態(tài)的讀和寫。PCI設(shè)備信息表PCI設(shè)備內(nèi)存低地址
PCI設(shè)備內(nèi)存高地址0x000x040x080x0C0x00VendorIDDevIDcommand
0x10bar0addrbar1addrbar2addrbar3addr0x20bar4addrbar5addr
0x30
interruptline
2.QEMU的PCI總線QEMU在初始化硬件的時候,最開始的函數(shù)就是pc_init1。在這個函數(shù)里面會相繼的初始化CPU,中斷控制器,ISA總線,然后就要判斷是否需要支持PCI,如果支持則需調(diào)用i440fx_init初始化PCI總線。i440fx_init函數(shù)的主要參數(shù)是初始化好的ISA總線以及中斷控制器,返回值是PCI總線,初始化之后就可以將設(shè)備進(jìn)行掛載。在Linux里面可以使用命令lspci-t來看PCI總線的結(jié)構(gòu)圖。3.QEMU的PCI-PCI橋在QEMU中,所有的設(shè)備包括總線、橋、一般設(shè)備等都對應(yīng)一個設(shè)備結(jié)構(gòu),通過register函數(shù)將所有的設(shè)備鏈接起來。在QEMU啟動的時候會初始化所有的QEMU設(shè)備,而對于PCI設(shè)備來說,QEMU在初始化以后還會進(jìn)行一次RESET,將所有的PCIbar上的地址清空,然后進(jìn)行
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年河源勞動合同范本與勞動保障政策應(yīng)用
- 2025年度環(huán)衛(wèi)工人休息休假合同
- 作品創(chuàng)作權(quán)轉(zhuǎn)讓合同(2024年修訂)2篇
- 2025年度兒童安全教育培訓(xùn)服務(wù)合同
- 2025年度存量二手房買賣合同(帶房產(chǎn)過戶手續(xù))2篇
- 二零二四年醫(yī)療行業(yè)文員醫(yī)療保密合同范本2篇
- 2025年度國內(nèi)集裝箱貨物運(yùn)輸合同示范文本
- 專項美容院技術(shù)合作2024合同版
- 2025年度國際化工產(chǎn)品買賣合同樣本
- 2025年度合同管理專家咨詢與服務(wù)合同
- PEP人教版小學(xué)英語六年級下冊單詞表(含音標(biāo))
- 旅行社脫團(tuán)安全協(xié)議書范文模板
- 期中測試卷-2024-2025學(xué)年統(tǒng)編版語文五年級上冊
- 新教材人教版高中物理選擇性必修第三冊全冊各章節(jié)知識點(diǎn)考點(diǎn)
- CJT 354-2010 城市軌道交通車輛空調(diào)、采暖及通風(fēng)裝置技術(shù)條件
- 暑假作業(yè) 11 高二英語語法填空20篇(原卷版)-【暑假分層作業(yè)】2024年高二英語暑假培優(yōu)練(人教版2019)
- 2024年江西省南昌市南昌縣中考一模數(shù)學(xué)試題(含解析)
- 繪本的分鏡設(shè)計-分鏡的編排
- 查干淖爾一號井環(huán)評
- 體檢中心分析報告
- 人教版初中英語七八九全部單詞(打印版)
評論
0/150
提交評論