【发布时间】:2020-01-17 20:23:58
【问题描述】:
据我了解,(这很可能是错误的)每个 PCI 设备都知道它想要声明多少(大小)iomem/ioport 地址空间,但它不知道在哪里(偏移量)。只有 BIOS 或 OS 可以告诉设备该位置应该在哪里,因为有人必须与所有 PCI 设备通信并协调它们的 iomem/ioport 地址分配请求,以便分配的地址不会重叠,并且这种协调发生在启动时,或热插拔事件,或在pci rescan 期间。但是,在 Linux 内核代码中,我只找到了一个函数 (pci_read_bases),它读取 BAR 信息,并相应地设置 pci_dev & iomem_resource/ioport_resource,而不更改 BAR。所以问题是:
- 操作系统(Linux 内核)可以更改 BAR 吗?还是只有 BIOS 才能在加载操作系统之前做到这一点?
- 如果内核可以更改 BAR,那么协调地址分配的逻辑在哪里? (我确实看到了像
pbus_assign_resources_sorted这样的函数,但在我看来,该函数只将现有的 BAR 映射到像iomem_resource这样的内核对象,而不是更改 BAR)
【问题讨论】:
标签: c io linux-kernel pci