一種虛擬機pci設備透傳方法和系統的制作方法
【技術領域】
[0001]本發明涉及媒體通信技術領域,尤其涉及一種虛擬機PCI設備透傳方法和系統。
【背景技術】
[0002]隨著QEMU/KVM虛擬化技術應用越來越廣泛,在許多場合,模擬的USB、顯卡、網卡等外設不管在性能還是功能上都已經不能滿足日益增長的需求。比如圖形工作站對顯卡的性能要求很高,而QEMU(Quick Emulator)模擬的顯卡不能做硬件加速,根本無法滿足要求。解決這個問題常用的一種辦法是把宿主機上的PCI設備(比如顯卡)直接分配給某個虛擬機使用,這種技術叫PCI設備透傳,它很好地解決了虛擬環境下外設的性能問題。
[0003]現有PCI (Peripheral Component Interconnect)外設互聯設備透傳方案都是基于英特爾 VT_d(Intel Virtualizat1n Technology for Directed 1/0)或者1MMU (input/output memory management unit)來實現。支持 VT_d 或 1MMU 的 CPU 和主板成本普遍較高,而且相當一部分CPU和主板并不支持這項技術,給硬件選型帶來較大困難。在 QEMU(Quick Emulator)/KVM(Kernel Virtual Machine)虛擬機中實現 PCI 設備透傳,需要處理好以下四個方面的問題:
[0004]1.PCI配置空間映射;
[0005]2.PCI內存及1/0資源映射;
[0006]3.PCI IRQ 中斷映射;
[0007]4.DMA (直接內存訪問)操作。
[0008]對前兩個問題,可以直接將宿主機中該PCI設備對應的資源文件用_ap方式直接映射到虛擬機地址空間中即可。對于第3個問題,可以在內核中使用一個內核線程來截獲中斷,然后將中斷注入到虛擬機中。已有的各種實現在這三點上也已經比較成熟。
[0009]但是對于PCI透傳設備的DMA操作是PCI設備透傳的一個難點。
[0010]從附圖1可以看到QEMU/KVM中,從虛擬機物理內存GPA到宿主機物理內存HPA需要經過兩層轉換:一次線性映射和一次MMU映射,才能找到對應的宿主機物理內存ΗΡΑ。這造成的結果是GPA和HPA幾乎不可能是1:1對應的。
[0011]虛擬機vCPU在訪問內存時,一樣存在這個地址轉換的問題,它通過擴展頁表(EPT)技術從硬件層面上透明的將GPA轉換到ΗΡΑ。
[0012]而PCI透傳設備的直接內存存取DMA (Direct Memory Access)操作沒有EPT的支持。虛擬機的設備驅動申請到的DMA內存是虛擬機的物理內存GPA,它通過寫該設備的特定寄存器將這段內存的起始地址和大小告知該設備,然后該設備就會用這個地址GPA直接去訪問宿主機的物理內存,只有GPA和HPA是1:1對應的情況下,透傳的PCI設備才能訪問到正確的地址,否則就會產生錯誤。現有的PCI設備透傳方案都是基于VT-d/10MMU技術來解決這個問題,如附圖2所示。
[0013]VT-d和1MMU是類似的10硬件虛擬化技術,VT_d屬于Intel,1MMU則屬于AMD。這項技術的作用和EPT類似,都是用來將GPA轉換為HPA,但服務對象是外設,而不是vCPU。
[0014]VT-d/1MMU技術的原理是在外設和宿主機物理內存中間插入了一個1MMU硬件單元,在虛擬化環境中,透傳的PCI設備發起DMA操作時,GPA經過1MMU轉換后,變成正確的HPA。1MMU的地址轉換表由QEMU/KVM在虛擬機初始化時建立。
[0015]上述現有技術中的的缺點為:
[0016]1.虛擬化成本高。支持VT-d或1MMU的CPU或主板普遍成本較高。
[0017]2.硬件選型比較困難。相當一部分CPU和主板并不支持VT-d或10MMU。
[0018]3.雖然1MMU硬件地址轉換效率很高,但因為多了一次內存地址轉換,對性能不可避免會有一定的影響。
【發明內容】
[0019]本發明的實施例提供了一種虛擬機PCI設備透傳方法和系統,本發明提供了如下方案:
[0020]宿主機為虛擬機分配預留內存;
[0021]將虛擬機的待映射內存和宿主機的預留內存按照1:1建立映射關系;
[0022]虛擬機中安裝驅動申請虛擬機中固定內存中的空閑內存;
[0023]加載PCI設備驅動,PCI設備根據所述映射關系發起DMA操作,直接訪問宿主機內存。
[0024]根據本發明的上述方法,所述宿主機為虛擬機分配預留內存包括:
[0025]宿主機在QEMU中通過_ap/dev/mem為虛擬機分配所述預留內存;或,
[0026]宿主機創建內核模塊為虛擬機分配所述預留內存。
[0027]根據本發明的上述方法,所述宿主機在QEMU中通過_ap/dev/mem為虛擬機分配所述預留內存,包括:
[0028]宿主機使用open函數打開/dev/mem文件,獲取文件句柄;
[0029]將包括所述文件句柄的映射信息傳給mmap函數,獲取預留內存的虛擬地址;
[0030]通過所述虛擬地址訪問為虛擬機分配的預留內存。
[0031]根據本發明的上述方法,所述宿主機創建內核模塊為虛擬機分配所述預留內存,包括:
[0032]宿主機創建內核模塊,為所述內核模塊建立_ap操作調用內核的remap_pfn_range函數來做內存映射;
[0033]用mknod命令為所述內核模塊生成對應的字符設備文件;
[0034]使用open函數打開/dev/mem文件,獲取文件句柄;
[0035]將包括所述文件句柄的映射信息傳給mmap函數,獲取預留內存的虛擬地址;
[0036]通過所述虛擬地址訪問為虛擬機分配的預留內存。
[0037]根據本發明的上述方法,所述虛擬機中安裝驅動申請虛擬機中固定內存中的空閑內存包括,根據所述虛擬機的操作系統創建一個空的驅動,在所述驅動中加載的驅動函數里循環調用用于申請指定地址區間內的物理內存的函數,直至將指定地址區間內的物理內存都申請完,結束循環。
[0038]根據本發明的上述方法,還包括,在PCI設備驅動加載之前加載虛擬機中安裝的所述驅動。
[0039]根據本發明的上述方法,建立所述映射關系之前,包括:調整虛擬機內存布局,使所述待映射內存在虛擬中的物理內存GPA和宿主機的物理內存HPA保持一致。
[0040]根據本發明的另一方面,還提供一種虛擬機PCI設備透傳系統,包括:
[0041]預留模塊:其用于宿主機為虛擬機分配預留內存;
[0042]映射模塊:其用于將虛擬機的待映射內存和宿主機的預留內存按照1:1建立映射關系;
[0043]驅動模塊:其用于在虛擬機中安裝驅動申請虛擬機中固定內存中的空閑內存;
[0044]透傳模塊:其用于加載PCI設備驅動,PCI設備根據所述映射關系發起DMA操作,直接訪問宿主機內存。
[0045]根據本發明的另一方面,所述預留模塊,包括:
[0046]第一預留模塊:其用于使宿主機在QEMU中通過_ap/dev/mem為虛擬機分配所述預留內存;或,
[0047]第二預留模塊:其用于使宿主機創建內核模塊為虛擬機分配所述預留內存。
[0048]根據本發明的另一方面,所述第一預留模塊,包括:
[0049]第一獲取組件:其用于使宿主機使用open函數打開/dev/mem文件,獲取文件句柄;
[0050]第一傳遞組件:其用于將包括所述文件句柄的映射信息傳給_ap函數,獲取預留內存的虛擬地址;
[0051]第一分配組件:其用于通過所述虛擬地址訪問為虛擬機分配的預留內存。
[0052]根據本發明的另一方面,所述第二預留模塊,包括:
[0053]創建組件:其用于使宿主機創建內核模塊,為所述內核模塊建立mmap操作調用內核的remap_pfn_range函數來做內存映射;
[0054]生成組件:其用于用mknod命令為所述內核模塊生成對應的字符設備文件;
[0055]第二獲取組件:其用于使用open函數打開/dev/mem文件,獲取文件句柄;
[0056]第二傳遞組件:其用于將包括所述文件句柄的映射信息傳給_ap函數,獲取預留內存的虛擬地址;
[0057]第二分配組件:其用于通過所述虛擬地址訪問為虛擬機分配的預留內存。
[0058]根據本發明的另一方面,所述驅動模塊,包括:
[0059]驅動組件:其用于根據所述虛擬機的操作系統創建一個空的驅動,在所述驅動中加載的驅動函數里循環調用用于申請指定地址區間內的物理內存的函數,直至將指定地址區間內的物理內存都申請完,結束循環。
[0060]根據本發明的另一方面,還包括:加載組件:其用于在PCI設備驅動加載之前加載虛擬機中安裝的所述驅動。
[0061]根據本發明的另一方面,還包括:調整組件:其用于建立所述映射關系之前,調整虛擬機內存布局,使所述待映射內存在虛擬中的物理內存GPA和宿主機的物理內存HPA保持一致。
[0062]由上述本發明的