gpt4 book ai didi

pci - PCIe 中的基地址寄存器 (BAR) 是什么?

转载 作者:行者123 更新时间:2023-12-03 14:39:56 34 4
gpt4 key购买 nike

在浏览了一些基础文档后,我的理解是,基地址寄存器是可以通过 PCIe IP 访问的地址空间。 PCIe IP 可以在基地址寄存器中传输数据,也可以将接收到的数据写入其中。

我对吗?还是遗漏了什么?

最佳答案

Linux内核观点

学习一些东西的一个好方法是与之交互,所以让我们使用 Linux 内核来实现它。

这是 QEMU 模拟设备上的最小 PCI 示例:https://github.com/cirosantilli/linux-kernel-module-cheat/blob/366b1c1af269f56d6a7e6464f2862ba2bc368062/kernel_module/pci.c

PCI 配置的前 64 个字节被标准化为:

enter image description here

图片来自 LDD3。

所以我们可以看到有 6 个 BAR。 wiki page然后显示每个 BAR 的内容:

enter image description here

然而,区域宽度需要魔法写入:How is a PCI / PCIe BAR size determined?

该内存由 PCI 设备设置,并向内核提供信息。

每个 BAR 对应于一个地址范围,该地址范围用作与 PCI 设备的单独通信 channel 。

每个区域的长度由硬件定义,并通过配置寄存器与软件通信。

除了长度之外,每个区域还具有更多的硬件定义属性,尤其是内存类型:

  • IORESOURCE_IO : 必须使用 inX 访问和 outX
  • IORESOURCE_MEM : 必须使用 ioreadX 访问和 iowriteX

  • 几个 Linux 内核 PCI 函数采用 BAR作为参数来识别要使用的通信 channel ,例如:
    mmio = pci_iomap(pdev, BAR, pci_resource_len(pdev, BAR));
    pci_resource_flags(dev, BAR);
    pci_resource_start(pdev, BAR);
    pci_resource_end(pdev, BAR);

    通过查看 QEMU 设备源代码,我们看到 QEMU 设备注册了这些区域:
    memory_region_init_io(&edu->mmio, OBJECT(edu), &edu_mmio_ops, edu,
    "edu-mmio", 1 << 20);
    pci_register_bar(pdev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &edu->mmio);

    很明显,BAR 的属性是硬件定义的,例如酒吧号码 0 , 具有类型内存 PCI_BASE_ADDRESS_SPACE_MEMORY ,内存区域为 1MiB 长 1 << 20 .

    另见: http://wiki.osdev.org/PCI#Base_Address_Registers当然。

    关于pci - PCIe 中的基地址寄存器 (BAR) 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30190050/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com