【问题标题】:Application processor memory map应用处理器内存映射
【发布时间】:2016-05-20 14:21:30
【问题描述】:

应用处理器的内存映射中包含哪些信息?它是告诉哪个子系统可以访问 RAM 的哪个区域,还是意味着如果 CPU 尝试根据内存映射访问地址,它可以是 RAM 地址或设备地址?我指的是这个文档
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0515b/CIHIJJJA.html.

这里 0x00_0000_0000 到 0x00_0800_0000 映射到引导区域,这意味着什么?

【问题讨论】:

  • 在 ARM 芯片组的上下文中,引导加载程序启动了从 0x0000000000 到 0x0008000000 之间的引导映像。内存映射本身显示了从启动时核心 ARM cpu 使用的可访问 RAM。不一定意味着它适用于在其上运行的一般应用程序。

标签: linux memory linux-kernel embedded-linux memory-mapping


【解决方案1】:

您链接到的内存映射图样式显示了处理器和外围设备将如何解码物理内存地址。这是任何片上系统设备的正常图,尽管精确的布局会有所不同。链接页面实际上列出了 SoC 的哪些单元使用此内存映射进行地址解码,其中包括 ARM 和 Mali 图形处理器。在 Linux 系统中,大部分信息将在设备树中传递给内核。重要的是要记住,这并不能告诉我们操作系统如何选择组织虚拟内存地址。

有趣的区域是:

DRAM - 这些地址将被传递给 DRAM 控制器。无法保证正在使用的特定板在所有地址空间中都具有 DRAM。启动固件将设置 DRAM 控制器并将这些详细信息传递给操作系统。

PCIe - 这些地址将被映射到 PCIe 控制器,并最终在 PCIe 链路上进行传输。

默认情况下,该芯片上的引导区域包含片上引导 ROM 和工作空间。在这个特定的芯片上,ARM 的TrustZone 安全架构增加了复杂性,这意味着启动后加载的应用程序代码可能无法访问该区域。在开发板上,应该可以覆盖此映射并从外部设备启动。

【讨论】:

  • 例如,对于 I2C,这些范围被分配,I2C 0x00_7FFA_0000 0x00_7FFA_00FF 256B,当应用处理器写入 0x00_7FFA_0000 0x00_7FFA_00FF 之间的地址时,I2C 控制器寄存器将被更新?
  • 就是这样 - 应该有另一个文档更详细地描述 I2C 控制器,并列出各个寄存器相对于 0x00_7FFA_0000 基地址的偏移量。
  • 谢谢,正如您所说“大部分信息将在设备树中传递给内核”是在设备树中硬编码还是由引导加载程序通过更新所选节点来动态更新?
  • 这非常依赖于特定的芯片和引导程序。如果地址是静态的(常见情况),那么它们通常会在设备树中进行硬编码。一些更复杂的 SoC 设备具有可配置的内部地址解码,因此它们的设备树可能是动态生成的。对于 64 位 ARM,一些信息甚至可能在 ACPI 中:kernel.org/doc/Documentation/arm64/arm-acpi.txt
  • 我还有一个问题,哪个硬件负责地址解析,假设我写入某个地址,该地址决定它属于 DRAM 还是外围设备。
【解决方案2】:

内存映射包含设备内存的布局。 它告诉您的操作系统,操作系统可以在哪里放置数据以及如何访问数据,因为某些区域可能只能在特权状态下访问。 您的启动映像将放置在启动区域中。这将定义您的入口点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多