据我所知,(这很可能是错误的,)每个PCI设备都知道要声明多少(大小)iomem / ioport地址空间,但不知道位置(偏移量)。只有BIOS或OS才能告知设备该位置,因为有人必须与所有PCI设备通信并协调其iomem / ioport地址分配请求,以使分配的地址不会重叠,并且这种协调在启动时发生,或热插拔事件,或在pci rescan期间。但是,在Linux内核代码中,我只找到一个函数(pci_read_bases
)来读取BAR信息,并相应地设置pci_read_bases
&pci_dev
/ iomem_resource
,而不更改BAR。所以问题是:
ioport_resource
的函数,但在我看来,该函数仅将现有BAR映射到pbus_assign_resources_sorted
这样的内核对象,而没有更改BAR))据我所知,(这很可能是错误的,)每个PCI设备都知道要声明多少(大小)iomem / ioport地址空间,但不知道位置(偏移量)。仅BIOS或OS可以...
对于正常的静态分配,BIOS会写BAR,而内核会在引导时读取它们。有趣的是动态分配的设备,例如NVMe卡的热插拔。在这种情况下,BIOS必须保留一个范围,以防万一插入的设备在引导时不存在,或者大于被卸下的设备。内核收到中断,必须读取新的BAR值并将其添加到地址空间。例如,请参见pbus_assign_resources_sorted
iomem_resource