как это делает BIOS, примерно так: перебираются bus, device, function. для каждого из них считываются размеры требуемых для выделения BARов. от адресуемого 32-битного пространства сверху от 4 Гбайт откусывается 512 Мбайт или 1024 Мбайт (зависит от конкретного BIOS) и методом бинарного поиска вычисляются адреса памяти, в которые может поместиться BAR, таким образом, чтобы адрес был кратен размеру BAR-а. если запрашиваемый размер BAR-ов больше чем откушенные BIOS-ом 512 Мбайт или 1024 Мбайт, то в зависимости от реализации BIOS либо всё виснет, либо устройства с большими BAR прокидываются либо ещё как. построенная карта памяти загоняется в соответствующие bus, device, function.
реализация в linux kernel есть.
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|