Насколько я понимаю (что вполне может быть ошибочным), каждое PCI-устройство знает, сколько (размер) адресного пространства iomem / ioport оно хочет получить, но не знает, где (смещение). Только B IOS или ОС могут сообщить устройству, где это место должно быть, потому что кто-то должен общаться со всеми устройствами PCI и координировать свои запросы адресов iomem / ioport allo c, чтобы распределенные адреса не перекрывались, и эта координация происходит во время загрузки или при событии горячего подключения, или во время pci rescan . Однако в коде ядра Linux я нахожу только функцию (pci_read_bases
), которая считывает информацию BAR и устанавливает соответственно pci_dev
& iomem_resource
/ ioport_resource
, не меняя БАРы. Итак, вопросы:
- Может ли ОС (Linux kernel) изменить BAR? Или только B IOS может сделать это перед загрузкой ОС?
- Если ядро может изменить BAR, где находится лог c для координации распределения адресов? (Я видел такие функции, как
pbus_assign_resources_sorted
, но мне кажется, что эта функция только отображает существующие BAR в объекты ядра, такие как iomem_resource
, не изменяя BAR)