我最近正在查看 xv6 的源代码(https://github.com/mit-pdos/xv6-riscv),当我遇到这一行时: (https://github.com/mit-pdos/xv6-riscv/blob/riscv/kernel/memlayout.h)
#define PHYSTOP (KERNBASE + 128*1024*1024)
将其与项目的 Makefile 结合起来(https://github.com/mit-pdos/xv6-riscv/blob/riscv/Makefile):
QEMUOPTS = -machine virt -bios none -kernel $K/kernel -m 128M -smp $(CPUS) -nographic
这让我意识到他们只是对操作系统进行硬编码以假设 128MB RAM,然后为 QEMU 指定相同的大小。然而,对于真实的操作系统来说显然不是这样的。那么,我想知道实际的操作系统如何确定可用的物理内存?
经过一番研究,我在网上发现这些信息是由设备的BIOS提供的。对于 x86 系统,GNU multiboot.h 可以提供大量此类信息。事实上this页面详细讨论了如何获取这些信息。然而,此链接专门讨论 x86 架构。在 RISC-V 架构中如何实现这一点?如何在 QEMU 内测试这一点?
一般来说 - 你不能。您必须知道您的操作系统应该运行的特定机器,您必须知道该系统有多少 RAM,并且您必须向您的操作系统提供该信息。
您必须了解,x86 在很多方面都是一种特殊的架构。您从 x86 学到的许多经验教训通常并不正确:
当您为非 x86 非 PC 系统进行裸机编程时,请记住以下几点: