物理内存探测
操作系统怎样知道物理内存所在的那段物理地址呢?在 RISC-V 中,这个一般是由 bootloader ,即 OpenSBI 来完成的。它来完成对于包括物理内存在内的各外设的扫描,将扫描结果以 DTB(Device Tree Blob) 的格式保存在物理内存中的某个地方。随后 OpenSBI 会将其地址保存在 a1
寄存器中,给我们使用。
这个扫描结果描述了所有外设的信息,当中也包括 Qemu 模拟的 RISC-V 计算机中的物理内存。
Qemu 模拟的 RISC-V virt 计算机中的物理内存
通过查看virt.c的virt_memmap[]的定义,可以了解到 Qemu 模拟的 RISC-V virt 计算机的详细物理内存布局。可以看到,整个物理内存中有不少内存空洞(即含义为unmapped的地址空间),也有很多外设特定的地址空间,现在我们看不懂没有关系,后面会慢慢涉及到。目前只需关心最后一块含义为DRAM的地址空间,这就是 OS 将要管理的 128MB 的内存空间。
起始地址
终止地址
含义
0x0
0x100
QEMU VIRT_DEBUG
0x100
0x1000
unmapped
0x1000
0x12000
QEMU MROM (包括 hard-coded reset vector; device tree)
0x12000
0x100000
unmapped
0x100000
0x101000
QEMU VIRT_TEST
0x101000
0x2000000
unmapped
0x2000000
0x2010000
QEMU VIRT_CLINT
0x2010000
0x3000000
unmapped
0x3000000
0x3010000
QEMU VIRT_PCIE_PIO
0x3010000
0xc000000
unmapped
0xc000000
0x10000000
QEMU VIRT_PLIC
0x10000000
0x10000100
QEMU VIRT_UART0
0x10000100
0x10001000
unmapped
0x10001000
0x10002000
QEMU VIRT_VIRTIO
0x10002000
0x20000000
unmapped
0x20000000
0x24000000
QEMU VIRT_FLASH
0x24000000
0x30000000
unmapped
0x30000000
0x40000000
QEMU VIRT_PCIE_ECAM
0x40000000
0x80000000
QEMU VIRT_PCIE_MMIO
0x80000000
0x88000000
DRAM 缺省 128MB,大小可配置
最后更新于