【问题标题】:How can ARM processors use more than 4GB of ram?ARM 处理器如何使用超过 4GB 的内存?
【发布时间】:2021-05-26 14:47:32
【问题描述】:

我最近开始研究自己的操作系统。我正在关注 jsandler18 的 awesome tutorial 并在进行更改时允许它在树莓派 4 上运行。

遗憾的是,jsandler18 在完成虚拟内存页面之前就停止了更新教程。我阅读了其他一些资料,发现了一个小问题:ARM l1 地址转换表将计算机 RAM 划分为 1-MB 块。这里的问题是它最多只能允许 4096 个条目,即 4GB 的虚拟内存。

有什么方法可以使用 ARM MMU 转换超过 4GB 的虚拟内存?

【问题讨论】:

  • PC 或其他平台的操作方式相同。想想 pcie,它使用部分处理器地址空间作为进入其他地址空间的窗口。同样在这里。 mmu 使您更容易在应用程序访问它时为应用程序设置块错误,然后从媒体中拉入此应用程序内存并将其放入其中并完成访问,从而使应用程序永远不会知道。
  • 它只是交换空间,是虚拟内存概念的一个子集。
  • 具有 32 位地址空间(aarch64 应该更大,是的),特别是在支持 ARM linux 的传统内核和芯片上,其中一些地址空间被外围设备和 mmu 表和其他东西(pcie如果有的话,需要的视频,以太网数据包存储等)。在 pi 上,芯片设计会占用大量 ARM 地址空间,但只剩下一个很小的窗口。如果我没记错的话,最初是 0x20000000 字节的空间,后来是 0x3F000000 字节的空间。其中大部分被映射为缓存和邮箱区域。默认情况下,GPU 会占用一半的内存,或者至少曾经是这样。
  • 即使你有一个 32 位 x86 电脑,4gb 内存,你也无法获得 4gb 内存,一个 gig 用于 pcie,一些平台在那里镜像视频内存,但是你有交换以获取剩余的内容并扩展它。即使是带有 4gb 内存的 64 位处理器,最初你也无法获得它,因为 pcie 会从该地址空间中取出一个 gig 洞,如果你正在引导 32 位操作系统,则不会将 pcie 或其他东西移到上面4GB 标记,如果 BIOS 允许,则需要为此设置 BIOS。
  • 今天,在过渡到 64 位之后,它更有可能找到一个可以执行此操作的 bios,默认情况下可能会将其移出您可能拥有 ram 的地址空间,然后打开一个地址空间中有 2GB 的 pcie 孔。在任何情况下,您要么使用窗口进入虚拟空间,要么进行交换,早期的 8088/86 天它是进入具有更多内存的卡的窗口,今天你只需交换它。

标签: raspberry-pi operating-system arm kernel virtual-memory


【解决方案1】:

所引用的教程似乎在 ARMV7 中执行,可以将其视为 32 位 ARM。这大致相当于在 X86 中以 32 位 PAE 模式运行。因此,使用此示例无法使用超过 4GB 的虚拟内存。

ARMV8(或 AARCH64)支持 64 位虚拟地址,并允许映射超过 4GB 的虚拟内存。

切换到 ARMV8 是通过切换异常级别来完成的,通常表示为 EL0、EL1、EL2 和 EL3。您可能遇到的一个挑战是,一旦您进入 AARCH32 模式,您就无法转到较低的异常级别并切换到 AARCH64。例如,支持从 EL1 64 位 -> EL0 32 位,但不支持从 EL1 32 位 -> EL0 64 位。如果将执行交给您的操作系统的固件处于 AARCH32 模式,这可能会带来挑战。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2013-07-30
    • 2015-06-23
    相关资源
    最近更新 更多