如何确定 RISC-V 操作系统中的可用物理 RAM?

问题描述 投票:0回答:1

我最近正在查看 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 内测试这一点?

c assembly memory operating-system riscv
1个回答
0
投票

一般来说 - 你不能。您必须知道您的操作系统应该运行的特定机器,您必须知道该系统有多少 RAM,并且您必须向您的操作系统提供该信息。

您必须了解,x86 在很多方面都是一种特殊的架构。您从 x86 学到的许多经验教训通常并不正确:

  • x86 只有一种流行的系统架构 - ACPI 兼容 PC。正因为如此,指令集架构(x86)和系统架构(PC)几乎成为同义词。一般来说,情况并非如此——大多数其他 ISA 有许多用它构建的不同系统。
  • “仅”x86 系统架构要求 PCI 总线(提供设备检测功能)和系统管理总线(提供对 DRAM 串行存在检测的访问)。这意味着,在 ACPI PC 上,设备映射和内存映射都可以在运行时发现。许多非 PC 系统根本没有内存或设备检测!
  • ACPI PC 标准还要求提供功能相当强大的 BIOS。非 PC 系统可能只有一个简单的引导加载程序。

当您为非 x86 非 PC 系统进行裸机编程时,请记住以下几点:

  • 您不是针对 RISC-V 进行编程,您是针对以 RISC-V 作为其一部分的特定系统进行编程。您必须决定您的操作系统支持哪种机器/主板/SoC。然后,获取该机器的手册。
  • 如果该机器具有为您提供设备和内存映射的 BIOS - 使用它们。
  • 如果没有 - 您必须自己向操作系统提供目标系统信息。您可以将其硬编码在源代码中,或者创建某种“配置块”,您的操作系统将在启动时读取它。
© www.soinside.com 2019 - 2024. All rights reserved.