据我所知,(这很可能是错误的)每个PCI设备都知道它想要声明多少iomem/ioport地址空间,但是它不知道在哪里(偏移)。只有BIOS或OS才能告诉设备应该在哪里,因为有人必须与所有PCI设备交谈,并协调他们的iomem/ioport地址分配请求,这样分配的地址就不会重叠,并且这种协调发生在启动时、热插拔事件或pci rescan期间。但是,在Linux内核代码中,我只找到一个函数(pci_read_bases),它读取条形图信息,并相应地设置pci_dev & iomem_resource/ioport_resource,而不更改条形图。所以问题是:
pbus_assign_resources_sorted这样的函数,但在我看来,该函数只将现有的条映射到iomem_resource之类的内核对象,而不是改变条)发布于 2020-01-17 21:19:28
对于正常的静态分配,BIOS写条,内核在引导时读取它们。有趣的是动态分配的设备,如热插拔的NVMe卡。在这种情况下,BIOS必须保留一个范围,以防设备在启动时不存在或大于已删除的设备。内核得到一个中断,并必须读取新的条形值并将它们添加到地址空间。例如,参见nvme_remap_bar https://elixir.bootlin.com/linux/v5.4/source/drivers/nvme/host/pci.c#L1649
https://stackoverflow.com/questions/59794383
复制相似问题