Адресні простори в PCIe


19

У експресі PCI є чотири адресні простори:

  • Карту пам'яті
  • I / O відображено
  • Простір конфігурації
  • повідомлення

Може хто-небудь, будь ласка, пояснить значення кожного адресного простору, і його мета коротко?

Як я розумію, ці всі простори розподіляються в оперативній пам'яті (тобто пам'яті процесора). Простір конфігурації - це простір, виділений для загального набору регістрів (присутній у всіх пристроях PCIe). Чи загальний цей простір між усіма пристроями PCIe? І наскільки це корисно для функціональної роботи PCIe?

Цей простір містить BAR (регістр базової адреси). Чи використовується цей регістр, щоб вказати адресу, наявну в кінцевій точці PCIe?

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

Також зверніться до кількох безкоштовних онлайн-посилань, корисних для прискорення розуміння базових специфікацій. Я розумію, що кожного разу, коли будь-який пристрій PCIe, приєднаний до кореневого комплексу, він буде присвоюватися якійсь області пам'яті.

Відповіді:


31

Минуло час, як це було задано, але я ненавиджу сирітські питання :)

Спочатку давайте надто спростимо сучасну платформу 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 .


Пост був дуже корисним. Я дуже новачок у PCIe: Для того, щоб відбувся процес перерахування (розподіл простору і конфігурація COnf), чи потрібна нам підтримка драйверів, чи це може бути ініційовано ОС.
камлендра

Дякую, радий, що це було корисно! Як правило, на платформах x86 програмне забезпечення BIOS здійснює деякий обсяг пам'яті на основі інформації про конфігураційному просторі, яку він аналізує з пристроїв PCI. Сучасні ОС зазвичай приймають цю карту пам'яті такою, якою вона є, AFAIK, хоча вони теж пройдуть і перелічують пристрої для завантаження відповідних драйверів. Я пам’ятаю, що в Linux бачили деякі цікаві речі низького рівня, які могли б дозволити вам змінити те, що призначив BIOS.
Krunal Desai

Зауважте, що лише пам'ять, позначена як попередньо доступна, може передавати більше ніж один DWORD за транзакцію; всі інші пробіли можуть передавати лише один DWORD за транзакцію. Розмір вибуху обмежений MAX_PAYLOAD_SIZE (виявлений під час перерахування).
Пітер Сміт

Привіт. Я новачок у PCI і мені сподобається трохи роз’яснення щодо вашої відповіді. Ви заявили, що 256b / 4k байтів конфігураційного простору відображено в системну пам'ять. З моєї самонавчання я думав, що доступ до конфігураційного простору обробляється через контролер PCI, який статично відображається в системній пам'яті. Цей контролер забезпечує кілька регістрів (для ідентифікації пристрою / функції, зміщення в адресний простір, адреса результату), які служать невеликим інтерфейсом у конфігураційному просторі. Таким чином, фактично лише 5 - 10 байт статично зарезервовано для контролера PCI. Чи це правильно ???
Черецо

Отже, коли хост (CPU) записує в регістр за адресою 0x10000004 значення 0xFF, кореневий комплекс PCI отримає ці дані (можливо, він завжди опитував дані за будь-якою адресою від 0x10000000 до 0x10100000) і запише їх за адресою 0x04 на кінцевій точці (пристрій PCIe)? Чи правильно це розуміння?
AlphaGoku
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.