【问题标题】:Confused over memory mapping对内存映射感到困惑
【发布时间】:2011-10-02 16:41:00
【问题描述】:

我最近开始研究低级的东西并研究引导加载程序和操作系统等......

据我了解,至少对于 ARM 处理器,外围设备由引导加载程序初始化,然后映射到物理内存空间。从这里,代码可以通过简单地将值写入映射到外设寄存器的内存空间来访问外设。稍后如果芯片有一个 MMU,它可以用来进一步重新映射到虚拟内存空间。我说的对吗?

我不明白的是(假设我上面说的是正确的):

  • 如果外围设备尚未映射到地址空间,引导加载程序如何对其进行初始化?
  • 使用虚拟内存映射,有一些表告诉 MMU 在哪里映射什么。但是什么决定了外设在物理内存中的映射位置?

【问题讨论】:

    标签: memory arm low-level


    【解决方案1】:

    当设备启动时,MMU 会关闭,您通常会在超级用户模式下运行。这意味着提供的任何地址都是物理地址。

    每个 ARM SOC(片上系统)都有一个内存映射。地址与设备的对应关系取决于哪些物理数据和地址线连接到处理器的哪些部分。所有这些信息都可以在技术参考手册中找到。对于 OMAP4 芯片,可以找到 here

    有几种方法可以连接片外设备。一种是使用 GPMC。在这里,您需要在 GPMC 中指定您要在芯片上使用的地址。

    然后打开 MMU 时,这些地址可能会根据 MMU 的编程方式而改变。通常直接访问硬件也只能在内核模式下使用。

    【讨论】:

    • 谢谢,这有助于解决问题。最后一个问题:是否可以在物理内存空间中“取消映射”某些内容?
    • 您可以重新编程 GPMC 并有效地取消映射内存,尽管我怀疑这是否有很好的用例。
    【解决方案2】:

    虽然这是一个老问题,但还是想回答这个问题,因为它可能会帮助像我这样的其他人试图从 stackoverflow 中获得足够的答案。

    你的解释几乎是正确的,但想对此做一点解释: 外设由引导加载程序初始化,然后映射到物理内存空间

    片上外设已经有一个预定义的物理地址空间。对于其他外部 IO 映射的外设(如 PCIe),我们需要配置一个物理地址空间,但它们的物理地址空间范围仍然是预定义的。它们不能在随机地址空间进行配置。

    现在回答你的问题,这是我的答案.. 如果外围设备尚未映射到地址空间,引导加载程序如何初始化它们?

    正如我上面提到的,所有(片上)外设都有预定义的物理地址空间(通常会在处理器 RM 的内存映射章节中列出)。因此,引导加载程序(假设 MMU 已关闭)可以直接访问它们。

    通过虚拟内存映射,有一些表格告诉 MMU 在哪里映射什么。但是是什么决定了外设在物理内存中的映射位置?

    使用 VMM,有页表(由内核创建并存储在物理 DRAM 中)告诉 MMU 将虚拟地址映射到物理地址。在具有 1G 内核 virt 空间的 linux 内核中(例如来自 0xc0000000-0xffffffff 的内核虚拟地址),片上外围设备需要在上述内核 VM 空间内有一个 VM 空间(以便内核和只有内核可以访问它);并且页表将被设置为将该外围虚拟地址映射到它的实际物理地址(在 RM 中定义的那些)

    【讨论】:

      【解决方案3】:

      你不能在 ARM 处理器中重新映射外围设备,所有外围设备都对应内存映射中的固定位置。甚至寄存器也映射到具有永久固定位置的内部 RAM 存储器。您可以重新映射的唯一内容是通过 FSMC 或类似核心功能的 SRAM、FLASH 等存储设备。但是,您可以重新映射不属于内核本身的内存映射附加自定义外围设备,例如硬盘控制器,但 ARM 内核内部的内容是固定的。

      一个好的开始是查看 Philips 和 ST 等公司网站上的处理器数据表,或 www.arm.com 上的 ARM 架构本身。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        • 1970-01-01
        • 2021-11-16
        • 2018-03-14
        • 1970-01-01
        • 2012-03-04
        相关资源
        最近更新 更多