【问题标题】:How does the CPU know the PCI adress-spaceCPU如何知道PCI地址空间
【发布时间】:2013-11-06 00:23:55
【问题描述】:

我了解 PCI 和 PCIe 设备可以由 CPU 配置(通过 BIOS 或操作系统中的代码)以通过写入设备配置空间的特定区域来响应某些物理内存地址。
事实上,考虑到设备的许多要求(内存对齐、DMA 功能等),Linux 内核有相当复杂的算法来执行此操作。

看到软件似乎可以控制是否、何时以及在何处映射此内存,我的问题是:一个软件如何控制物理内存的映射?

在这个配置之后,PCI 设备会知道响应给定的地址范围,但是 CPU 怎么知道它应该为那些刚刚动态决定的特定地址在 PCI 总线上运行呢?

【问题讨论】:

  • 您能否从 linux 内核源代码(网页视图)中添加指向该算法的链接?

标签: linux-kernel pci memory-mapping pci-e


【解决方案1】:

使用要路由到内存控制器的地址范围对北桥进行编程。 所有其他地址都转到外部总线。

【讨论】:

  • 不是连续的吗?配置软件是否必须为每个物理填充 BAR。内存范围?
  • @Pyjong 所有这些访问都去公共汽车;设备本身对地址进行解码。
  • 嗯,是的,设备会响应在其 BAR 中设置的地址。
  • 是的,根据英特尔的 (G)MCH 手册,所有范围都有 BAR。
【解决方案2】:

它基于 CPU 拥有的地址映射信息。 如果它是 64 位处理器,通常你有 2^64 -1 个地址线和 CPU。 现在内存大约是 16 GB,即 2^34 大约是 16 GB。 因此 CPU 拥有的所有设备(甚至是传统的 PCI 和 PCIe 设备)及其配置空间都可以映射 到此 RAM 物理地址空间上方的地址线。 对该空间的任何 IO 都可以转发到相应的设备。 在我们的例子中,CPU 发现它想要访问的配置空间是 PCI 或 PCIe 设备,然后它转发 CPU 主机桥的指令(00:00:00 Do lspci in a box 你会看到这个 BDF 的主机桥)

一旦发现目标设备在主机桥中,指令(可以是 IO 或内存)将被转换为适当的 TLP 请求。

【讨论】:

    猜你喜欢
    • 2015-02-09
    • 2018-07-19
    • 2020-08-21
    • 2016-05-25
    • 2016-05-05
    • 2016-07-14
    • 2018-05-23
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多