Miejsca na adresy w PCIe

19

Istnieją cztery przestrzenie adresowe w PCI express:

  • Mapowane pamięci
  • Mapowane we / wy
  • Przestrzeń konfiguracji
  • Wiadomość

Czy ktoś może wyjaśnić znaczenie każdej przestrzeni adresowej i jej cel w skrócie?

Według mojego zrozumienia, wszystkie te miejsca są przydzielone do pamięci RAM (tj. Pamięci procesora). Przestrzeń konfiguracji to przestrzeń przydzielona na wspólny zestaw rejestrów (obecny we wszystkich urządzeniach PCIe). Czy to miejsce jest wspólne dla wszystkich urządzeń PCIe? A w jaki sposób jest użyteczny w funkcjonalnym działaniu PCIe?

Ta przestrzeń zawiera BAR (bazowy rejestr adresów). Czy ten rejestr jest używany do określania adresu dostępnego w punkcie końcowym PCIe?

Jestem nowy w PCIe i próbuję się tego nauczyć. Mam na myśli specyfikację Base, ale myślę, że została napisana dla czytelników posiadających wcześniejszą wiedzę na temat PCI i PCIe.

Proszę również odnieść się do niektórych bezpłatnych odnośników online przydatnych w celu przyspieszenia zrozumienia podstawowej specyfikacji. Rozumiem, że ilekroć dowolne urządzenie PCIe podłączone do kompleksu root, zostanie przypisane z pewnym regionem pamięci.

ronex dicapriyo
źródło

Odpowiedzi:

31

Minęło trochę czasu, odkąd o to pytano, ale nienawidzę osieroconych pytań :)

Po pierwsze, uprośćmy nowoczesną platformę x86 i udawajmy, że ma ona 32-bitową przestrzeń adresową od 0x00000000 do 0xFFFFFFFF. Zignorujemy wszystkie obszary specjalne / zarezerwowane, dziury TOLUD (góra niższej użytecznej pamięci DRAM, język Intel) itp. Nazwiemy tę mapę pamięci systemowej .

Po drugie, PCI Express rozszerza PCI. Z punktu widzenia oprogramowania są one bardzo, bardzo podobne.

Przeskoczę na twoją trzecią - przestrzeń konfiguracji - pierwsza. Wszelkie adresy wskazujące na przestrzeń konfiguracji są przydzielane z mapy pamięci systemu . Urządzenie PCI miało 256-bajtową przestrzeń konfiguracyjną - jest to rozszerzenie do 4KB dla PCI express. Ta przestrzeń 4KB zużywa adresy pamięci z mapy pamięci systemowej, ale rzeczywiste wartości / bity / zawartość są generalnie realizowane w rejestrach na urządzeniu peryferyjnym. Na przykład po odczytaniu identyfikatora dostawcy lub identyfikatora urządzenia docelowe urządzenie peryferyjne zwróci dane, nawet jeśli użyty adres pamięci pochodzi z mapy pamięci systemu.

Stwierdziłeś, że są one „przydzielane do pamięci RAM” - nieprawda, rzeczywiste bity / elementy stanu znajdują się w urządzeniu peryferyjnym. Są one jednak mapowane na mapę pamięci systemowej. Następnie zapytałeś, czy jest to wspólny zestaw rejestrów dla wszystkich urządzeń PCIe - tak i nie. Jak działa przestrzeń konfiguracji PCI, na końcu każdej sekcji znajduje się wskaźnik wskazujący, czy jest więcej „rzeczy” do odczytania. Istnieje absolutne minimum, które wszystkie urządzenia PCIe muszą wdrożyć, a następnie bardziej zaawansowane urządzenia mogą zaimplementować więcej. Jeśli chodzi o to, jak przydatny jest do działania funkcjonalnego, jest obowiązkowy i intensywnie wykorzystywany. :)

Teraz twoje pytanie dotyczące BAR (bazowych rejestrów adresów) jest dobrą przestrzenią do segregacji w przestrzeń pamięci i przestrzeń we / wy. Będąc w pewnym stopniu skoncentrowanym na x86, specyfikacja pozwala na określenie rozmiaru BAR, oprócz typu. Dzięki temu urządzenie może zażądać normalnego BAR-a odwzorowanego w pamięci lub BAR-a we / wy, który zjada część 4K przestrzeni we / wy, jaką ma maszyna x86. Zauważysz, że na komputerach PowerPC, paski I / O są bezwartościowe.

BAR to w zasadzie sposób, w jaki urządzenie informuje hosta, ile pamięci potrzebuje i jakiego typu (omówiono powyżej). Jeśli poproszę o powiedzmy 1 MB miejsca zamapowanego w pamięci, BIOS może przypisać mi adres 0x10000000 do 0x10100000. To nie zużywa fizycznej pamięci RAM, wystarczy przestrzeń adresowa (czy rozumiesz teraz, dlaczego w systemach 32-bitowych występują problemy z kartami rozszerzeń, takimi jak wysokiej klasy procesory graficzne z GB pamięci RAM?). Teraz do pamięci PCI Express zostanie wysłany zapis / odczyt pamięci z informacją, że 0x10000004, i może to być bajtowy rejestr, który łączy się z diodami LED. Więc jeśli napiszę 0xFF na adres pamięci fizycznej 0x10000004, to włączy 8 diod LED. Jest to podstawowa zasada operacji we / wy mapowanych w pamięci .

Przestrzeń we / wy zachowuje się podobnie, z tym wyjątkiem, że działa w oddzielnej przestrzeni pamięci, przestrzeni we / wy x86. Adres 0x3F8 (COM1) istnieje zarówno w przestrzeni we / wy, jak i pamięci i są dwiema różnymi rzeczami.

Twoje ostatnie pytanie, komunikaty odnoszą się do nowego rodzaju mechanizmu przerwań, przerwań sygnalizowanych komunikatem lub w skrócie MSI. Starsze urządzenia PCI miały cztery piny przerwania, INTA, INTB, INTC, INTD. Zasadniczo były one zamieniane między gniazdami, tak że INTA poszedł do INTA w gnieździe 0, następnie INTB w gnieździe 1, następnie INTC w gnieździe 2, INTD w gnieździe 3, a następnie z powrotem do INTA w gnieździe 4. Powodem tego jest to, że większość PCI urządzenia zaimplementowały tylko INTA i po zamiataniu, mając powiedzmy trzy urządzenia, każde skończyłoby z własnym sygnałem przerwania do kontrolera przerwań. MSI jest po prostu sposobem sygnalizowania przerwań za pomocą warstwy protokołu PCI Express, a kompleks główny PCIe (host) dba o przerwanie procesora.

Ta odpowiedź może być za późno, aby ci pomóc, ale może pomoże niektórym przyszłym Googler / Binger.

Na koniec polecam przeczytać tę książkę od Intela, aby uzyskać dobre, szczegółowe wprowadzenie do PCIe, zanim przejdziesz dalej. Innym odniesieniem byłby Linux Device Drivers, internetowy ebook od LWN .

Krunal Desai
źródło
Post był bardzo pomocny. Jestem bardzo nowy w PCIe, aby proces wyliczania (alokacja i mapowanie przestrzeni konfiguracji) wymagał wsparcia sterowników, czy może być zainicjowany przez Os.
kamlendra
Dzięki, cieszę się, że było pomocne! Ogólnie rzecz biorąc, na platformach x86 oprogramowanie BIOS dokonuje pewnej alokacji pamięci w oparciu o informacje o przestrzeni konfiguracyjnej, które analizuje z urządzeń PCI. Współczesne systemy operacyjne ogólnie akceptują tę mapę pamięci w obecnej postaci, AFAIK, chociaż one również przechodzą i wyliczają urządzenia, aby załadować odpowiednie sterowniki. Pamiętam, że widziałem kilka interesujących rzeczy na niskim poziomie w Linuksie, które mogłyby potencjalnie zmienić to, co przypisał BIOS.
Krunal Desai
Należy pamiętać, że tylko pamięć oznaczona jako możliwa do pobrania może przesłać więcej niż jeden plik DWORD na transakcję; wszystkie pozostałe spacje mogą przenosić tylko jeden DWORD na transakcję. Rozmiar serii jest ograniczony do MAX_PAYLOAD_SIZE (wykryty podczas wyliczania).
Peter Smith
Witaj. Jestem nowy w PCI i będę chciał trochę wyjaśnić twoją odpowiedź. Stwierdziłeś, że 256b / 4k bajtów przestrzeni konfiguracyjnej jest mapowane do pamięci systemowej. Z mojego własnego korepetycji pomyślałem, że dostęp do przestrzeni konfiguracyjnej jest obsługiwany przez kontroler PCI, który jest statycznie odwzorowany w pamięci systemowej. Ten kontroler zapewnia kilka rejestrów (do identyfikacji urządzenia / funkcji, przesunięcia w przestrzeń adresową, adres wyniku), które służą jako mały interfejs do przestrzeni konfiguracyjnej. W efekcie około 5–10 bajtów jest zarezerwowanych statycznie dla kontrolera PCI. Czy to jest poprawne ???
Cerezo
Tak więc, gdy host (CPU) zapisze w rejestrze pod adresem 0x10000004 wartość 0xFF, kompleks główny PCI pobierze te dane (być może zawsze szukał danych pod dowolnym adresem od 0x10000000 do 0x10100000) i zapisuje je pod adresem 0x04 w punkcie końcowym (urządzenie PCIe)? Czy to zrozumienie jest prawidłowe?
AlphaGoku,