【问题标题】:How does the CPU know where to look for a given physical memory address?CPU 如何知道在哪里寻找给定的物理内存地址?
【发布时间】:2016-07-11 14:22:59
【问题描述】:

如果我理解正确,只要 CPU 开启,它就会跳转到制造商硬连线的默认物理内存地址,并开始执行那里的二进制代码。在 PC 中,默认位置自然会映射到包含 BIOS 的 ROM。

假设我的系统也安装了 RAM,CPU 怎么知道它应该在包含 BIOS 的 ROM 芯片中搜索特定地址而不是 RAM 的地址?

主板和内存的制造商是否有一些标准或合同,他们同意他们的硬件的内存地址永远不会重叠?

【问题讨论】:

  • 如果我对此的低级理解有偏差,我深表歉意。非常感谢您的澄清。
  • 您在谈论主板和 BIOS 时为什么要标记这个“嵌入式系统”? PC 不是嵌入式系统。
  • CPU 不知道也不关心,cpu 严格按照指令告诉它去做。 cpu 边缘的内存/数据总线会投射这些请求,而除此之外的逻辑决定了与谁交谈。邮递员一点也不在乎一个地址或另一个地址,他们只是对邮件进行分类,然后根据上面写的内容将其投递到正确的地方。 CPU 并不关心它是否将消息传递到总线,内存控制器会对这些请求进行排序并将它们传递到正确的外围设备或内存。
  • 就像开发人员明智的做法是不要拥有两个具有相同地址的房子,板/芯片设计人员不会有两个目标响应相同地址,尽管在芯片/板上我们这样做一直都是,但我们以优先方式进行,如果 l1 缓存有答案,它会回答,如果没有,它会询问 l2 等等。有点像让你的邮件在邮局搁置一段时间,直到你以后可以拿到它。

标签: cpu memory-address bios


【解决方案1】:

让我们以快速的方式一步一步来: 当您重置 PC 时,它实际上会从 BIOS 运行代码。 Bios 代码是主板制造商编写的用于启动主板的代码。然后和Bios完成它的工作之后。 MBR;主引导记录,当您安装操作系统(例如 Windows 或 Linux)时,将运行它是写在硬盘头部(地址 0)的一段代码。 这段代码负责跳转到您的 Windows 驱动器以启动它,这称为引导加载程序。所以,

BIOS(非易失性内存) -> MBR(HDD) -> 操作系统

如果你仔细想想,你会发现在 BIOS 里面有一个引导顺序选项来识别应该从 HDD、DVD 等读取哪个 MBR

阅读有关 BIOS 的更多信息: https://en.wikipedia.org/wiki/BIOS

阅读有关 MBR 的更多信息: https://en.wikipedia.org/wiki/Master_boot_record

【讨论】:

    【解决方案2】:

    我想你会经常看到这张图:

    它总结了几件事(我假设您熟悉“物理地址”和“虚拟地址”的定义:

    1. CPU 内的所有程序和线路,始终在“虚拟地址”之间进行通信和交换。你永远不会遇到任何“物理地址”。

    2. 要寻址 CPU 之外的任何 DRAM,您将需要“物理地址”。

    3. 相同的“虚拟地址”,可以映射到不同的“物理地址”。例如,以下指令:

    load eax, (virtual_address_XXXX) (从内存加载到 EAX)

    相同的汇编指令,但在不同的进程下运行,会导致访问物理内存的不同部分。 (这是通过pagetable + MMU完成的)

    1. 从虚拟地址到物理地址的转换需要 MMU。在 CPU 外部检测到的任何电信号始终处于物理地址级别。因此,所有硬件设备(例如内存)都必须识别这一点。

    https://www.slideserve.com/stacie/computer-architecture-memory-management-units

    因此,首先,您在“标题”中的问题并不正确 - CPU 不知道并看到任何“物理地址”,它是硬件设备。但所有都由 MMU(或 IOMMU)翻译(可以由 TLB 缓存)。

    请注意,有些 CPU 没有 MMU。所以“物理”和“虚拟地址”的值相同。

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 1970-01-01
      • 2010-10-14
      • 2016-07-14
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2014-09-06
      相关资源
      最近更新 更多