Прошло некоторое время с тех пор, как об этом спросили, но я ненавижу осиротевшие вопросы :)
Во-первых, давайте упростим современную платформу 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 .