4

Быстрый вопрос, я читал страницу OSDev Wiki, касающуюся PCI, и там говорится следующее:

Регистры базовых адресов (или BAR) могут использоваться для хранения адресов памяти, используемых устройством, или смещения для адресов портов. Как правило, BAR адреса памяти должны быть расположены в физической памяти, в то время как BAR пространства ввода / вывода могут находиться в любом адресе памяти (даже за пределами физической памяти).`

Я не понимаю, где написано, что memory address BARs need to be located in physical ram . Весь смысл MMIO состоит в том, что ему присваивается адрес памяти, так что он будет направлен на устройство, а не в физическую память. Что это означает, что он должен быть расположен в физической памяти?

Разве это не просто адрес между адресным пространством от 3 до 4 ГБ, независимо от того, сколько физической памяти установлено?

Это ошибка на сайте OSDev или я неправильно понял?

ссылка - примерно на полпути вниз, под заголовком Регистры базовых адресов

1 ответ1

3

Я полагаю, что здесь есть некоторая путаница, так как есть разница между устройствами ввода-вывода и устройствами, не относящимися к вводу-выводу.
Из википедии Ввод-вывод с отображением в память (MMIO) :

Ввод-вывод с отображением в памяти использует одну и ту же шину адресов для адресации как устройств памяти, так и устройств ввода-вывода - память и регистры устройств ввода-вывода отображаются (связаны с) значениями адресов. Таким образом, когда ЦПУ обращается к адресу, он может относиться к части физической ОЗУ, но он также может относиться к памяти устройства ввода-вывода. Таким образом, инструкции CPU, используемые для доступа к памяти, также могут использоваться для доступа к устройствам. Каждое устройство ввода-вывода контролирует адресную шину ЦП и реагирует на любой доступ ЦП к адресу, назначенному этому устройству, соединяя шину данных с аппаратным регистром нужного устройства. Для размещения устройств ввода / вывода области адресов, используемых ЦП, должны быть зарезервированы для ввода / вывода и не должны быть доступны для обычной физической памяти.

Из вашей статьи:

Регистры базовых адресов (или BAR) могут использоваться для хранения адресов памяти, используемых устройством, или смещения для адресов портов. Как правило, BAR адреса памяти должны быть расположены в физической памяти, в то время как BAR пространства ввода / вывода могут находиться в любом адресе памяти (даже за пределами физической памяти).

образ

В поле «Тип» макета БАР пространства памяти указывается размер базового регистра и место его размещения в памяти. Если он имеет значение 0x00, то базовый регистр имеет ширину 32 бита и может отображаться в любом месте 32-битного пространства памяти. Значение 0x02 означает, что базовый регистр имеет ширину 64 бита и может отображаться в любом месте 64-битного пространства памяти (64-битный регистр базового адреса потребляет 2 из доступных регистров базового адреса).

Таким образом, между ними нет конфликта, так как все зависит от устройства. Если устройство перехватывает ссылку на память на шине, то адрес является виртуальным. Если это не так, то это реальный физический адрес, который используется для связи с устройством (например, NVRAM).

Однако во всех случаях реальный физический адрес используется для устройств ввода-вывода, поскольку в компьютерных инструкциях, которые ссылаются на него, могут использоваться только реальные адреса. Эта память может быть потрачена впустую, если устройство перехватывает ссылки на него. Чтобы избежать таких потерь, операционная система обычно выделяет их за пределы реальной физической памяти (это не вызовет ошибок плохого доступа к памяти, поскольку устройство будет перехватывать все ссылки).

Это является причиной известной проблемы 32-разрядных компьютеров с Windows, которые, по-видимому, не могут использовать все 4 ГБ памяти. Причина была в том, что Windows, будучи 32-разрядной системой, распределяла память устройства с использованием реальных адресов, что затем становилось недоступным для обоих случаев: была ли адресная память действительно использована или неиспользована, поскольку была перехвачена устройством.

Еще одна полезная статья в Википедии: пространство конфигурации PCI.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .