📖 推薦閱讀:《Yocto項目實戰教程:高效定制嵌入式Linux系統》
🎥 更多學習視頻請關注 B 站:嵌入式Jerry
深度理解 KVM:Linux 內核系統學習的重要角度
作者:嵌入式 Jerry
一、為什么開發者需要學習 KVM?
KVM (全稱 Kernel-based Virtual Machine),是 Linux 內核內置的虛擬化子系統。對于 BSP 工程師、系統工程師而言,KVM 不僅是一套虛擬化技術,更是一個進入 Linux 內核架構、高效資源管理、硬件抽象經驗的重要入口。
二、KVM 是什么?在內核里怎么實現?
基本概念
- KVM 是一個屬于 Linux 內核的虛擬化模塊
- 利用硬件虛擬化支持(Intel VT-x,AMD-V)
- 每個 VM 是一個普通的 Linux 進程
- KVM + QEMU = 完整虛擬機基礎架構
核心組件
組件 | 作用 |
---|---|
kvm.ko | 基礎 KVM 內核模塊 |
kvm-intel.ko 、kvm-amd.ko | 根據 CPU 硬件同步 VMEXIT/虛擬指令 |
/dev/kvm | 用戶態與內核互操接口 |
QEMU | 虛擬 BIOS,虛擬硬件,用戶態設備模型 |
三、學習 KVM 能幫助我們了解什么?
1. 加深對 Linux 進程/線程/調度 等組技術的理解
- 每個 vCPU 是一個 Linux 線程,等同于把 Guest CPU 展示為主機線程
- 用戶態 VM 通過
/dev/kvm
與內核交互,通過 ioctl 啟動 VM - 內核通過 VMX 組技術,進行虛擬快照
實例:看看 VM 線程是否正常運行
ps -ef | grep qemu
cat /proc/`pidof qemu-system-x86_64`/status
2. 實際理解 MMU/頁表/內存映射
- 不同 VM 有自己的 Guest page table,內核進行 shadow page 同步
- 使用 Extended Page Table 擴展 CPU 虛擬內存
實例:查看主機頁表分配結果
cat /proc/meminfo | grep HugePages
3. 系統資源分配和隔離機制
- KVM 使用 Linux 組織,支持 cgroup 限制資源
- 設置 CPU 線程親和性:
taskset
,virsh vcpupin
實例:給 VM 給定線程線序組
taskset -c 1-3 qemu-system-x86_64 -smp 3 -enable-kvm [...]
4. 完整設備模型的構造
- VirtIO 使用共享內存和 ring buffer 接口,構建高性能虛擬設備
實例:啟用 virtio-blk 磁盤
qemu-system-x86_64 [...other opts...] \-drive file=rootfs.img,if=virtio,format=raw
四、KVM 應用場景分析
場景 | 說明 |
---|---|
邊緣計算 | SoC 上運行多個客戶系統,實現快速應用切換 |
安全隔離 | 把每個任務放入不同 VM,防止信息潰露 |
多系統調試 | 同一個開發板進行多個 Linux/實時系統游玩 |
AI 模型分布 | 兩個 VM 分別運行不同的模型,互不干擾 |
FPGA/專用硬件分布 | 通過 VFIO + IOMMU 實現設備直通 |
五、如何學好 KVM?
1. 理解基礎理論
- 虛擬化分類:Type 1 vs Type 2
- VT-x / AMD-V 是什么?
- 運行時 VMEXIT / VMENTRY 條件
2. 編譯和啟用 KVM
- 內核打開 CONFIG_KVM
- modprobe kvm-intel
- ls /dev/kvm 確認設備
3. 實踐 QEMU + KVM 啟動虛擬機
qemu-system-x86_64 \-enable-kvm \-m 1024 -smp 2 \-kernel bzImage \-append "root=/dev/vda console=ttyS0" \-drive file=rootfs.ext4,format=raw \-nographic
4. 研究代碼/日志/分析模塊
- 分析
arch/x86/kvm/
:虛擬指令和 VMX 操作 - 分析
virt/kvm/
:KVM 核心 VM 管理邏輯 - 分析
drivers/virtio/
:VirtIO 設備驅動 - debugfs:
/sys/kernel/debug/kvm/
:看虛擬中斷、vCPU 狀態
六、總結
學習 KVM,不是為了做 VM,而是以此為窗口,打通 Linux 內核調度、內存、中斷、設備管理等核心矩陣。
📖 推薦閱讀:《Yocto項目實戰教程:高效定制嵌入式Linux系統》
🎥 更多學習視頻請關注 B 站:嵌入式Jerry