1 概述
隨著虛擬化技術研究的深入,系統虛擬化技術已在X86體系架構上獲得了很好的發展,在企業計算、災難恢復、分布式計算、桌面虛擬化領域均得到了廣泛應用。在信息安全領域,因系統虛擬化層介于硬件平臺與用戶操作系統之間,其特有的客戶機操作系統監控和隔離作用,使得系統虛擬化技術不僅可以用于服務器端實現資源整合與管理功能,也可以增強以操作系統安全為核心的用戶終端系統的安全性,因此,虛擬化技術在信息安全領域也備受關注。在國內,系統虛擬技術在信息安全領域的技術研究開展得比較多,目前在硬件資源訪問控制、操作系統惡意行為監控、隱藏進程檢測等方面已有相關的研究。主要的思路是在虛擬機監控器(Virtual Machine Monitor,VMM)中構筑一系列的安全防護措施,強化對客戶機操作系統的安全監控與管理,但此類技術的應用研究目前還處于起步階段,尚無完整的應用實現方案。
本文借鑒國內外當前相關技術的研究成果,結合個人終端操作系統安全防護實際需求,提出了一種適用于個人終端計算機、基于虛擬技術的操作系統安全增強模型。根據該模型在終端安全領域應用推廣中將會面臨的顯卡性能問題,提出一種提高虛擬機顯示性能的顯卡透傳技術,并基于KVM虛擬機研究了顯卡透傳技術的具體實現。
2 操作系統安全增強模型
在個人終端操作系統安全增強方面,需要做到既能維護系統的安全性,又需要保證系統的易用性和高效性。根據這個需求特點,通過改造現有虛擬機體系結構,提出個人終端操作系統安全增強模型。傳統系統虛擬化體系模型如圖1所示,改造后的操作系統安全增強模型體系結構如圖2所示。
圖1 傳統系統虛擬化體系模型
圖2 基于虛擬化技術的操作系統安全增強模型
在基于虛擬技術的個人終端操作系統安全增強模型上,一臺PC機只運行一個獨立的虛擬客戶機操作系統,該系統對于用戶來說就是普通的用戶操作系統。虛擬機監控器則成為安全監控器,負責根據訪問策略隔離與控制客戶機操作系統對硬件資源的訪問權限,可以根據安全性需要將不存在安全隱患的硬件(顯卡、聲卡、鍵盤、鼠標等)透傳給客戶機操作系統直接控制,對存在安全隱患的硬件資源(如網卡、USB端口)進行虛擬,在虛擬層實施訪問過濾等檢測措施確保訪問安全;同時通過在虛擬化層實現進一步的惡意行為檢測、隱藏進程檢測等安全模塊,對客戶機操作系統各種惡意行為進行監控。
相比于通用虛擬機體系結構,這種安全模型中虛擬機監控器的主要職能不再是多虛擬環境的調度與切換,而轉變為對單一虛擬機的安全監視功能,簡化了傳統系統虛擬化體系結構的復雜性,增強了操作系統安全性控制功能。
這種安全模型的推廣應用,要求虛擬機下的客戶機操作系統應具備與運行于真實主機上的操作系統相同或相近的性能與通用性,否則終端用戶無法接受因安全增強而帶來的性能或易用性方面的損失。自2005年Intel和AMD公司分別發布了支持虛擬化技術(Virtualization Technology,VT)的CPU以來,基于支持VT技術的CPU虛擬化技術已經讓虛擬機處理性能產生了質的提升,能夠達到真實主機性能的95%以上,CPU處理性能已經不再是虛擬化技術在終端安全領域發展的絆腳石。而顯卡顯示性能問題則成為當前虛擬化技術在終端安全領域發展的關鍵問題,當前國外主流的虛擬機軟件都沒能很好地解決顯卡虛擬化問題,虛擬機的圖形顯示處理能力只相當于當年的386時代的水平,這使得虛擬機中的客戶機操作系統不能運行一些對圖形處理能力要求高的應用,這種安全模型的進一步發展存在著較大障礙。將基于KVM虛擬機研究實現提升客戶機操作系統顯示性能的具體實現方法,本文的研究主要是基于KVM虛擬機進行的,但相關技術原理具有普適性,也可在其他開源虛擬機上得到實現。
3 KVM虛擬機
當前,主流的商業虛擬機有VMware和VirutalPC,開源虛擬機有Xen、Qemu、Bochs、KVM等。KVM(Kernel-basedVirtual Machine)是一個基于Linux內核、依賴CPU硬件虛擬化技術(如Intel或AMDVT技術)的開源系統虛擬化模塊。KVM虛擬機的體系架構如圖3所示,VMM虛擬機監控器借助于Linux操作系統的內核實現。
圖3 KVM虛擬機原理
KVM虛擬機支持PCI透傳技術,可以實現將PCI硬件資源直接映射到虛擬機的客戶操作系統中,客戶操作系統可以直接驅動真實的標準PCI物理設備以獲得高速物理資源訪問。但KVM虛擬機支持PCI透傳技術還必須依賴于硬件平臺支持Intel或AMD的VT-d/IOMMU技術。VT-d/IOMMU技術在服務器虛擬化中對I/O虛擬化具有重要作用,但在終端用戶的操作系統安全增強模型中卻并不重要。此外,VT-d/IOMMU技術主要面向服務器設計,普通PC機上支持不多。因此,在基于KVM虛擬機的操作系統安全加固模型中實現顯卡透傳主要有2個方面的研究工作:(1)研究在不支持VT-d/IOMMU技術的硬件平臺上實現PCI透傳的方法;(2)實現對顯卡這種特殊的PCI設備在虛擬機中的直接分配。
4 直接地址映射技術
4.1 基本原理
在虛擬機中實現PCI透傳,需要處理好4個方面的問題:(1)PCI配置空間映射;(2)PCI內存及I/O資源映射;(3)PCIIRQ中斷映射;(4)DMA(直接內存訪問)處理。
在通常情況下,對于標準PCI設備,前3個方面的處理均可以通過虛擬機相應的軟件映射機制實現,而對客戶機操作系統的物理硬件DMA的處理則是現有的虛擬方式下難以用軟件實現的,這與DMA本身的技術機制有關。
DMA是外設與系統進行高速數據傳輸的技術,外設可以不經過CPU直接進行內存讀寫訪問,傳輸數據高效。在DMA傳輸時驅動需要申請一個可被DMA訪問的地址空間,然后告訴外設可進行DMA傳輸的內存物理地址。這種方式在物理主機上沒有任何問題,操作系統會保證分配給驅動的地址空間獨立性。但在虛擬機上,因采用影子頁表機制實現多個客戶機物理地址到主機物理地址的映射,驅動從系統中獲取的物理地址實際上是經過虛擬機轉換后的客戶機物理地址(GPA),并非對應真實的主機物理地址(HPA)。如果外設直接存取該地址的數據必然導致系統崩潰或造成安全隱患。Intel的VT-d和AMD的IOMMU技術則是從硬件層面解決DMA處理問題的有效辦法。
與CPU上的Intel VT-x 技術一樣,VT-d(VirtualizationTechnology for Directed I/O)技術是一種基于北橋芯片的硬件輔助虛擬化技術,通過在北橋中內置提供DMA虛擬化和IRQ虛擬化硬件,實現了新型的I/O虛擬化方式。運用VT-d技術,虛擬機得以使用直接I/O設備分配方式或者I/O設備共享方式實現PCI設備透傳,從而大幅提升了虛擬化的I/O性能。AMD與之類似的技術稱為SVMIOMMU。
Intel的VT-d和AMD的IOMMU技術支持DMA虛擬化的主要原理是由硬件維護一張DMA重映射表,當外設對某個物理地址進行DMA操作時,自動查找映射表,將操作地址映射為虛擬機內GPA對應的真實HPA,以避免錯誤的內存地址操作。該技術具有通用性,可以支持多個虛擬機同時進行物理設備透傳,且互相不影響,但需要有主板芯片組支持才能使用,對硬件依賴性較高,KVM虛擬機已支持基于VT-d技術的PCI設備透傳。但在終端操作系統安全加固模型中,不需要對多虛擬機同時進行物理設備透傳,因此,并不需要維護一張一對多的DMA重映射表,只需要處理好GPA等于HPA的問題,即可有效確保硬件對DMA地址處理的合法性,使得虛擬機對物理硬件具有與真實主機一致的效果。本文針對DMA處理問題,提出了虛擬機與物理主機直接地址映射技術的解決方案。
4.2 實現方式
直接地址映射是通過將真實系統中低地址內存直接分配給虛擬機使用,直接讓虛擬機的GPA對應主機HPA的技術。直接地址映射技術可以不需要任何硬件輔助,做到DMA訪問的物理地址內存與主機一致。但該技術的缺點是,一個主機系統中只能同時運行一個進行物理設備透傳的虛擬機,多個虛擬機同時進行物理設備透傳則會造成地址沖突。
KVM是基于Linux操作系統運行的。實現直接地址映射的先決條件是需要Linux操作系統在啟動時將低地址內存空間預留出來。為保證體系兼容,X86架構下的低1MB內存空間在操作系統初始化前就已預留給實模式中斷向量表、BIOS數據、顯存等使用,不能在Linux上預留這部分空間,只能從1MB以上的空間開始預留。對于2.6內核,有一個PHYSICAL_START變量設置系統啟動時內核加載地址,缺省指向地址0x100000(1MB)處,可以修改為更大的值讓系統在啟動時空出1MB到PHYSICAL_START地址之間的內存空間,然后將這部分空間標記為預留,以避免操作系統啟動后占用這部分空間。
從操作系統層面預留的這部分空間是無法直接在應用層直接使用的,目前通過Linux下/dev/mem設備文件直接將預留內存映射到應用層QEMU為虛擬機分配的內存空間中,映射時需注意確保HPA與GPA的對應。而對于虛擬機的其他內存空間,無需與物理地址對應,依然采用影子頁表機制將虛擬機內存地址映射為Linux分配給QEMU的內存空間中。具體映射關系如圖4所示。從圖中可以看出,在成功實現內存映射后,客戶機操作系統所使用的內存實際對應到了主機的真實內存部分,映射時確保了地址的一一對應。而虛擬機前640KB內存空間均由QEMU進行虛擬,占用的是Linux操作系統的內存空間。考慮到運行態主機的VGABIOS內存空間存儲的是被修改過的BIOS代碼,因此,虛擬機中VGABIOS內存空間均由QEMU進行虛擬,也占用的是Linux操作系統的內存空間。
圖4 直接地址映射下虛擬機內存與物理內存的對應關系
5 顯卡直接分配
從KVM虛擬機結構中可以看出,如果虛擬機需要訪問QEMU模擬出的外設,則需要通過多次處理,才能夠將數據真正傳遞給真實硬件設備處理。這對于普通低速接口的硬件外設訪問來說虛擬化處理開銷還容易接受,但對于顯卡虛擬化來說性能問題將顯得尤其突出。因此,采用顯卡直接分配技術將物理顯卡單獨分配給一個虛擬機獨占訪問,使虛擬機上的客戶端操作系統直接驅動物理顯卡,進行MMIO訪問和DMA操作,是一個在虛擬環境中獲得高質量圖形顯示效果的有效解決方案。圖5是顯卡直接分配技術與QEMU直接虛擬外設的處理對比。從圖中可以看出,顯卡直接分配給虛擬機的客戶操作系統還可以使得客戶機操作系統充分利用物理顯卡原始驅動實現顯卡效能的最大化發揮。
開源的KVM虛擬機目前已經支持對標準PCI設備的直接透傳(需要硬件具備I/O虛擬化能力,即需要硬件對VT-d或IOMMU技術的支持),但還沒能夠支持顯卡的直接透傳。主要有2個方面原因:(1)因歷史遺留問題,X86體系架構下的顯卡設備為實現兼容,留下了一些不同于標準PCI設備的內存和I/O端口;(2)因顯卡自身高速處理需要,各顯卡廠商可能會有一些特別的設計(如獨立顯存和共享顯存的設計、特殊訪問接口等),針對顯卡不能完全像標準PCI設備一樣簡單地實現設備直接透傳。
圖5 顯卡直接分配與QEMU虛擬外設技術對比
借鑒XEN虛擬機下基于VT-d技術的顯卡直接分配技術,解決了KVM基于直接地址映射技術的顯卡設備直接分配難題。在KVM中實現顯卡直接分配,需要解決好顯卡在虛擬機總線中的注冊、PCI配置空間虛擬、顯卡資源(顯存及I/O地址)映射、VGABIOS調用、DMA映射等一系列問題。
5.1顯卡在KVM虛擬機中的注冊
KVM使用QEMU用戶態進程虛擬外設,顯卡如果在虛擬機中使用必須首先在QEMU中注冊為一個稱為pci-assign的特殊qdev虛擬設備。pci-assign虛擬設備是QEMU中專門為PCI透傳定義的虛擬設備類型,每一個被透傳到虛擬機中的PCI設備都會被注冊為一個pci-assign虛擬設備,客戶機操作系統對該虛擬設備進行的MMIO訪問等操作都被直接轉發到對應的真實物理設備上。該功能的實現已經在QEMU-KVM源代碼中包含,只需要在啟動KVM時通過命令行指定要映射的PCI設備BDF號(總線號、設備號、功能號)即可實現將該設備注冊到虛擬機中。
但是作為顯卡設備,僅注冊為pci-assign虛擬設備并不能完全將顯卡啟用,虛擬機中能夠從PCI資源中看到該顯卡,但是顯卡依然無法工作,還需要進一步完成后續的工作。
5.2 顯卡專用總線的注冊
因為性能需要,X86架構下大部分平臺都將物理顯卡掛接在獨立的一根PCI總線(總線1或總線2)上,有些廠商的顯卡驅動會對顯卡BDF號進行檢測,如果顯卡在物理主機上的BDF號與虛擬機中注冊的BDF號不一致,將無法正確驅動顯卡(筆者實驗用的NVIDIA Geforce G205M顯卡就存在這個問題)。因此,為確保顯卡直接分配技術在各類顯卡中能夠通用,需要在注冊顯卡到虛擬機中時確保顯卡在虛擬機中的BDF號與真實機器的BDF號保持一致。
QEMU中缺省只虛擬了一條PCI總線(總線0),虛擬的磁盤控制器、CD-ROM驅動器、網卡、顯卡、聲卡等設備都注冊在這條總線上。為滿足顯卡直接分配的需要,要修改QEMU源碼多注冊2條PCI總線。利用QEMU中已實現的虛擬PCI橋設備,在虛擬機系統總線初始化時注冊2個QEMUDEC21154虛擬PCI橋設備,創建了總線1和總線2。然后修改QEMU注冊PCI設備的實現方式,指定將透傳顯卡設備按照其真實主機上BDF相同的總線號、設備號、功能號進行一一對應的注冊。這樣就實現了顯卡在虛擬機中與在真實主機上具有相同的BDF,以使得顯卡驅動能夠直接驅動顯卡。
5.3顯卡資源直接映射
自第1臺IBMPC問世以后,顯卡經歷了MDA、MonoHercults、CGA、EGA、VGA、XGA、SVGA等標準,總線也由ISA、EISA、VESA、PCI、AGP直到現在的PCIE,前后共約30年的進程。雖然很多硬件都漸漸湮沒在歷史的洪流中,但是由于兼容性需要,一些內存或I/O端口還是作為歷史遺留資源在X86硬件體系中保留了下來。
在Intel制定PCI總線標準時,在PCI空間保留了從0開始連續1MB的Memory空間,和從0開始連續64KB的I/O空間,其中給顯卡預留的空間如表1所示。
表1 PCI顯卡歷史遺留資源
在PC機啟動時,BIOS程序會掃描整個PCI空間,發現有PCI顯卡時,會使能它的Mem訪問和I/O訪問,同時配置它的內存空間和I/O空間。但是上文提到的那2塊保留的內存空間和I/O空間是不需要作專門配置的,PCI顯卡可以直接響應落在這2段空間上的PCI訪問請求。
進行顯卡透傳時必須將物理主機特殊的預留內存和I/O地址空間直接映射到虛擬機對應的地址空間中,以保證顯卡初始顯示。對于0xA0000~0xBFFFF內存空間向虛擬機的映射,借助Linux下特有的/dev/mem設備實現,通過/dev/mem設備可以訪問到整個PC的全部物理內存。修改QEMU源代碼,在分配了虛擬機的內存后(得到一個應用層地址空間的虛地址),直接打開/dev/mem設備,將地址0xA0000到0xBFFFF內存使用mmap方式直接映射到QEMU虛擬機的內存空間對應偏移地址處。
對于I/O端口0x3B0~0x3DF的映射,可直接向QEMU中注冊I/O讀寫函數,該函數從應用層空間上轉發對應的讀寫操作到真實主機的I/O端口上。
除歷史遺留資源外,各種顯卡還有其特有的內存和I/O資源,需要將這些資源都映射進虛擬機中。
Linux下的SYSFS系統提供了一種從應用層訪問內核資源的簡單途徑。所有的PCI設備資源在系統初始化時都自動映射成/sys/bus/pci目錄下的文件,應用層如果訪問這些資源可直接打開文件將其mmap到內存中,對映射內存的讀寫操作都會傳送到PCI設備的內存空間中。在注冊物理顯卡到虛擬機時,需要將對應的顯卡資源也映射到虛擬機的地址空間中去。
5.4 顯卡的PCI配置空間
在實現顯卡直接分配時,最重要的是顯卡的PCI配置空間虛擬化。PCI配置空間是用來動態配置PCI設備資源占用的一組寄存器,每個PCI設備都有自己獨立的配置空間,在系統初始化時,由BIOS(也可在操作系統中配置)根據一定的算法分配PCI設備所占有的資源,并將資源信息寫入PCI設備配置空間。
PCI總線規范定義的配置空間總長度為256Byte,配置信息按一定的順序和大小依次存放。前64Byte的配置空間稱為配置頭,對于所有的設備都一樣。配置頭的主要功能是用來識別設備、定義主機訪問PCI卡的方式(I/O訪問或者存儲器訪問,還有中斷信息)。其余的192Byte稱為本地配置空間,主要定義卡上中斷、I/O端口資源、內存基地址及范圍等信息。PCI配置空間中基地址寄存器(Base Address Registers,BAR)就是用于配置PCI設備在系統中占用的I/O及內存地址及范圍的寄存器。
對于普通PCI設備,可以直接虛擬PCI配置空間,由KVM虛擬機的BIOS在啟動時重新配置該空間中的BAR和中斷號等信息。但有些廠商的顯卡則必須實現虛擬機里基地址寄存器值等于物理設備上基地址寄存器的值(VBAR=PBAR),原廠驅動才能夠正確驅動顯卡。因此,為保證顯卡透傳功能的通用性,針對顯卡都采用VBAR=PBAR的映射方式。這需要為顯卡透傳專門修改虛擬機BIOS,使得其在開機初始化時針對顯卡保留其與PBAR一致的虛擬機I/O及內存資源。
針對顯卡的透傳修改QEMU代碼,在注冊pci-assign虛擬設備時將設備真實PCI配置空間內容完整復制到虛擬配置空間。然后修改SeaBIOS(KVM虛擬機使用的BIOS)中PCI設備探測與資源分配部分的代碼,在虛擬機SeaBIOS設置顯卡各配置寄存器時,首先讀取虛擬配置空間中的真實設備配置信息,優先為顯卡分配虛擬機硬件資源,確保被透傳的顯卡與真實顯卡保持一致的基地址寄存器配置信息。對于顯卡中斷等配置則可以根據需要由虛擬機進行映射轉換,中斷號的虛擬不影響顯卡透傳。
5.5 VGA BIOS系統
顯卡也具有與主板上一樣的基本輸入輸出系統(BIOS),稱為VGABIOS。當系統加電啟動時,主板BIOS會尋找到顯卡,復制顯卡中的VGABIOS到系統預留VGA BIOS專用內存空間中(地址0xC0000~0xCFFFF),并調用VGA BIOS初始化顯卡。
每種顯卡都有自己專用的VGA BIOS,存儲在顯卡ROM存儲區或主板BIOS中。如果需要在虛擬機中初始化顯卡,則必須在虛擬機BIOS中重新調用VGA BIOS。因此,需要提取VGA BIOS文件給虛擬機,由虛擬機啟動時將該VGABIOS代碼復制到VGA BIOS專用內存空間中執行顯卡的初始化。
顯卡VGA BIOS的提取有很多種方式,具體如何提取需要視主板或顯卡情況而定。大部分顯卡的VGA BIOS可以用工具從內存中提取(如AFLASH、GPU-Z等)。但有些顯卡,如NVIDIA顯卡,在VGA BIOS執行時會自動修改自己在內存中的部分代碼,直接提取到的VGA BIOS無法用來初始化顯卡。筆記本電腦集成的顯卡通常都會將顯卡BIOS集成到主板BIOS中,可以通過提取主板BIOS,分析出顯卡BIOS存儲位置,提取對應的VGA BIOS。
5.6 DMA映射
顯卡的DMA映射問題,采用直接地址映射技術解決,通過修改Linux操作系統內核,預留從0x0x100000(1MB)地址開始的物理內存空間,直接映射給客戶機操作系統使用,解決了客戶機操作系統下直接對顯卡DMA的處理。
6 結束語
虛擬機顯卡透傳技術解決了虛擬客戶機操作系統圖形顯示效果差的難題。在終端安全領域,顯卡透傳技術通過客戶機操作系統直接驅動物理顯卡獲得高質量顯示效果,使得虛擬機中的客戶操作系統具有更普遍的適應性,能夠滿足普通用戶的使用需求,為基于全系統虛擬化技術的操作系統安全增強、進程控制、病毒防護等技術的研究成果更進一步地拓展了實用空間。
由于時間和能力所限,本文研究成果主要適用于當前主流的獨立顯存的顯卡,對于一些特殊顯卡或共享顯存的集成顯卡還會有些特殊處理,這里不再詳述。通過在華碩K40IP筆記本電腦(支持VT-x,不支持VT-d)上驗證,主機向客戶機操作系統直接分配NVIDIA G205M顯卡,并安裝原廠驅動進行測試,測試證明虛擬機操作系統的顯示效果得到質的提升,獲得了和主機顯示完全接近的效果。
核心關注:拓步ERP系統平臺是覆蓋了眾多的業務領域、行業應用,蘊涵了豐富的ERP管理思想,集成了ERP軟件業務管理理念,功能涉及供應鏈、成本、制造、CRM、HR等眾多業務領域的管理,全面涵蓋了企業關注ERP管理系統的核心領域,是眾多中小企業信息化建設首選的ERP管理軟件信賴品牌。
轉載請注明出處:拓步ERP資訊網http://www.lukmueng.com/
本文標題:基于虛擬化的系統安全增強及顯卡透傳研究