虚拟化技术
七月 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 slots:pc-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-riscv64 | qemu-system-riscv64 | |
|---|---|---|
| 模式 | 用户态模拟(User mode) | 系统级模拟(System mode) |
| 功能 | 运行单个可执行 ELF | 模拟完整裸机系统 |
| 系统调用 | 转换为宿主系统调用 | 需要运行完整内核 |
用户态模拟通过将 RISC-V Linux 系统调用转换为 x86-64 系统调用来执行单个应用。
JOS 学习笔记
IDT/GDT/LDT
- GDT(Global Descriptor Table):全局描述符表,系统级段描述符
- LDT(Local Descriptor Table):局部描述符表,每个任务可有一张
- IDT(Interrupt Descriptor Table):中断描述符表
动态链接:PLT 与 GOT
- GOT(Global Offset Table):存放外部函数地址的数据表
- PLT(Procedure Linkage Table):调用外部函数的额外代码段表
每个调用动态库函数的位置都需要这两项——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 |
| NASM | Intel-like(更简洁) |
| FASM (Flat Assembler) | Intel |
AT&T 与 Intel 语法关键差异:
| 差异 | AT&T | Intel |
|---|---|---|
| 寄存器 | %eax | eax |
| 立即数 | $1 | 1 |
| 操作数顺序 | 源→目的 | 目的←源 |
| 内存寻址 | offset(%base, %index, scale) | [base + index*scale + offset] |