Минуло час, як це було задано, але я ненавиджу сирітські питання :)
Спочатку давайте надто спростимо сучасну платформу x86 і зробимо вигляд, що вона має 32 біти адресного простору від 0x00000000 до 0xFFFFFFFF. Ми будемо ігнорувати всі спеціальні / зарезервовані області, TOLUD (вгорі нижня використовувана DRAM, Intel парламент) отвори тощо. Ми будемо називати цю карту системної пам'яті .
По-друге, PCI Express розширює PCI. З програмної точки зору вони дуже і дуже схожі.
Я перейду до вашого третього - конфігураційного простору - першим. Будь-які адреси, які вказують на простір конфігурації, виділяються з карти системної пам'яті . Пристрій PCI мав конфігураційне простір у 256 байт - це розширено до 4 КБ для експресу PCI. Цей простір 4 КБ споживає адреси пам'яті з карти системної пам'яті, але фактичні значення / біти / вміст, як правило, реалізуються в регістрах на периферійному пристрої. Наприклад, коли ви читаєте Ідентифікатор постачальника або Ідентифікатор пристрою, цільовий периферійний пристрій повертає дані, навіть незважаючи на те, що використана адреса пам’яті з карти системної пам'яті.
Ви заявили, що вони "виділені в ОЗУ" - неправда, фактичні біти / стаціонарні елементи знаходяться в периферійному пристрої. Однак вони відображаються в карту системної пам'яті. Далі ви запитали, чи це загальний набір регістрів на всіх пристроях PCIe - так і ні. Те, як працює простір конфігурації PCI, в кінці кожного розділу є вказівник, який вказує, чи є ще "речі" для читання. Існує мінімальний мінімум, який повинні реалізувати всі пристрої PCIe, і тоді більш досконалі пристрої можуть реалізувати більше. Щодо того, наскільки це корисно для функціональної експлуатації, ну, це обов’язково і сильно використовується. :)
Тепер ваше запитання про BARs (базові регістри адрес) є гарним простором для проникнення в простір пам'яті та простір вводу / виводу. Будучи дещо x86 центричним, специфікація дозволяє специфікувати розмір BAR, крім типу. Це дозволяє пристрою запитувати звичайну BAR з картою пам'яті або BAR простору вводу-виводу, яка з'їдає частину 4K простору вводу-виводу, яку має машина x86. Ви помітите, що на PowerPC-машинах простори барів вводу / виводу є марними.
Барабан - це спосіб пристрою повідомити хосту, скільки пам'яті йому потрібно та якого типу (обговорювалося вище). Якщо я попрошу сказати 1 Мб простору, відображеного на пам'яті, BIOS може призначити мені адресу 0x10000000 до 0x10100000. Це не споживає фізичну оперативну пам’ять, просто адресний простір (ви бачите, чому зараз 32-бітні системи стикаються з проблемами з картами розширення, такими як високоякісні GPU, що мають ГБ оперативної пам’яті?). Тепер на пам'ять запису / читання, щоб сказати 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 (хост) піклується про переривання процесора.
Ця відповідь може бути занадто пізно, щоб допомогти вам, але, можливо, вона допоможе майбутньому Googler / Binger.
Нарешті, я рекомендую прочитати цю книгу від Intel, щоб отримати гарне, детальне ознайомлення з PCIe, перш ніж йти далі. Ще однією посиланням будуть драйвери пристроїв Linux, онлайн-електронна книга від LWN .