Skip to content

Intel VT-x

VT-x là bộ phần mở rộng ảo hóa của CPU Intel, gọi chung là VMX (Virtual Machine Extensions). Trang này trình bày ý tưởng cốt lõi, các thành phần chính (hai chế độ VMX, VMCS, VM entry và VM exit), các tính năng bổ trợ và cách KVM dùng VT-x. Bảng so sánh VT-x với AMD-V, ARM EL2 và RISC-V nằm ở CPU Virtualization, cách kiểm tra VT-x, bật nested VT-x và so sánh KVM với TCG trên máy dev nằm ở Chi phí giả lập của QEMU: KVM và TCG.

Ý tưởng cốt lõi

x86 có bốn mức đặc quyền (ring 0 đến 3), nhưng hệ điều hành chỉ dùng ring 0 và ring 3. Hypervisor muốn giữ quyền cao nhất nên guest phải chạy ở mức thấp hơn, trong khi một số lệnh nhạy cảm của x86 trước đây không gây trap khi chạy ở mức thấp hơn, nên mô hình trap-and-emulate không đúng (xem CPU Virtualization).

VT-x giải quyết bằng cách thêm một chiều mới, trực giao với ring: chế độ VMX root cho hypervisor và chế độ VMX non-root cho guest. Trong non-root, guest kernel vẫn chạy ở ring 0 và guest app ở ring 3, nên guest OS không cần sửa. Hypervisor quy định những sự kiện nào của guest phải thoát về root, và CPU tự lưu, nạp trạng thái khi chuyển chế độ. Nhờ vậy phần lớn lệnh của guest chạy thẳng trên CPU thật, và chỉ các sự kiện nhạy cảm mới tốn chi phí chuyển chế độ.

Bật VMX

CPU báo hỗ trợ VMX qua CPUID, và trên Linux là cờ vmx trong /proc/cpuinfo. Để dùng, phần mềm hệ thống phải qua các bước sau:

  1. Firmware cho phép VMX thông qua thanh ghi MSR IA32_FEATURE_CONTROL. Nếu firmware đã khóa thanh ghi này ở trạng thái tắt, phần mềm không bật được VMX và cần đổi cài đặt trong BIOS/UEFI.
  2. Hệ điều hành đặt bit CR4.VMXE.
  3. Chạy lệnh VMXON với địa chỉ của một vùng nhớ (VMXON region) để vào chế độ VMX. Phần mềm thực hiện việc này là hypervisor, và từ lúc đó hypervisor ở chế độ root.
  4. Kết thúc bằng lệnh VMXOFF.

VMCS

VMCS (Virtual Machine Control Structure) là cấu trúc dữ liệu trong bộ nhớ, mô tả toàn bộ một vCPU: trạng thái của nó, cách CPU xử lý các sự kiện, và lý do vừa thoát. Mỗi vCPU có một VMCS. Phần mềm không đọc ghi VMCS trực tiếp như bộ nhớ thường, mà dùng các lệnh VMREAD và VMWRITE, vì định dạng bên trong do CPU quyết định.

Vùng Nội dung Dùng khi
Guest-state area Thanh ghi, segment, CR0/CR3/CR4, RIP, RSP, RFLAGS của guest Lưu khi VM exit, nạp khi VM entry
Host-state area Thanh ghi và RIP của hypervisor Nạp khi VM exit để hypervisor tiếp tục chạy
VM-execution control fields Chọn sự kiện nào gây VM exit, bật EPT, VPID và các tính năng khác Cấu hình trước VM entry
VM-entry và VM-exit control fields Cách nạp trạng thái khi vào và khi thoát Cấu hình trước VM entry
VM-exit information Lý do thoát (exit reason), thông tin đi kèm như địa chỉ gây lỗi Hypervisor đọc sau mỗi lần thoát

Mỗi logical processor có một "current VMCS" tại một thời điểm. Lệnh VMPTRLD chọn VMCS hiện hành, VMCLEAR đưa VMCS về trạng thái chưa chạy.

VM entry và VM exit

Intel VT-x control flow: VM entry with VMLAUNCH or VMRESUME and VM exit between VMX root and VMX non-root, with state in the VMCS

Vòng đời của một vCPU gồm các bước:

  1. Hypervisor chọn VMCS (VMPTRLD) và ghi trạng thái guest cùng các control field (VMWRITE).
  2. VM entry: VMLAUNCH cho lần vào đầu tiên, VMRESUME cho các lần sau. CPU nạp guest-state từ VMCS và chuyển sang non-root.
  3. Guest chạy trực tiếp trên CPU cho đến khi gặp sự kiện được cấu hình là phải thoát.
  4. VM exit: CPU lưu trạng thái guest vào VMCS, nạp host-state, ghi exit reason và quay về root tại địa chỉ hypervisor đã đăng ký.
  5. Hypervisor đọc exit reason, xử lý (giả lập thiết bị, cấp trang nhớ, đưa ngắt vào guest...) rồi quay lại bước 2 bằng VMRESUME.

Chi phí của vòng lặp này là lý do hiệu năng ảo hóa phụ thuộc vào việc giảm số VM exit, xem VM exit và chi phí.

Sự kiện gây VM exit

Các control field trong VMCS quyết định guest thoát ở đâu. Chúng chia thành ba nhóm chính:

Nhóm control Ví dụ sự kiện cấu hình được
Pin-based Ngắt ngoài, NMI
Primary processor-based Lệnh HLT, truy cập I/O port, RDMSR/WRMSR (có thể lọc bằng bitmap), truy cập thanh ghi điều khiển
Secondary processor-based Bật EPT, VPID, unrestricted guest, ảo hóa APIC

Một số lệnh, ví dụ CPUID và các lệnh VMX, luôn gây VM exit trong non-root và không cấu hình bỏ qua được. Hypervisor nên chỉ bật những exit thật sự cần, vì mỗi exit thừa là chi phí.

Tính năng bổ trợ

VT-x đời đầu chỉ có vòng entry và exit. Các tính năng sau được thêm để giảm số exit và chi phí mỗi exit:

Tính năng Tác dụng
EPT (Extended Page Tables) Phần cứng dịch hai tầng từ guest virtual sang guest physical rồi sang host physical, thay cho shadow page table, xem Memory Virtualization
VPID (Virtual Processor Identifier) Gắn nhãn mục TLB theo vCPU để không phải xóa TLB mỗi lần chuyển giữa guest và host
Unrestricted guest Cho guest chạy ở real mode hoặc protected mode không phân trang, cần khi guest khởi động từ firmware
VMX-preemption timer Bộ đếm giờ trong VMCS, buộc VM exit sau một khoảng thời gian, dùng để hypervisor lấy lại quyền điều khiển
APIC virtualization và posted interrupts Giả lập APIC của guest và đưa ngắt vào guest ngay trong non-root, giảm VM exit do ngắt
VMCS shadowing Giảm exit khi một hypervisor chạy bên trong VM, xem mục dưới

Nested VMX

Khi một hypervisor (L1) chạy trong VM và muốn dùng VMX, các lệnh VMX của L1 phải được hypervisor ngoài cùng (L0) xử lý. L0 giữ một VMCS mô phỏng cho L1 và gộp nó với VMCS của chính L0 khi chạy guest của L1 (L2). VMCS shadowing cho phép L1 đọc ghi VMCS mô phỏng mà không gây VM exit ở mỗi lệnh VMREAD/VMWRITE. Ví dụ thực tế về nested VT-x trên máy dev nằm ở Chi phí giả lập của QEMU: KVM và TCG.

Cách KVM dùng VT-x

Trên Intel, KVM dùng các module kvm (phần chung) và kvm_intel (phần VMX, mã nằm trong arch/x86/kvm/vmx/ của kernel). Khi VMM userspace gọi KVM_RUN trên một vCPU, kernel chọn VMCS của vCPU đó và thực hiện VM entry. Khi guest thoát, KVM tự xử lý các exit đơn giản trong kernel, còn exit cần thiết bị giả lập (MMIO, I/O port) thì KVM_RUN trả về userspace cho QEMU. Luồng này tương ứng với các bước 2 đến 5 ở trên, xem thêm Cách KVM hoạt động.

Todo

Nội dung viết từ kiến thức tổng quan về VMX và chưa được đối chiếu từng chi tiết với Intel SDM. Cần kiểm lại tên các control field, danh sách exit reason và điều kiện của các tính năng bổ trợ (EPT, VPID, unrestricted guest, VMCS shadowing) theo đời CPU trước khi dùng làm tài liệu tham chiếu.

Liên quan

Tài liệu tham khảo