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 .