ARM 处理器如何使用超过 4GB 的内存?
Posted
技术标签:
【中文标题】ARM 处理器如何使用超过 4GB 的内存?【英文标题】:How can ARM processors use more than 4GB of ram? 【发布时间】: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 天它是进入具有更多内存的卡的窗口,今天你只需交换它。 【参考方案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 模式,这可能会带来挑战。
【讨论】:
以上是关于ARM 处理器如何使用超过 4GB 的内存?的主要内容,如果未能解决你的问题,请参考以下文章