2.1 QEMU
qemu 是一个开源的模拟器和虚拟机,可以使用软件模拟硬件 行为,模拟是很重要的学习工具。
qemu 提供了什么
qemu 提供了一个虚拟机,这个虚拟机包括输入,输出,内存,网卡等设备。设备通过 各自的协议连接到总线上,CPU 通过读写总线上的地址来控制这些设备,一个机器上的 设备分布称为该机器的设备树。
qemu 的虚拟机
通过以下指令可以查看 qemu 支持的虚拟机类型,重点关注 virt,后续统一使用该通用虚拟机。
qemu-system-riscv64 -machine help
Supported machines are:
none empty machine
sifive_e RISC-V Board compatible with SiFive E SDK
sifive_u RISC-V Board compatible with SiFive U SDK
spike RISC-V Spike Board (default)
virt RISC-V VirtIO board
qemu 的设备树
通过一下指令可以输出 qemu 的设备树信息,dtb (Device Tree Blob) 是二进制格式的 设备树。可以通过 dtc 工具转换为文本形式。
qemu-system-riscv64 -machine virt,dumpdtb=riscv64-virt.dtb
dtc -o riscv64-virt.dts -O dts -I dtb riscv64-virt.dtb
设备 - 内存
查看 riscv64-virt.dtb 文件,关注其中的 memory 设备即内存设备。
memory@80000000 {
device_type = "memory";
reg = <0x00 0x80000000 0x00 0x8000000>;
};
大多数设备都映射为地址,且可能存在不相邻的地址段,所以 reg 的含义是
reg = <address1 size1 address2 size2 ...>
前缀 0x00 不清楚具体含义。
这里表示以 0x8000000 起始且大小为 128M 的内存设备。而每个地址代表 1 字节,所以内存大小是 128MB。