5

Может ли кто-нибудь уточнить разницу между адресами памяти и ввода / вывода на шине PCI / PCIe?

Я понимаю, что адреса ввода-вывода являются 32-разрядными, ограничены диапазоном от 0 до 4 ГБ и не отображаются на системную память (ОЗУ), а адреса памяти являются либо 32-разрядными, либо 64-разрядными.

У меня складывается впечатление, что адресация памяти должна отображаться в доступной оперативной памяти, это правда? Если устройство PCI желает передавать данные по адресу памяти, этот адрес должен существовать в реальном системном ОЗУ (и выделяется во время конфигурации PCI), а не в виртуальной памяти.

Таким образом, если устройству PCI необходимо передавать только небольшой объем данных за раз, когда нет никакой выгоды помещать его в ОЗУ или использовать DMA, тогда адресация ввода / вывода будет хорошей (например, параллельный порт, реализованный на карте PCI),

И почему я продолжаю читать, что адресация ввода / вывода PCI / PCIe устарела в пользу адресации памяти?

Спасибо!

1 ответ1

4

Физическое адресное пространство сегодня огромно благодаря 64-битной адресации. Многие устройства, например AHCI-совместимые контроллеры дисков, требуют, чтобы в регистры устройства отображались довольно большие куски адресного пространства.

Кроме того, адресное пространство IO не доступно с обычными инструкциями ассемблера. Он доступен только со специальными инструкциями, которые могут считывать и записывать в порты ввода-вывода. Это не очень удобно и неэффективно во многих случаях.

Например, упомянутый выше ACPI-совместимый контроллер имеет некоторые функциональные возможности, которые требуют, чтобы процессор выполнил заблокированную операцию чтения-изменения-записи, чтобы изменить один бит в регистре устройства, при условии, что никакие другие ядра не смогут получить доступ и изменить тот же самый регистр между ними. С адресным пространством IO это вообще невозможно.

Еще один момент, на который следует обратить внимание: шина PCI не является уникальной для архитектуры x86. Существуют и другие архитектуры, в которых вообще нет специальной шины ввода-вывода. Поэтому производители устройств предпочитают не использовать адреса ввода-вывода, чтобы оставаться совместимыми с большинством систем. Таким образом, никто не использует адресное пространство IO. Тогда почему бы не сделать де-юре тем, что де-факто уже давно?

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