在VM中使用kvm嵌套虚拟化kvm虚拟化,在硬件中CPU只能选择kvm32,选择kvm64就启动不了了。

  1. 檢查 CPU 是否支援虛擬化。

  2. 確認機器是否支援 EPT。N 代表不支援。

  3. 運行虛擬機。注意! 可以觀察到虛擬機啟動時,只有看到 QEMU。QEMU 在開啟 KVM 的情況下,直接將客戶機代碼運行在宿主機的 CPU 上。其餘部分諸如客戶機物理內存分配,或是 IO 模擬均跟不開啟 KVM 的情況一樣。

  4.  
    • 輸出內容類似底下這樣。

KVM 初始化概觀請見 。

強烈建議閱讀 和 一文。KVM 和

  1. ) 負責處理對 KVM fd 下達的命令。

  2. ) 負責處理對 VM fd 下達的命令。

    •  
       
       
       
    • // 在此以軟體模擬。

  1. 不同平台有不同的初始入口,呼叫

    註冊平台特定的回調函式。以 VMX 為例,

    • 不同平台對 KVM 有不同的初始化。

    • 函式,設置 VMCS 並做相關硬體檢測。

    • /* 設定使用何種硬體加速 */

  • 每一個實體 CPU 皆可綁定一個 VMCS。

  1.  
     
     
     
     
     

QEMU (用戶態) 針對 VCPU 發起 KVM_RUN 命令,KVM (內核態) 處理該命令,並切至非根模式運行客戶機。

  1. ) 處理針對 VCPU 發起的命令。

  2. // 檢查 VCPU 是否有待處理的事件。 // 載入客戶機頁表。 // 進入非根模式,運行客戶機。
    • 前綴代表它是用來存取共享資料的版本。

  3. ) 載入必要的客戶機狀態,並發起 VMEntry 切換至客戶機模式

    // 硬體並不會將所有客戶機暫存器載入至 CPU,部分交由 KVM 處理。 // 返回根模式內核態。
    • 針對各種 VMExit 的來源定義對應的處理函式。

      • // 跳過此條已被處理過的 (客戶機) INVLPG,將客戶機 eip 指向下一條指令。
      • // 依情況不同有不同實現方式。

處於非根模式的 CPU 在執行特定指令時,會返回 KVM。客戶機作業系統亦可主動透過 VMCALL 返回 KVM 。

早期 VT-x 版本無法正確處理實模式的指令,因此需跳回至 KVM 模擬。此外,MMIO 也需要交由 KVM 模擬 。

作業系統創建頁表,由硬體搜尋頁表作位址轉換,同時以 TLB (硬體) 作快取。作業系統和硬體一同協作以維護頁表和 TLB 內容的一致性。內存虛擬化需要經過底下兩層位址轉換:

  • 由客戶機作業系統透過頁表作轉換,即傳統做法

影子頁表用來加速位址轉換 (GVA → HPA)。當客戶機作業系統修改頁表時,影子頁表也需要修改。這屬於軟體上的加速。請見 第 7 頁。硬體 CR3 指向的是影子頁表。硬體支援的內存虛擬化即是多加一個擴展頁表,並由硬體來實現另一次轉換。當客戶機作業系統查找頁表時 (GVA → GPA),硬體同時會查找擴展頁表 (GPA → HPA)。頁表和擴展頁表分別由客戶機作業系統和 VMM 創建,皆由硬體負責查找。請見 第 10 頁。 在 VMCS 裡,會分別存放客戶機和宿主機的狀態。一般的硬體 CR3 是載入客戶機 CR3 的值,EPT CR3 載入的是與其相對應頁表的值。

一文。基於軟體實現的內存虛擬化,一般稱為影子頁表 (shadow page table)。針對客戶機中的頁表,VMM 內部皆有一份對應的影子頁表 (GVA → HPA),硬體 CR3 指向的亦是影子頁表。這是因為客戶機頁表內存的是 GVA → GPA 的映射,無法用 GPA 存取宿主機上的物理內存。當客戶機欲存取 GVA 時,硬體會查詢 TLB 和影子頁表,如果影子頁表沒有 GVA → HPA 的映射,就會發生頁缺失。影子頁表加上硬體 TLB 被當作是客戶機的虛擬 TLB (VTLB)。客戶機可以修改其頁表,但這會導致頁表和影子頁表不一致,VMM 需要同步這兩者的差異。第一種情況是,客戶機頁表擁有 GVA → GPA 的映射,而影子頁表尚未有 GPA → HPA 的映射。此時客戶機存取 GVA 會發生頁缺失,陷入 VMM,VMM 再根據客戶機頁表修改影子頁表。第二種情況是,客戶機將某頁表項的權限降低,此時該頁表會與影子頁表不一致。但是客戶機在修改頁表項之後,會用 INVLPG 或是重載 CR3 的方式刷新 (虛擬) TLB,這會陷入 VMM,VMM 此時可同步客戶機頁表和影子頁表。

反過來說,若 VMM 修改到影子頁表,則此項修改亦須與客戶機頁表同步。實際上,硬體查找的是影子頁表,此時有可能會修改影子頁表項中的 A (Access) 或是 D (Dirty) 位。以 A 位來說,當 TLB 存在某條映射,相關的頁表項其 A 位必定為 1,這是因為硬體必定已經查詢過相關的頁表項,才會在 TLB 有該條映射。將 A 位置 1 由硬體達成,將 A 位清 0 由軟體達成。後者須用 INVLPG 使對應的 TLB 項失效。如果不這樣做,後續存取會持續使用已存在的 TLB 項,而不會再把該頁表項的 A 位置 1,這會造成該頁自 A 位清 0 之後從未被存取的假象。D 位僅在最後一級頁表項中存在,代表所指向的頁已被寫過,且 TLB 項也有該位。當第一次寫該頁時,若 TLB 項不存在,或是該頁表項 D 位為 0,此時將該頁表項 D 位置 1,這是由硬體達成。如果軟體將頁表項 D 位清 0,必須使用 INVLPG 使對應的 TLB 項失效。如果不這樣做,下一次再寫該頁時,硬體看到的是舊有 TLB 項,且其 D 位為 1,硬體不會再去將該頁表項 D 位置 1。這會導致該頁自 D 位清 0 之後未被寫過的假象。前述 A 或 D 位的修改不能自動的從影子頁表反映到客戶機頁表,VMM 必須在初次修改影子頁表 A 或 D 位時加以捕獲,進而同步客戶機頁表和影子頁表。

針對 A 位。當客戶機第一次存取 GVA 時,會因為影子頁表沒有 GVA → HPA 的映射而發生頁缺失,陷入 VMM。VMM 在建立 GVA → HPA 映射的同時,便可將客戶機頁表項的 A 位置 1。至於 D 位,VMM 在建立 GVA → HPA 映射時,可將 HPA 所指頁面設為只讀。之後客戶機寫 GVA 所指頁面時,就會發生頁缺失,陷入 VMM,VMM 再同步客戶機頁表項和影子頁表項。 第 9 頁即是此意思,所謂 shadowed page table 是指已有相對應影子頁表的客戶機頁表。

硬體支援的內存虛擬化,EPT,是在原有 CR3 的基礎上再多加一個 EPTP。CR3 指向客戶機頁表 (GVA → GPA),EPTP 指向擴展頁表 (GPA → HPA)。VMM 會負責填充擴展頁表的內容。注意! CR3 內存的是 GPA,指向客戶機頁表。所以從 CR3 取得的 GPA 還需要再經過 EPT 得到 HPA,方可使用該 HPA 存取客戶機頁表。再由 GVA 中的 offset 取得客戶機頁表項,得到下一級客戶機頁表的 GPA,該 GPA 仍需透過 EPT 取得 HPA,再使用該 HPA 存取下一級客戶機頁表。由前述可知,EPT 基本上每一次查詢頁表會需要查詢 M (客戶機 M 級頁表) * N (宿主機 N 級頁表) 層頁表。另外,EPT 只有在非根模式 (guest) 底下才參與地址轉換。

  • 這邊使用 kvm 的 process 指的就是 QEMU,QEMU 將自身的虛擬內存分配給 VM 作為客戶機物理內存。

  1. 設置 MMU 的入口點位在

    ,這裡我們只關注開啟 EPT 的情況,也就是

    • ,這是最重要的資料結構。

    • 透過填充 walk_mmu 這項資料結構,可以設定如何查詢客戶機頁表。

    • 定義 x86 上內存虛擬化相關資料結構。

    • 裡定義的宏,會將函數名稱擴展。

       
       
       
       
  2. 會取得 GVA 對應的客戶頁表項。

KVM 是將 QEMU 的虛擬內存分配給客戶機作為物理內存。KVM 將客戶機物理內存分為數個 slot。KVM 利用硬體內存虛擬化的流程大致如下:

  1. 硬體查詢 EPT,發現 GPA 0 並無對應項,發生 EPT 頁缺失。

  2. 客戶機再次存取 GVA 0,這時透過 EPT 即可得到對映的 HPA y,用 HPA y 存取內存。

硬體 TLB 和 CR3 存放與指向的都是影子頁表或其內容。當客戶機欲存取 CR3 或是使用 INVLPG,會陷入 VMM,爾後由 VMM 接手。若是開啟 EPT,因為有另一個 EPTP 可供操作,客戶機可以存取 CR3 或是使用 INVLPG 而不會陷入 VMM。

  1. // 檢查 VCPU 是否有待處理的事件。 // 載入客戶機頁表。
  2. 若是最上層由 CR3 指向的影子頁表尚未分配,

    ),分配該影子頁表並將 CR3 指向它。

  3. 會被賦值為平台特定的函式。以 VMX 為例,

  4. // 查找客戶機頁表。 // 如果客戶機頁表沒有 GVA -> GPA 映射,向 VCPU 注入頁缺失例外,交由客戶機 OS 處理。
    • 針對已存在的客戶機頁表項,沒有對應的影子頁表項。由 KVM 負責填充影子頁表項。

    • 針對客戶機的寫動作,因為對應的影子頁表項設成只讀,所以發生頁缺失。

    • 針對客戶機的 MMIO 觸發的頁缺失,不處理。

    • 因為客戶機頁表項不存在,或是該客戶機存取違反客戶機頁表項設置的權限。注入頁缺失給客戶機,交還給客戶機作業系統處理。

  • 影子頁表如何與客戶機頁表同步? 將客戶機頁表設為寫保護,還需要什麼? 流程為何?

  1.  
     
     
     

注意! 先不談虛擬化的情況下,以 Linux 為例。每個進程在內核中會有一份對映的資料結構,其中會有該進程的頁表基址。內核會被映射在每一個進程虛擬內存高位址處,所以每一個進程共享一份內核。如果內核要修改當前運行進程的頁表項,會執行以下偽碼,並沖掉當前 TLB 的內容。

這是一個內存存取,所以需要經過頁表作地址轉換。一般內存存取和修改頁表項都會經過同一套頁表。如果內核要修改一個被上下文切換出去進程的頁表項,基本上內核會先讀取該進程在內核中的資料結構,取得該進程的頁表基址,進而取得欲修改的頁表項,再執行上述偽碼。這裡,一般內存存取和修改頁表項還是經過同一套頁表 (內核位於虛擬內存高位址處,且每一個進程都共用一份內核)。。簡而言之,要存取頁目錄項或是頁表項,都需要先經過頁表作位址轉換,再行修改。

我们先来看一下 VTLB 的基本操作。客户真正的访存是通过影子页表进行的,如果影子页表中存在客户线性地址到物理地址的映射,那么访存操作就正常进行了。如果影子页表中不存在客户线性地址到物理地址的映射,那么将引发一次页故障,从而导致一次 VM exit。VMM 获得控制后,将首先根据引发异常的客户线性地址去查找客户页表,如果客户页表本身限制这次访问,如到物理地址的映射不存在、违反页级保护规则等,VMM 将把异常事件回注给客户,由客户操作系统处理该页故障。如果客户页表允许本次访问,那么通常本次页故障是由于影子页表中不存在客户线性地址到物理地址的映射引起的,此时就需要根据客户页表的内容来构建相应的影子页表,或称为对客户页表进行影射(Shadowing)。

如图所示,SPD 是 PD 的影子页表,SPT1/SPT2 是 PT1/PT2 的影子页表。由于客户 PDE 和 PTE 给出的页表基址和页基址并不是真正的物理地址,所以我们采用虚线表示 PDE 到客户页表以及 PTE 到普通客户页的映射关系。

VMM 中用于影子页表的内存是受限的,因此当内存紧张时,VMM 可能回收一部分影子页表。例如,可能回收图中的影子页表 SPT2,以后客户访问 P1 时将导致页故障,VMM 将再次分配影子页表,查询客户页表,并修补客户线性地址到 P1 的映射。

如果完全模拟物理 TLB 的行为,客户机在切换 CR3 时,VMM 需要清空整个 VTLB,使所有影子页表的内容无效。在多进程客户操作系统中,CR3 将被频繁地切换,某些影子页表的内容可能很快就会被再次用到,而重建影子页表是一项十分耗时的工作。因此,采用完全模拟物理 TLB 行为的方法构建 VTLB 在效率上是较差的。

提高效率的主要做法就是缓存影子页表,即客户切换 CR3 时不清空影子页表。例如,假设客户机上有两个进程 A 和 B,参见图 3,在 T1 时刻之前 A 正在运行,此时 CR3 指向进程 A 的影子页表。在 T1 至 T2 时刻进程 B 运行,此时 CR3 指向进程 B 的影子页表,但并不丢弃进程 A 的影子页表。以后在 T3 时刻再次切换到进程 A 时,原来 A 的影子页表还可以重用,这就避免了全部重新构建 A 的影子页表,提高了效率。

为了实现缓存影子页表的做法,必须意识到以下问题的存在:客户可能在不通知 VMM 的情况下 (即不刷新 TLB,導致無法陷入 VMM),象修改普通内存一样修改影子页表。例如,在进程 B 运行时,客户 OS 可能由于内存的紧张,将属于进程 A 的内存换出,并将相应的页表项的 P 位置 0,而由于 A 不是当前进程,所以客户 OS 不会使用 INVLPG 指令刷新 TLB,VMM 也就无从得知客户修改了进程 A 的页表。以后,当进程 A 恢复运行时,由于影子页表与客户页表不一致,将导致错误。

因此,在采用缓存影子页表的做法时,必须有某种机制保持客户页表与影子页表间的一致性,这可通过为客户页表所在的页 (位於實際機器上的物理內存) 设置写保护来实现。

首先必须区别普通客户内存和客户页表,因为效率上的考虑,不能对所有的客户页面进行写保护。当一个页表没有用于访存时,VMM 是无从知道该页的身份的。例如,客户操作系统在初始化某张页表时,VMM 不能确定该页是普通客户内存还是客户页表,只有以后该表页用于访存时,由于在 VTLB (TLB + 影子頁表) 中没有影射,将导致一次 VTLB Fill,并触发 VMM 搜索客户页表结构,从而得知与引起页面故障的客户线性地址相关的客户页面的真实身份 (即知道該頁是頁表,而非普通客戶內存)。

VTLB Fill 操作实际上在客户页表和影子页表之间进行了一次同步,为了跟踪客户页表的后续变化,应该对客户页表进行写保护。注意,客户页表也是通过影子页表来访问的,为了设置写保护就必须知道影子页表中访问客户页表所使用的 PTE,为了做到这一点,KVM 在影子页表中建立客户线性地址到物理地址的映射关系的同时,还维护了物理地址到末级页表 PTE 间的逆向映射,即给定客户页面,能够方便地得到访问该客户页面的末级页表 PTE。图中,红色箭头表示逆向映射。同时,给定一个客户页面,如果其逆向映射存在,那么正向映射一定存在,即该客户页面可以通过影子页表被访问到。

当 VMM 在 VTLB Fill 操作过程中识别一个客户页表,如 PT1,就会通过逆向映射找到访问其所需的影子页表项,如 SPT2 中的某个 PTE (指向 PT1),将 PTE 的 WP 位置 1。以后,客户对该客户页表的修改将导致 VM exit,从而使 VMM 有机会与客户页表保持同步。

需注意的问题是,内存的紧张可能导致 SPT2 被回收,因此在识别到一个客户页表时,影子页表中不一定总存在到客户页表的映射,也就不能为其设置写保护。但以后客户要修改该页表时,总要首先在影子页表中建立到它的映射,在建立映射时,VMM 检查该客户页面是否是客户页表且已被影射,如果是,则置页表项的 WP 位为 1。

还有一种可能是,影子页表中存在到 PT1 的映射,但 PT1 并没有被影射 (即不存在 SPT1,但 SPT2 中有頁表項指到 PT1)。这时,VMM 不对 PT1 进行写保护,客户可随意修改 PT1,以后当客户使用 PT1 进行访存时,必然会引起一次 VTLB Fill,从而使 VMM 有机会影射该客户页表 (即建立 SPT1),与其同步,并在 SPT2 没有被回收的情况下设置对该客户页表的写保护。

由以上分析中我们还可看出,客户页表可以很大,但 VMM 没有必要对它们全部进行影射,VMM 仅需影射那些真正用于访存的客户页表。

注意! 因為影子頁表和 EPT 基本上都是在客戶機頁表之外,再多一套頁表,而該頁表 (影子頁表或 EPT) 都是由 VMM 負責填充其中的內容。因此填充 EPT 的代碼基本上是重用影子頁表的代碼。

  1. 在因為發生 EPT 頁缺失,陷入 VMM 時,設置 EPT 項。

    •  
       
       
       
       
  1.  
     
     
     
  2. 替每一個客戶機分配一個 VPID,VMM 自己的 VPID 恆為 0。

VMM 只需模擬裝置的軟件接口,如: port IO、MMIO、DMA 和中斷。無需模擬裝置物理上的結構。

客戶機作業系統其時間是否需要跟實際時間一致端看其如何應用。

KVM 是 Linux 內核的一個模組,它會以裝置 /dev/kvm 向外界提供它的功能。QEMU 透過 ioctl 去讀寫該裝置請求 KVM 完成特定任務。KVM 主要的工作有兩個: 第一,它負責檢視客戶機 VM Exit 的原因並做相對應的處理; 第二,它負責透過 VM Entry 啟動客戶機。客戶機若因為操作 IO 而觸發

  • 分別是其重要資料結構。

  • ) 裡有欄位給 KVM 使用。

  1. 檢查使用者是否選用 KVM。

    • // slot 是用來記錄客戶機物理位址與 QEMU 虛擬位址的映射。
  2. 。若是原本 TCG 的模式,則改由

    • KVM 和 QEMU 之間會同步一些資料結構,例如:

  • 远程通道数量 : 2通道

    支持2个远程IP 用户,1个本地用户同时操作32台电脑,支持USB 键盘鼠标,1..

  • 远程通道数量 : 8通道

    宜坤(EAKUN)EK-6408M是一款拥有一个本地端口,8个远程端口,能直接管..

  • 宜坤(EAKUN)EK-6404是一款1个机架用本地端口,4个远程用户,64台服..

  • 宜坤品牌DVI口网络矩阵KVM切换器,支持DVI/VGA音视频及USB键鼠网络传..

  • 连线方式 : 网络连接

    HDMI 接口高清网络版延长器,可通过组网方式实现多人管控多台,分辨率支持192..

  • 远程通道数量 : 8通道

  • 远程通道数量 : 4通道

    宜坤(EAKUN)EK-3204M是一款机架型多通道32端口数字KVM切换器,支..

  • 连线方式 : 网络连接

    供电类型 : 直流供电

  • 远程通道数量 : 2通道

    支持2个远程IP 用户,1个本地用户同时操作16台电脑,支持USB 键盘鼠标,1..

  • 连线方式 : 网络连接

    供电类型 : 直流供电

    DVI-I 高清音视频矩阵切换器,支持USB 2.0 ,支持音频和麦克风信号传输..

  • 宜坤(EAKUN)高清影音矩阵光纤延长器

    连线方式 : 光纤直连

    供电类型 : 直流供电

    支持基于TCP/IP ,配套千兆交换机,光纤实时传输,高清音视频传输,支持一对一..

  • 远程通道数量 : 4通道

  • 连线方式 : 网络连接

    供电类型 : 直流供电

  • 连线方式 : 光纤连接

    供电类型 : 直流供电

  • 宜坤(EAKUN)高清影音HDMI矩阵KVM切换器

    连线方式 : 网络连接

    供电类型 : 直流供电

  • 连线方式 : 光纤连接

    供电类型 : 直流供电

物理机与使用 SR-IOV 的 KVM 的网络性能对比:

  • 只支持虚拟机内置(全量)快照,不支持外置(增量)快照。这与当前快照的实现方式有关,因为是通过 image 进行保存的。
  • 过程较长(需要先通过存储快照,然后抽取并上传至 Glance),网络开销大。

那为什么 Nova 不实现虚机的快照而只是系统盘的快照呢?据说,社区关于这个功能有过讨论,讨论的结果是不加入这个功能,原因主要有几点:

  • 这应该是一种虚拟化技术的功能,不是云计算平台的功能。
  • openstack 由于底层要支持多种虚拟化的技术,某些虚拟化技术实现这种功能比较困难。
  • 目前 libvirt 对 QEMU/KVM 虚机的外部快照的支持还不完善,即使更新到最新的 libvirt 版本,造成兼容性比较差。



KVM 原理技术 实战与原理解析 任永杰、单海涛著

我要回帖

更多关于 kvm嵌套虚拟化 的文章

 

随机推荐