云計算虛擬化技術基礎與實踐:QEMU虛擬化原理_第1頁
云計算虛擬化技術基礎與實踐:QEMU虛擬化原理_第2頁
云計算虛擬化技術基礎與實踐:QEMU虛擬化原理_第3頁
云計算虛擬化技術基礎與實踐:QEMU虛擬化原理_第4頁
云計算虛擬化技術基礎與實踐:QEMU虛擬化原理_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

云計算虛擬化技術基礎與實踐

QEMU虛擬化原理目錄CONTENT01.QEMU運行模式02.QEMU軟件構成03.QEMU內存模型04.QEMU的PCI總線與設備本章重點理解QEMU的運行模式。了解QEMU的軟件構成。理解QEMU的內存模型。理解QEMU的PCI總線與設備。QEMU運行模式01QEMU運行模式QEMU作為一個開源的硬件模擬器項目,除了支持x86體系架構之外,還支持ARM、MIPS、PowerPC、IA64等多種CPU硬件架構。QEMU除了支持KVM之外,還支持全虛擬機和kqemu加速模塊等方式QEMU的三種模塊架構QEMU軟件構成QEMU源碼架構QEMU線程事件模型Libkvm模塊Virtio組件02QEMU軟件構成QEMU的軟件架構QEMU主要由以下幾個部分組成:Hypervisor控制仿真。TinyCodeGenerator(TCG)在虛擬機器代碼和宿主機代碼之間進行轉換。軟件內存管理單元(MMU)處理內存訪問。磁盤子系統(tǒng)處理不同的磁盤映像格式。設備子系統(tǒng)處理網卡和其他硬件設備。1.QEMU源碼架構QEMU源碼的獲取可以訪問QEMU的官方網站:/download/。QEMU的源碼總體上分為指令翻譯(位于tcg目錄下的文件)、硬件模擬(位于hw目錄下的文件)、網絡傳輸(位于slirp目錄下的文件)和文件系統(tǒng)(block前綴文件)四個部分,其主程序涉及的相關文件有vl.c、cpu-exec.c、exec.c、translate-all.c、thunk.c、disas.c。1.QEMU源碼架構代碼結構QEMU中有一個模塊叫做微型代碼生成器(TCG,TinyCodeGenerator),它用來將客戶機代碼翻譯成宿主機代碼。

QEMU指令動態(tài)翻譯過程1.QEMU源碼架構QEMU的主要功能就是不斷提取客戶機代碼并且轉化成宿主機指定架構的代碼。整個翻譯任務分為兩個部分:第一個部分將客戶機代碼轉化成TCG中間代碼,然后再將中間代碼轉化成宿主機代碼。開始執(zhí)行:比較重要的C語言文件有:vl.c、cpus.c、exec-all.c、exec.c和cpu-exec.c。硬件模擬:所有的硬件設備都在/hw/目錄下面,所有的設備都有獨自的文件,包括總線,串口,網卡,鼠標等等。目標機器:現(xiàn)在QEMU可以模擬的CPU架構有:Alpha,ARM,Cris,i386,Mips,MicroBlaze,S390X和SH4等。主機:使用TCG代碼生成主機的代碼,存放在/tcg/目錄中。代碼結構1.QEMU源碼架構2.TCG動態(tài)翻譯TCG代碼轉換過程1.QEMU源碼架構3.TB鏈在QEMU中,從代碼CACHE到靜態(tài)代碼再回到代碼CACHE,這個過程比較耗時,所以在QEMU中涉及了一個TB鏈將所有TB連在一起,可以讓一個TB執(zhí)行完以后直接跳到下一個TB,而不用每次都返回到靜態(tài)代碼部分。TB鏈的執(zhí)行流程1.QEMU源碼架構4.QEMU的TCG代碼分析main_loop(...){/vl.c}:函數(shù)main_loop初始化qemu_main_loop_start()然后進入無限循環(huán)cpu_exec_all(),這個是QEMU的一個主要循環(huán)。qemu_main_loop_start(...){/cpus.c}:函數(shù)設置系統(tǒng)變量qemu_system_ready=1,然后重啟所有的線程并且等待一個條件變量。cpu_exec(...){/cpu-exec.c}:是CPU指令執(zhí)行的主函數(shù)。disas_insn(){/target-arch/translate.c}:真正的實現(xiàn)將客戶機代碼翻譯成TCG代碼。tcg_gen_code(...){/tcg/tcg.c}:將TCG的代碼轉化成主機代碼1.QEMU源碼架構5.QEMU中的ioctl創(chuàng)建KVM在/vl.c中通過kvm_init()將會創(chuàng)建各種KVM的結構體變量,并且通過ioctl與已經初始化好的KVM模塊進行通訊,創(chuàng)建虛擬機,然后創(chuàng)建vCPU等等。KVM_RUN當KVM需要QEMU處理一些指令和I/O時,就會通過這個ioctl退回到QEMU進行處理,否則會一直在KVM中執(zhí)行。KVM_IRQ_LINE當設備有中斷時,通過ioctl調用KVM里面的kvm_set_irq將中斷注入到虛擬的中斷控制器。2.QEMU線程事件模型1.QEMU的事件驅動核心一個事件驅動的架構是以派發(fā)一個事件到處理函數(shù)的循環(huán)為核心的。QEMU的主事件循環(huán)是main_loop_wait(),它主要完成以下工作:1)等待文件描述符變成可讀或可寫。文件描述符是一個關鍵角色,因為files、sockets、pipes以及其他各種各樣的資源都使用文件描述符(filedescriptors)。文件描述符的增加使用qemu_set_fd_handler()函數(shù)。2)處理到期的定時器(timer)。定時器的添加使用qemu_mod_timer()函數(shù)。3)執(zhí)行bottom-halves(BHs),它和定時器類似會立即過期。BHs用來放置回調函數(shù)的重入和溢出。2.QEMU線程事件模型2.QEMU的線程分類主線程執(zhí)行循環(huán),主要做三件事情:1)執(zhí)行select操作,查詢文件描述符有無讀寫操作。2)執(zhí)行定時器回調函數(shù)。3)執(zhí)行下半部(BHs)回調函數(shù)。采用BHs的原因主要是避免可重入性和調用棧溢出。執(zhí)行客戶機代碼的線程:只討論KVM執(zhí)行客戶機代碼情況(不考慮TCG,TCG采用動態(tài)翻譯技術),如果有多個vCPU,就意味著存在多個線程。異步I/O文件操作線程:提交I/O操作請求到隊列中,該線程從隊列取請求,并進行處理。主線程與執(zhí)行客戶機代碼同步線程:主線程與執(zhí)行客戶機代碼線程不能同時運行,要通過一個全局互斥鎖實現(xiàn)。3.Libkvm模塊但是考慮到未來的擴展性,KVM開發(fā)小組提供了Libkvm模塊,此模塊包裝了針對設備文件/dev/kvm的具體ioctl操作,同時還提供了關于KVM的相關初始化函數(shù),這樣就使Libkvm模塊成為了一個可復用的用戶空間的控制模塊,供其他程序開發(fā)包所使用,比如Libvirt等。Libkvm模塊是QEMU和KVM內核模塊中間的通信模塊,雖然KVM的應用程序編程接口比較穩(wěn)定,同時也提供了/dev/kvm設備文件作為KVM的API接口。4.Virtio組件Virtio是半虛擬化Hypervisor中位于設備之上的抽象層。在開始學習Virtio組件的內容之前,需要先了解半虛擬化和模擬設備的相關內容。完全虛擬化環(huán)境下的設備模擬半虛擬化環(huán)境下的設備模擬4.Virtio組件1.Virtio的驅動程序抽象Virtio的驅動程序抽象4.Virtio組件2.Virtio架構除了前端驅動程序(Front-enddrivers,在客戶操作系統(tǒng)中實現(xiàn))和后端驅動程序(Back-enddrivers,在Hypervisor中實現(xiàn))之外,Virtio還定義了兩個層次來支持客戶操作系統(tǒng)到Hypervisor的通信。上層(virtio層)是虛擬隊列接口;下層是transport層,負責virtio層和后端驅動進而到Hypervisor的交互。Virtio框架架構4.Virtio組件Virtio前端的對象層次結構4.Virtio組件3.核心APIvirtio_device和virtqueue將客戶機操作系統(tǒng)中的驅動程序與Hypervisor驅動程序鏈接起來。virtqueue支持自己獨有的API集合,使用函數(shù)add_buf向Hypervisor提供請求??蛻魴C操作系統(tǒng)通過get_buf函數(shù)觸發(fā)來自Hypervisor的響應,并調用該函數(shù)或通過virtqueuecallback函數(shù)等待通知來實現(xiàn)輪詢。virtqueueAPI的最后兩個函數(shù)是enable_cb和disable_cb,分別用來啟用或禁用回調進程(通過在virtqueue中初始化的callback函數(shù)實現(xiàn))。QEMU內存模型03QEMU內存模型QEMU內存API仿真了QEMU的內存,I/O總線以及對應的控制器,主要包括以下部分的仿真:1.常規(guī)內存。2.I/O映射內存(MMIO)。3.內存控制器(將物理內存動態(tài)的映射到不同的虛擬地址空間)。QEMU內存模型主要包括以下功能:1.跟蹤目標機內存的變化。2.為KVM建立共享內存(CoalescedMemory)。3.為KVM建立ioeventfdregions。QEMU內存模型QEMU中包含四種類型的MemoryRegions,通過C數(shù)據(jù)結構structMemoryRegion來表示。1.RAMRegion:目標機可用的主機上的一段虛擬地址空間。2.MMIORegion:注冊了read和write回調函數(shù)(callbacksfunctions)的一段目標機地址空間,對這段空間的讀寫操作將會調用主機上的回調函數(shù)。3.Container:多個MemoryRegions的集合,每個MR(MemoryRegions)在Container中有不同的offset。4.Alias:某個MR的subsection,Alias類型的MR可以指向任何其他類型的MR。QEMU內存模型當目標系統(tǒng)訪問某個地址空間時,QEMU內存管理系統(tǒng)按照如下規(guī)則選擇一個MR:1.從根節(jié)點按照降序的優(yōu)先級進行匹配。2.如果當前的MR是葉子節(jié)點,搜索過程終止。3.如果當前MR是Container,相同的算法在Container中搜索。4.如果當前MR是Alias,搜索從Alias指向的MR繼續(xù)進行。QEMU的PCI總線與設備PCI結構簡介QEMU的PCI總線QEMU的PCI-PCI橋QEMU的PCI設備041.PCI結構簡介每一個PCI設備都對應一段內存空間,里面按照地址位置放置PCI設備的信息,包括廠家信息,bar信息,中斷等等,也可以理解成一個數(shù)組,一些設備一出廠,相關的信息已經寫在里面,模擬設備的所有信息都要進行動態(tài)的讀和寫。PCI設備信息表PCI設備內存低地址

PCI設備內存高地址0x000x040x080x0C0x00VendorIDDevIDcommand

0x10bar0addrbar1addrbar2addrbar3addr0x20bar4addrbar5addr

0x30

interruptline

2.QEMU的PCI總線QEMU在初始化硬件的時候,最開始的函數(shù)就是pc_init1。在這個函數(shù)里面會相繼的初始化CPU,中斷控制器,ISA總線,然后就要判斷是否需要支持PCI,如果支持則需調用i440fx_init初始化PCI總線。i440fx_init函數(shù)的主要參數(shù)是初始化好的ISA總線以及中斷控制器,返回值是PCI總線,初始化之后就可以將設備進行掛載。在Linux里面可以使用命令lspci-t來看PCI總線的結構圖。3.QEMU的PCI-PCI橋在QEMU中,所有的設備包括總線、橋、一般設備等都對應一個設備結構,通過register函數(shù)將所有的設備鏈接起來。在QEMU啟動的時候會初始化所有的QEMU設備,而對于PCI設備來說,QEMU在初始化以后還會進行一次RESET,將所有的PCIbar上的地址清空,然后進行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論