直接回答:早期 x86 虚拟化的死穴是敏感指令不陷入(trap-and-emulate 失效),VT-x 引入 root/non-root 两种运行模式:Guest 内核跑在 non-root 的 ring0,执行敏感指令自动陷入 root 模式的 hypervisor 处理,不用改 Guest。KVM 是内核模块,把 Linux 本身变成 hypervisor:每个 VM 是一个普通进程,vCPU 是线程,内存用 EPT/NPT 硬件二级页表翻译(Guest 物理地址→宿主机物理地址由硬件完成,免去软件影子页表),QEMU 负责设备模拟。
展开解析:IO 虚拟化三档:全模拟(QEMU 模拟 e1000 网卡,兼容最好性能最差)、半虚拟化 virtio(Guest 装驱动,共享环形队列通信,主流方案)、直通(VFIO/SR-IOV 把设备 DMA 直接给 VM,近原生性能,GPU/网卡场景)。与容器的隔离差异是安全边界的核心:VM 有独立内核,攻击者逃逸要击穿 hypervisor(攻击面小且慢变量);容器共享宿主机内核,namespace+cgroup 只是“视图隔离与配额”,内核任意一个 syscall 漏洞都是共用攻击面——这就是多租户强隔离场景(公有云、运行不可信代码)必须用 VM 或微虚拟机(Firecracker、Kata 把容器包进轻量 VM,兼得启动速度与内核级隔离)的原因。性能上容器贴近原生(无二级页表与设备模拟),VM 的现代开销也已压到个位数百分比。嵌套虚拟化、vCPU 超卖、NUMA 亲和与大页是 VM 性能调优的常见抓手。
追问方向:Kata/Firecracker 如何兼得两者?EPT 缺页的开销为什么比普通缺页大?
(约 500 字)