Адресні простори в 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.