欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種虛擬機(jī)pci設(shè)備透傳方法和系統(tǒng)的制作方法_2

文檔序號:8942901閱讀:來源:國知局
實(shí)施例提供的技術(shù)方案可以看出,本發(fā)明實(shí)施例通過宿主機(jī)為虛擬機(jī)分配預(yù)留內(nèi)存;將虛擬機(jī)的待映射內(nèi)存和宿主機(jī)的預(yù)留內(nèi)存按照1:1建立映射關(guān)系;虛擬機(jī)中安裝驅(qū)動,申請?zhí)摂M機(jī)中固定內(nèi)存中的空閑內(nèi)存;加載PCI設(shè)備驅(qū)動,PCI設(shè)備根據(jù)所述映射關(guān)系發(fā)起DMA操作,直接訪問宿主機(jī)內(nèi)存。解決在沒有VT-d/1MMU的CPU主板上無法透傳PCI設(shè)備到QEMU/KVM虛擬機(jī)的問題,使PCI設(shè)備直接發(fā)起DMA操作,直接訪問宿主機(jī)內(nèi)存,這可以大大降低PCI設(shè)備透傳的成本,并為硬件選型提供更多選擇。
【附圖說明】
[0063]為了更清楚地說明本發(fā)明實(shí)施例的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0064]圖1為現(xiàn)有技術(shù)虛擬機(jī)物理內(nèi)存GPA到宿主機(jī)物理內(nèi)存HPA轉(zhuǎn)換圖;
[0065]圖2為現(xiàn)有的基于VT-d/1MMU的PCI設(shè)備透傳方案圖;
[0066]圖3為以Windows 7虛擬機(jī)為例虛擬機(jī)物理內(nèi)存GPA到宿主機(jī)物理內(nèi)存HPA轉(zhuǎn)換圖;
[0067]圖4為本發(fā)明的PCI設(shè)備透傳方案圖;
[0068]圖5為本發(fā)明實(shí)施例一提供的一種虛擬機(jī)PCI設(shè)備透傳方法的處理流程圖;
[0069]圖6為本發(fā)明實(shí)施例二提供的一種虛擬機(jī)PCI設(shè)備透傳系統(tǒng)的模塊圖。
【具體實(shí)施方式】
[0070]為便于對本發(fā)明實(shí)施例的理解,下面將結(jié)合附圖以幾個具體實(shí)施例為例做進(jìn)一步的解釋說明,且各個實(shí)施例并不構(gòu)成對本發(fā)明實(shí)施例的限定。
[0071]實(shí)施例一
[0072]首先在宿主機(jī)中需要采用標(biāo)識標(biāo)注預(yù)留內(nèi)存,比如在內(nèi)核的引導(dǎo)參數(shù)中加上:memmap = 1536M$512M ;
[0073]如附圖3所示,以Windows 7虛擬機(jī)為例,這樣就可以預(yù)留宿主機(jī)從512M開始之后的(512+1536)M的內(nèi)存;這樣宿主機(jī)就不會去使用這部分內(nèi)存,預(yù)留內(nèi)存用于與虛擬機(jī)建立映射關(guān)系。
[0074]該實(shí)施例提供了一種虛擬機(jī)PCI設(shè)備透傳方法的處理流程如圖5所示,包括如下的處理步驟:
[0075]步驟11、宿主機(jī)為虛擬機(jī)分配預(yù)留內(nèi)存;
[0076]可以是宿主機(jī)在QEMU中通過mmap/dev/mem為虛擬機(jī)分配預(yù)留內(nèi)存;
[0077]mmap是將一個文件或者其它對象映射進(jìn)內(nèi)存。文件被映射到多個頁上,如果文件的大小不是所有頁的大小之和,最后一個頁不被使用的空間將會清零。_ap必須以PAGE_SIZEO為單位進(jìn)行映射,而內(nèi)存也只能以頁為單位進(jìn)行映射。
[0078]具體地,Linux通過設(shè)備文件/dev/mem給用戶空間提供了直接訪問物理內(nèi)存的途徑。用戶空間的應(yīng)用程序可以通過mmap/dev/mem的方式將某一段物理內(nèi)存映射到自己的虛擬地址空間,這樣應(yīng)用程序就可以直接訪問那段物理內(nèi)存。
[0079]具體步驟如下:
[0080]宿主機(jī)使用open函數(shù)打開/dev/mem文件,獲取文件句柄;
[0081]將包括所述文件句柄的映射信息傳給mmap函數(shù),獲取預(yù)留內(nèi)存的虛擬地址;
[0082]通過所述虛擬地址訪問為虛擬機(jī)分配的預(yù)留內(nèi)存。
[0083]具體的,映射信息包括:所述文件句柄,以及需要映射的物理內(nèi)存段起始地址、長度、訪問權(quán)限等信息;將映射信息作為參數(shù)傳給mmap函數(shù),獲取預(yù)留內(nèi)存的虛擬地址,應(yīng)用程序可以用這個預(yù)留內(nèi)存的虛擬地址來對預(yù)留內(nèi)存進(jìn)行訪問。
[0084]此外,還可通過宿主機(jī)創(chuàng)建內(nèi)核模塊為虛擬機(jī)分配預(yù)留內(nèi)存,具體地:
[0085]宿主機(jī)創(chuàng)建內(nèi)核模塊,為所述內(nèi)核模塊建立mmap操作調(diào)用內(nèi)核的remap_pfn_range函數(shù)來做內(nèi)存映射;
[0086]用mknod命令為所述內(nèi)核模塊生成對應(yīng)的字符設(shè)備文件;
[0087]本實(shí)施例中采用/dev/_ap_mem作為字符設(shè)備文件,但并不局限于此。在本發(fā)明中,這個設(shè)備文件/dev/_ap_mem可以用來完全替代系統(tǒng)默認(rèn)的/dev/mem設(shè)備文件。
[0088]使用open函數(shù)打開/dev/mem文件,獲取文件句柄;
[0089]將包括所述文件句柄的映射信息傳給mmap函數(shù),獲取預(yù)留內(nèi)存的虛擬地址;
[0090]通過所述虛擬地址對預(yù)留內(nèi)存進(jìn)行訪問。
[0091]步驟12、將虛擬機(jī)的待映射內(nèi)存和宿主機(jī)的預(yù)留內(nèi)存按照1:1建立映射關(guān)系。
[0092]具體地,建立所述映射關(guān)系之前,調(diào)整虛擬機(jī)內(nèi)存布局,使所述待映射內(nèi)存在虛擬機(jī)中的物理內(nèi)存GPA和宿主機(jī)的物理內(nèi)存HPA保持一致。
[0093]如前所述,按照步驟11,通過11111^/(^/11161]1將5121到2048M這段物理內(nèi)存映射到qemu進(jìn)程的地址空間中,得到一個起始虛擬地址HVA ;
[0094]將這段內(nèi)存的起始虛擬地址HVA,虛擬機(jī)起始物理內(nèi)存GPA,以及大小等信息傳遞給內(nèi)核中KVM的系統(tǒng)調(diào)用。
[0095]KVM_SET_USER_MEMORY_REG1N,
[0096]就可以為虛擬機(jī)配置這段內(nèi)存,為了讓虛擬機(jī)物理內(nèi)存GPA和宿主機(jī)物理內(nèi)存HPAl:1對應(yīng),虛擬機(jī)起始物理內(nèi)存GPA必須等于宿主機(jī)起始物理內(nèi)存HPA,也就是512M。
[0097]步驟13、虛擬機(jī)中安裝驅(qū)動申請?zhí)摂M機(jī)中固定內(nèi)存中的空閑內(nèi)存;
[0098]在PCI設(shè)備驅(qū)動加載之前加載虛擬機(jī)中安裝的所述驅(qū)動。
[0099]固定內(nèi)存是指在虛擬機(jī)中被虛擬機(jī)操作系統(tǒng)占用的內(nèi)存,在固定內(nèi)存中,存在空閑內(nèi)存,以Windows 7虛擬機(jī)為例,如附圖3所示,假設(shè)它的0-2M之間的內(nèi)存為固定內(nèi)存,固定內(nèi)存不能用于建立虛擬機(jī)和宿主機(jī)的映射關(guān)系,只能以QEMU/KVM默認(rèn)的方式來分配這段內(nèi)存。虛擬機(jī)啟動后,固定內(nèi)存一部分被虛擬機(jī)操縱系統(tǒng)占用,還有一部分是空閑內(nèi)存,這部分空閑內(nèi)存就可能被透傳的PCI設(shè)備驅(qū)動申請到并用作DMA操作,造成內(nèi)存訪問錯誤,為了保證透傳的PCI設(shè)備驅(qū)動不會申請到這部分內(nèi)存,因此需要在虛擬機(jī)中安裝驅(qū)動申請?zhí)摂M機(jī)中固定內(nèi)存中的空閑內(nèi)存。
[0100]具體地:根據(jù)所述虛擬機(jī)的操作系統(tǒng)創(chuàng)建一個空的驅(qū)動,在所述驅(qū)動中加載的驅(qū)動函數(shù)里循環(huán)調(diào)用用于申請指定地址區(qū)間內(nèi)的物理內(nèi)存的函數(shù),直至將指定地址區(qū)間內(nèi)的物理內(nèi)存都申請完,結(jié)束循環(huán)。在本實(shí)施例中,指定地址區(qū)間內(nèi)的物理內(nèi)存是指固定內(nèi)存中的空閑內(nèi)存;但不限于此。
[0101]本實(shí)施例以Windows 7為例,但不限于在Windows 7中實(shí)現(xiàn),具體步驟如下:
[0102]創(chuàng)建一個空的Windows驅(qū)動;
[0103]在驅(qū)動中加載的驅(qū)動函數(shù)為DriverEntry,在DriverEntry中循環(huán)調(diào)用函數(shù)MmAllocateContiguousMemorySpecifyCache,本實(shí)施例中,MmAllocateContiguousMemorySpecifyCache用于申請指定地址區(qū)間內(nèi)的物理內(nèi)存的函數(shù),在此用來申請?zhí)摂M機(jī)中固定內(nèi)存中的空閑內(nèi)存,直到申請失敗為止,表示這個區(qū)間內(nèi)已經(jīng)沒有空閑內(nèi)存。對Windows 7虛擬機(jī)來說,這個區(qū)間指的是O到2M。
[0104]步驟14、加載PCI設(shè)備驅(qū)動,PCI設(shè)備根據(jù)所述映射關(guān)系發(fā)起DMA操作,直接訪問宿主機(jī)內(nèi)存。具體的PCI設(shè)備透傳方案圖如附圖4所示。
[0105]虛擬機(jī)的待映射內(nèi)存和宿主機(jī)的預(yù)留內(nèi)存按照1:1建立映射關(guān)系之后,PCI設(shè)備可以發(fā)起DMA操作,此時外設(shè)訪問內(nèi)存不再需要經(jīng)過1MMU轉(zhuǎn)換,而是直接訪問,由于GPA和HPA已建立了 1:1的映射關(guān)系,保證訪問的是正確的地址。
[0106]實(shí)施例二
[0107]該實(shí)施例提供了一種虛擬機(jī)PCI設(shè)備透傳系統(tǒng),其具體實(shí)現(xiàn)結(jié)構(gòu)如圖6所示,具體可以包括如下的模塊:
[0108]預(yù)留模塊21:其用于宿主機(jī)為虛擬機(jī)分配預(yù)留內(nèi)存;
[0109]映射模塊22:其用于將虛擬機(jī)的待映射內(nèi)存和宿主機(jī)的預(yù)留內(nèi)存按照1:1建立映射關(guān)系;
[0110]驅(qū)動模塊23:其用于在虛擬機(jī)中安裝驅(qū)動申請?zhí)摂M機(jī)中固定內(nèi)存中的空閑內(nèi)存;
[0111]透傳模塊24:其用于加載PCI設(shè)備驅(qū)動,PCI設(shè)備根據(jù)所述映射關(guān)系發(fā)起DMA操作,直接訪問宿主機(jī)內(nèi)存。
[0112]預(yù)留模塊21,包括:
[0113]第一預(yù)留模塊211:其用于使宿主機(jī)在QEMU中通過mmap/dev/mem為虛擬機(jī)分配所述預(yù)留內(nèi)存;或,
[0114]第二預(yù)留模塊212:其用于使宿主機(jī)創(chuàng)建內(nèi)核模塊為虛擬機(jī)分配所述預(yù)留內(nèi)存。
[0115]其中,第一預(yù)留模塊211,包括:
[0116]第一獲取組件2111:其用于使宿主機(jī)使用open函數(shù)打開/dev/mem文件,獲取文件句柄;
[0117]第一傳遞組件2112:其用于將包括所述文件句柄的映射信息傳給—ap函數(shù),獲取預(yù)留內(nèi)存的虛擬地址;
[0118]第一分配組件2113:其用于通過所述虛擬地址訪問為虛擬機(jī)分配的預(yù)留內(nèi)存。
[0119]其中,第二預(yù)留模塊212,包括:
[0120]創(chuàng)建組件2121:其用于使宿主機(jī)創(chuàng)建內(nèi)核模塊,為所述內(nèi)核模塊建立_ap操作調(diào)用內(nèi)核的remap_pfn
當(dāng)前第2頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
博兴县| 桐城市| 伊川县| 周口市| 珲春市| 通化县| 丹寨县| 长岭县| 准格尔旗| 海城市| 汝城县| 石河子市| 古蔺县| 灵寿县| 上杭县| 临清市| 鄂州市| 娱乐| 武隆县| 汉源县| 十堰市| 安国市| 东乡族自治县| 如皋市| 平塘县| 边坝县| 于田县| 搜索| 司法| 南岸区| 武鸣县| 罗田县| 教育| 松滋市| 内丘县| 胶州市| 马山县| 德兴市| 兴宁市| 安阳县| 临泉县|