一、下载qemu
qemu是一个模拟器,可以模拟运行x86、arm、ppc、mips、riscv等CPU,可以添加自定义开发板和硬件设备(如pcie设备),与vmware不同的是vmware是一个虚拟运行环境,一个是模拟器,一个是虚拟运行环境。
下载qemu使用如下命令:
git clone https://gitlab.com/qemu-project/qemu.git
二、编译qemu:
# cd qemu
# ./configure --target-list=x86_64-softmmu # 配置,只编译x86系统模拟
# make -j$(nproc) # 开始编译,-j参数加快速度
三、添加开发板
如下是在qemu种添加一个AST2600(ARM Cortex-A7核)芯片的pf12开发板示例:
1、在hw/arm/aspeed.c下添加开发版描述:
// 在 hw/arm/aspeed.c 文件中 static const TypeInfo aspeed_machine_types[] = { // ... 已有的 Machine 定义,如 "ast2600-evb" { .name = MACHINE_TYPE_NAME("pf12"), // 命令行中使用的机器名 .parent = TYPE_ASPEED_MACHINE, // 继承自 AST SoC 的 Machine 父类 .class_init = aspeed_machine_pf12_class_init, // 初始化函数 }, // ... };2、实现class_init函数,该函数需实现如下内容:
- 指定 CPU 型号:设置开发板使用的 CPU 核心类型;
- 定义内存布局:配置 RAM 的起始地址和大小;
- 添加外设:通过函数调用将 UART、I2C、GPIO、MMC、网卡等外设挂载到总线上,并分配它们的内存地址和中断号;
- 配置启动流程:指定固件(如 U-Boot)的加载地址和启动方式。
四、添加硬件
1、在hw/misc/或hw/char/创建test-device.c文件:
1、定义设备状态结构体 // 假设我们的设备叫 "amd.xor-test" typedef struct XorTestState { SysBusDevice parent_obj; // 父对象,必须放在第一位 MemoryRegion iomem; // 设备的MMIO内存区域 qemu_irq irq; // 中断引脚 uint32_t regs[2]; // 两个32位寄存器 } XorTestState; 2、实现寄存器的读写逻辑 static const MemoryRegionOps xor_test_ops = { .read = xor_test_read, // 读操作函数 .write = xor_test_write, // 写操作函数 .endianness = DEVICE_LITTLE_ENDIAN, // ... }; 3、实现设备初始化和复位函数 static const TypeInfo xor_test_info = { .name = TYPE_XOR_TEST, // 设备类型名称,如 "amd.xor-test" .parent = TYPE_SYS_BUS_DEVICE, // 父类,通常为系统总线设备 .instance_size = sizeof(XorTestState), .class_init = xor_test_class_init, .instance_init = xor_test_init, }; 4、注册设备类型 static void xor_test_register_types(void) { type_register_static(&xor_test_info); } type_init(xor_test_register_types) // 注册宏2、在hw/misc/Makefile.objs或hw/char/Makefile.objs添加如下:
obj-$(CONFIG_MY_DEVICE) += test-device.o3、启动 QEMU 时:
-device <设备名> # 添加设别
-device <设备名>,help # 查看设备支持的属性
-device <设备名>,<参数1=val1>,<参数2=val2>,<参数3=val3> # 向设备传参
五、启动qemu
gdb --args \ # 在 GDB 中启动 QEMU,用于调试 QEMU 进程本身 qemu-system-x86_64 \ # 启动 x86_64 架构的系统模拟器 --enable-kvm \ # 启用 Linux 内核 KVM 加速,利用宿主 CPU 硬件虚拟化提升性能 -boot c \ # 从硬盘(disk C)引导系统,对应 -drive 中的第一个磁盘 -drive format=qcow2,file=$UBUNTU/ubuntu-22.04-amd64.img \ # 定义系统盘,格式为 qcow2(支持快照、压缩) -drive format=raw,file=$UBUNTU/disk_shared.ext4 \ # 定义第二块硬盘,格式为裸设备 raw,通常用作数据盘 -m 8G \ # 分配 8GB 客户机内存 -smp 4 \ # 为客户机配置 4 个 CPU 核心 -nic user,hostfwd=tcp::$12345-:22 \ # 用户态网络堆栈,将宿主机 12345 端口转发到虚拟机 22 端口(SSH) -nographic \ # 不使用图形界面,将串口/控制台重定向到当前终端 -device edu,edu_id=0,bar_size=1G,offset=0x10000/0x20000 # 启动edu模块,这是一个教学用的开源pcie模块,edu_id/bar_size/offset为传入模块的参数 -device test_device,device_id=0,bar_size=1G,offset=0x10000/0x20000 # 启动test_device模块,这是个自定义模块,device_id/bar_size/offset为传入模块的参数六、常用命令
- 查看支持的cpu型号:
qemu-system-x86_64 -cpu help
qemu-system-arm -cpu help
qemu-system-aarch64 -cpu help
qemu-system-ppc -cpu help
qemu-system-ppc64 -cpu help
qemu-system-mips -cpu help
qemu-system-riscv32 -cpu help
qemu-system-riscv64 -cpu help
- 查看支持的开发板:
qemu-system-x86_64 -M help
qemu-system-arm -M help
qemu-system-aarch64 -M help
qemu-system-ppc -M help
qemu-system-ppc64 -M help
qemu-system-mips -M help
qemu-system-riscv32 -M help
qemu-system-riscv64 -M help