Адресные пространства в PCIe

19

В PCI Express есть четыре адресных пространства:

  • Карта памяти
  • I / O отображается
  • Пространство конфигурации
  • Сообщение

Кто-нибудь может объяснить, пожалуйста, значение каждого адресного пространства, и его цель вкратце?

Насколько я понимаю, все эти места выделены в ОЗУ (то есть память процессора). Пространство конфигурации - это пространство, выделенное для общего набора регистров (присутствует во всех устройствах PCIe). Является ли это пространство общим для всех устройств PCIe? И насколько это полезно для работы PCIe?

Это пространство содержит BAR (регистр базового адреса). Этот регистр используется для указания адреса, доступного в конечной точке PCIe?

Я новичок в PCIe, и пытаюсь научиться этому. Я имею в виду базовую спецификацию, но я думаю, что она написана для читателей, имеющих предварительные знания PCI и PCIe.

Также, пожалуйста, обратитесь к некоторым бесплатным онлайн-ссылкам, полезным для ускорения понимания базовой спецификации Я понимаю, что всякий раз, когда любое устройство PCIe подключено с корневым комплексом, ему будет назначен некоторый регион памяти.

Ronex Dicapriyo
источник

Ответы:

31

Прошло некоторое время с тех пор, как об этом спросили, но я ненавижу осиротевшие вопросы :)

Во-первых, давайте упростим современную платформу x86 и представим, что она имеет 32-разрядное адресное пространство от 0x00000000 до 0xFFFFFFFF. Мы будем игнорировать все специальные / зарезервированные области, дыры TOLUD (верхняя часть нижнего уровня используемой памяти DRAM, язык Intel) и т. Д. Мы назовем эту карту системной памяти .

Во-вторых, PCI Express расширяет PCI. С программной точки зрения они очень и очень похожи.

Я перейду к вашему третьему - конфигурационное пространство - первым. Любые адреса, которые указывают на пространство конфигурации, выделяются из карты памяти системы . У устройства PCI было 256-байтовое пространство конфигурации - это увеличено до 4 КБ для PCI Express. Это пространство 4 КБ потребляет адреса памяти из системной карты памяти, но фактические значения / биты / содержимое обычно реализуются в регистрах на периферийном устройстве. Например, когда вы читаете идентификатор поставщика или идентификатор устройства, целевое периферийное устройство возвращает данные, даже если используемый адрес памяти взят из карты памяти системы.

Вы заявили, что они «распределены в ОЗУ» - не соответствует действительности, фактические биты / элементы с состоянием находятся в периферийном устройстве. Тем не менее, они отображаются в карте памяти системы. Затем вы спросили, был ли это общий набор регистров на всех устройствах PCIe - да и нет. Как работает пространство конфигурации PCI, в конце каждого раздела есть указатель, который указывает, есть ли еще «материал» для чтения. Существует минимум, который должны быть реализованы на всех устройствах PCIe, и тогда более продвинутые устройства смогут реализовать больше. Что касается того, насколько он полезен для функциональной работы, он обязателен и интенсивно используется. :)

Теперь ваш вопрос о BAR (регистрах базовых адресов) - хорошее место для перехода в пространство памяти и пространство ввода / вывода. Будучи в некоторой степени ориентированной на x86, спецификация позволяет указывать размер BAR в дополнение к типу. Это позволяет устройству запрашивать обычный отображенный в памяти BAR или BAR пространства ввода-вывода, который потребляет часть 4 КБ пространства ввода-вывода, которое есть у компьютера x86. Вы заметите, что на машинах PowerPC пробелы ввода-вывода бесполезны.

BAR - это, по сути, способ устройства сообщить хосту, сколько памяти ему нужно, и какого типа (обсуждалось выше). Если я запрашиваю, скажем, 1 МБ отображаемой памяти, BIOS может назначить мне адрес от 0x10000000 до 0x10100000. Это не потребление физической ОЗУ, а только адресное пространство (теперь вы понимаете, почему у 32-битных систем возникают проблемы с платами расширения, такими как высокопроизводительные графические процессоры с ГБ ОЗУ?). Теперь запись / чтение в память, скажем, 0x10000004 будет отправлена ​​на устройство PCI Express, и это может быть регистр шириной в байт, который подключается к светодиодам. Поэтому, если я запишу 0xFF на адрес физической памяти 0x10000004, это включит 8 светодиодов. Это основная предпосылка ввода-вывода с отображением в память .

Пространство ввода / вывода ведет себя аналогично, за исключением того, что оно работает в отдельном пространстве памяти, пространстве ввода / вывода x86. Адрес 0x3F8 (COM1) существует как в пространстве ввода-вывода, так и в памяти, и это две разные вещи.

Ваш последний вопрос, сообщения относятся к новому типу механизма прерывания, прерывания с сообщением или MSI для краткости. У устаревших PCI-устройств было четыре контакта прерывания, INTA, INTB, INTC, INTD. Как правило, они были распределены между слотами так, что INTA перешел в INTA в слоте 0, затем INTB в слоте 1, затем INTC в слоте 2, INTD в слоте 3, а затем обратно в INTA в слоте 4. Причина в том, что большинство PCI Устройства реализовали только INTA, и, взяв его, скажем, три устройства, каждое получило бы свой собственный сигнал прерывания на контроллер прерываний. MSI - это просто способ сигнализации прерываний с использованием уровня протокола PCI Express, а корневой комплекс PCIe (хост) заботится о прерывании ЦП.

Этот ответ может быть слишком поздно, чтобы помочь вам, но, возможно, он поможет будущему Гуглеру / Бингеру.

Наконец, я рекомендую прочитать эту книгу от Intel, чтобы получить хорошее, подробное введение в PCIe, прежде чем идти дальше. Другим справочником может стать Linux Device Drivers, электронная книга от LWN .

Крунал Десаи
источник
Сообщение было весьма полезным. Я очень новичок в PCIe, для того, чтобы произошел процесс перечисления (распределение пространства конфигурации и сопоставление), нужна ли нам поддержка драйверов или она может быть инициирована Os.
Камлендра
Спасибо, рад, что это было полезно! Как правило, на платформах x86 программное обеспечение BIOS выделяет определенное количество памяти на основе информации о пространстве конфигурации, которую он анализирует с устройств PCI. Современные операционные системы обычно принимают эту карту памяти как есть, AFAIK, хотя они также проходят и перечисляют устройства для загрузки соответствующих драйверов. Я помню некоторые интересные вещи низкого уровня в Linux, которые могли бы позволить вам потенциально изменить то, что назначил BIOS.
Крунал Десаи
Обратите внимание, что только память, помеченная как предварительно извлекаемая, может передавать более одного DWORD за транзакцию; все остальные пространства могут передавать только одно DWORD за транзакцию. Размер пакета ограничен MAX_PAYLOAD_SIZE (обнаружен во время перечисления).
Питер Смит
Здравствуйте. Я новичок в PCI и хотел бы немного разъяснений по поводу вашего ответа. Вы заявили, что 256b / 4k байтов пространства конфигурации отображаются в системную память. Из моего самообучения я думал, что доступ к пространству конфигурации осуществляется через контроллер PCI, который статически отображается в системную память. Этот контроллер предоставляет несколько регистров (для идентификации устройства / функции, смещения в адресное пространство, адрес результата), которые служат небольшим интерфейсом в пространстве конфигурации. Таким образом, для контроллера PCI статически зарезервировано только 5-10 байт. Это правильно ???
Сересо
Таким образом, когда хост (ЦП) записывает в регистр по адресу 0x10000004 значение 0xFF, корневой комплекс PCI будет извлекать эти данные (возможно, он всегда запрашивал данные по любому адресу от 0x10000000 до 0x10100000) и записывает их по адресу 0x04 в конечной точке (устройство PCIe)? Это понимание правильно?
AlphaGoku