Linux内核如何设置PCI BAR,以便没有地址冲突?

问题描述 投票:0回答:1

据我所知,(这很可能是错误的,)每个PCI设备都知道要声明多少(大小)iomem / ioport地址空间,但不知道位置(偏移量)。只有BIOS或OS才能告知设备该位置,因为有人必须与所有PCI设备通信并协调其iomem / ioport地址分配请求,以使分配的地址不会重叠,并且这种协调在启动时发生,或热插拔事件,或在pci rescan期间。但是,在Linux内核代码中,我只找到一个函数(pci_read_bases)来读取BAR信息,并相应地设置pci_read_basespci_dev / iomem_resource,而不更改BAR。所以问题是:

  1. OS(Linux内核)可以更改BAR吗?还是只有BIOS才能在加载操作系统之前做到这一点?
  2. 如果内核可以更改BAR,那么协调地址分配的逻辑在哪里? (我确实看到过类似ioport_resource的函数,但在我看来,该函数仅将现有BAR映射到pbus_assign_resources_sorted这样的内核对象,而没有更改BAR))

据我所知,(这很可能是错误的,)每个PCI设备都知道要声明多少(大小)iomem / ioport地址空间,但不知道位置(偏移量)。仅BIOS或OS可以...

c io linux-kernel pci
1个回答
0
投票

对于正常的静态分配,BIOS会写BAR,而内核会在引导时读取它们。有趣的是动态分配的设备,例如NVMe卡的热插拔。在这种情况下,BIOS必须保留一个范围,以防万一插入的设备在引导时不存在,或者大于被卸下的设备。内核收到中断,必须读取新的BAR值并将其添加到地址空间。例如,请参见pbus_assign_resources_sorted iomem_resource

© www.soinside.com 2019 - 2024. All rights reserved.