物理内存探测
操作系统怎样知道物理内存所在的那段物理地址呢?在 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,大小可配置 |
最后更新于