虚拟化技术

七月 18, 2025 [linux] #qemu #kvm #virtualization #riscv #jos

虚拟化技术

KVM 环境检查

# Intel CPU
grep "vmx" /proc/cpuinfo

# AMD CPU
grep "svm" /proc/cpuinfo

# 检查 kvm 模块
lsmod | grep kvm

KVM 环境目录:/etc/libvirt//var/lib/libvirt/

虚拟机磁盘管理

创建虚拟磁盘

# 文件方式
qemu-img create -f qcow2 /var/lib/libvirt/images/vm.qcow2 10G

# libvirt 存储池方式
virsh vol-create-as vmfspool vm.img 10G --format qcow2

扩缩容

qemu-img resize /path/vm.qcow2 +10G
qemu-img check /path/vm.qcow2

热添加/移除磁盘

virsh attach-disk VM1 /data/vmfs/disk.qcow2 vdb --subdriver=qcow2
virsh detach-disk VM1 /data/vmfs/disk.qcow2

若报 No more available PCI slotspc-i440fx 机器 PCI 槽位有限(31 个),每个 virtio-blk 设备占 1 个,需通过 PCI bridge 扩展。

镜像格式对比

格式特点
raw裸格式,无元数据,不支持快照
qcow2主流格式,支持 COW、多快照、zlib 压缩、AES 加密

增量镜像

qemu-img create -b base.qcow2 -f qcow2 child.qcow2  # 基于 base 创建 overlay

格式转换

qemu-img convert -f raw -O qcow2 vm.raw vm.qcow2

存储池管理

# 创建本地目录存储池
virsh pool-define-as vmfspool --type dir --target /data/vmfs
virsh pool-build vmfspool
virsh pool-start vmfspool
virsh pool-autostart vmfspool

# 查看
virsh pool-list --all
virsh pool-info vmfspool

# 删除(先 destroy 再 undefine)
virsh pool-destroy vmfspool
virsh pool-undefine vmfspool

虚拟机管理

virsh list --all                # 列出所有虚拟机
virsh start VM1                 # 启动
virsh suspend VM1               # 挂起
virsh resume VM1                # 恢复
virsh destroy VM1               # 强制关机
virsh dumpxml VM1               # 导出配置
virsh edit VM1                  # 编辑配置

# 克隆
virt-clone -o VM1 -n vm-clone --auto-clone

# 快照
virsh snapshot-create-as VM1 snap1
virsh snapshot-revert VM1 snap1

退出 virsh console:Ctrl+](英文键盘 Ctrl+Shift+])。

QEMU 用户态 vs 系统级模拟

qemu-riscv64qemu-system-riscv64
模式用户态模拟(User mode)系统级模拟(System mode)
功能运行单个可执行 ELF模拟完整裸机系统
系统调用转换为宿主系统调用需要运行完整内核

用户态模拟通过将 RISC-V Linux 系统调用转换为 x86-64 系统调用来执行单个应用。

JOS 学习笔记

IDT/GDT/LDT

动态链接:PLT 与 GOT

每个调用动态库函数的位置都需要这两项——PLT 负责跳转到 GOT 中记录的函数地址,首次调用时由动态链接器填充 GOT(延迟绑定)。

JOS 内核调试

make qemu-nox-gdb &
make gdb

# GDB 中加载引导程序和内核符号
gdb> symbol-file obj/boot/boot.out
gdb> b bootmain
gdb> add-symbol-file obj/kern/kernel

页表和 CR3

每个进程页目录中共享相同的内核页表项。进程切换时修改 CR3 切换地址空间,但内核部分的映射不变,内核临时映射只需修改共享的内核页表。

常用汇编器

汇编器语法风格
GAS (GNU Assembler)AT&T
MASM (Microsoft)Intel
NASMIntel-like(更简洁)
FASM (Flat Assembler)Intel

AT&T 与 Intel 语法关键差异:

差异AT&TIntel
寄存器%eaxeax
立即数$11
操作数顺序源→目的目的←源
内存寻址offset(%base, %index, scale)[base + index*scale + offset]