Czy spacery po tabelach stron są buforowane?

12

Na mikroprocesorze ze sprzętowym zarządzaniem TLB (powiedzmy Intel x86-64), jeśli wystąpi błąd TLB, a procesor idzie po tablicy stron, czy dostęp do pamięci (poza układem) przechodzi przez hierarchię pamięci podręcznej (L1, L2 itp.) )?

Ritter
źródło
Nie ma nic wspólnego z projektowaniem elektronicznym. Pytanie zostanie zamknięte.
Leon Heller
8
Pyta, jak działają poszczególne żetony, więc myślę, że dotyczy to tematu.
Olin Lathrop,
5
@OlinLathrop: Zgadzam się: Myślę, że szczegóły niskiego poziomu układu scalonego dotyczą tematu.
davidcary
Muszę się zgodzić, że debugowanie funkcji naszych procesorów jest ważnym krokiem do zaprojektowania przyzwoicie deterministycznego systemu. Zbliża się to do jednej z naszych granic, ale wydaje się mocno w środku.
Kortuk

Odpowiedzi:

8

Tak, o ile mi wiadomo, w procesorach Intel x86-64, gdy wystąpi brak TLB i procesor idzie po tablicy stron, dostęp do pamięci poza układem przechodzi przez hierarchię pamięci podręcznej.

Nadal jestem trochę rozmyślany nad kilkoma szczegółami i mam nadzieję, że wypełni je inna odpowiedź - czy nie ma instrukcji Intela lub AMD, która opisuje spacer po stronach z niesamowitymi szczegółami? Rozumiem, że:

  • Adres wirtualny w jakimś rejestrze adresów jest najpierw przekazywany do szybkiego TLB w celu przekształcenia go w adres fizyczny - adres w komputerze jest przekazywany do L1 ITLB, adres w innym rejestrze jest przekazywany do L1 DTLB .
  • Jeśli pierwsze wyszukiwanie nie powiedzie się, podejmowany jest kolejny poziom wolniejszej, większej TLB. (Czy ta TLB L2 jest również podzielona na ITLB i DTLB, czy też jest to zunifikowana pamięć podręczna TLB? Czy istnieją dalsze poziomy TLB - L3? L4?)
  • Jeśli wyszukiwanie TLB całkowicie się nie powiedzie, a walker VHPT x86 i x86-64 jest wyłączony, procesor sygnalizuje błąd braku TLB, który jest przechwytywany przez jądro systemu operacyjnego. Rozumiem, że praktycznie wszystkie procesory inne niż x86 robią to samo - zajmują się całkowicie brakami TLB w oprogramowaniu. Jeśli ta opcja jest włączona, procesory x86 i x86-64 mają wspomaganą sprzętowo platformę VHPT, która obsługuje kilka kolejnych kroków. (Czy układy x86 i x86-64 mają jeden bit, który całkowicie wyłącza VHPT, czy też istnieje wiele bitów, które mogą włączyć VHPT dla niektórych zakresów adresów i wyłączyć VHPT dla innych zakresów adresów? Gdzie znajdują się te bity?)
  • jeśli wyszukiwanie TLB całkowicie się nie powiedzie, oryginalny (prawdopodobnie w trybie użytkownika) adres wirtualny V1 jest konwertowany na V2, adres wirtualny PTE wpisu tablicy strony, który przechowuje fizyczny numer strony dla V1.
  • Ponieważ V2 jest ponownie adresem wirtualnym, CPU przechodzi przez normalne tłumaczenie adresu wirtualnego na fizyczny, z tym wyjątkiem, że pomija L1 i przechodzi bezpośrednio do L2.
  • Sprzęt wyszukuje adres wirtualny V2 w TLB równolegle z pobieraniem tego PTE z (wirtualnie indeksowanej) pamięci podręcznej L2.
  • Ponieważ V2 nie jest adresem instrukcji, nie przechodzi przez pamięć podręczną instrukcji L1; a ponieważ V2 nie jest adresem normalnych danych użytkownika, nie przechodzi przez pamięć podręczną danych L1. V2 jest początkowo podawany do zunifikowanej pamięci podręcznej L2 (zunifikowana instrukcja + dane + pamięć podręczna PTE). Zobacz „przykład hierarchii pamięci podręcznej” .
  • Jeśli pamięć podręczna L2 (lub L3 lub jakakolwiek inna indeksowana wirtualnie pamięć podręczna) zawiera PTE, wówczas VHPT pobiera PTE z pamięci podręcznej i instaluje PTE dla V1 w TLB, a adres fizyczny w tym PTE jest używany do tłumaczenia oryginalny wirtualny adres V1 do fizycznego adresu RAM, ostatecznie pobierając te dane lub instrukcje całkowicie sprzętowo bez żadnej pomocy systemu operacyjnego.
  • Jeśli wszystkie poziomy wirtualnie indeksowanej pamięci podręcznej zawiodą, ale drugie wyszukiwanie TLB zakończy się powodzeniem dla V2, wówczas VHPT pobiera PTE z fizycznie indeksowanej pamięci podręcznej lub z pamięci głównej, instaluje PTE dla V1 w TLB i adres fizyczny w tym PTE służy do tłumaczenia oryginalnego adresu wirtualnego V1 na fizyczny adres RAM, ostatecznie pobierając te dane lub instrukcje całkowicie sprzętowo, bez żadnej pomocy ze strony systemu operacyjnego.
  • Jeśli to drugie wyszukiwanie TLB nie powiedzie się, sprzętowy walker VHPT rezygnuje z BŁĘDU TRANSLACJI VHPT.
  • Gdy wystąpi BŁĄD TRANSLACJI VHPT, procesor pułapkuje na system operacyjny. System operacyjny musi dowiedzieć się, co poszło nie tak i naprawić:
  • (a) być może strona zawierająca V2 jest obecnie zamieniona na dysk, więc system operacyjny wczytuje ją do pamięci RAM i ponownie uruchamia nieudaną instrukcję, lub
  • (b) być może błędny program próbuje odczytać, zapisać lub wykonać jakąś nieprawidłową lokalizację, a system operacyjny przerywa proces lub
  • (c) wiele innych sztuczek, które piszący OS robią, aby użyć tego mechanizmu do pułapkowania różnych rodzajów dostępu - załaduj stronę zawierającą V1, którą można zamienić na dysk; różne pułapki używane do debugowania nowych programów; symulować „W ^ X” na procesorach, które nie obsługują go bezpośrednio; do obsługi kopiowania przy zapisie; itp.

Schemat na stronie 2 Thomasa W. Barra, Alana L. Coxa, Scotta Rixnera. „Caching Translation: Skip, Don't Walk (the Page Table)”, który wyznacza linię między „Wpisami zapisanymi przez pamięć podręczną MMU” a „Wpisami zapisanymi przez bufor danych L2”. (Może to być przydatny artykuł dla osób projektujących nowe procesory , co jest całkowicie tematem „Projektowanie elektroniki”).

Stephane Eranian i David Mosberger. „Pamięć wirtualna w jądrze systemu Linux IA-64” i Ulrich Drepper. „Co każdy programista powinien wiedzieć o pamięci” (może to być przydatny artykuł dla osób piszących systemy operacyjne, które zajmują się tabelą stron IA-64, co jest nieco nie na temat ED - być może przepełnienie stosu przez „ system ” lub tag „ osdev ” lub wiki OSDev.org byłoby lepszym miejscem na ten temat).

Tabela A-10 na stronie 533 firmy Intel. „Intel® 64 and IA-32 Architectures Software Developer's Manual” „PAGE_WALKS.CYCLES ... może wskazywać, czy większość przechodzeń stron jest zadowolona z pamięci podręcznej, czy może powodować brak pamięci podręcznej L2”.

Davidcary
źródło
Uwielbiam tę odpowiedź, ale prawdopodobnie jestem jedną z wielu osób, które nie mają wymaganej wiedzy specjalistycznej, aby czuć się komfortowo, dając coś, co jest prawdopodobnie zasłużoną oceną. Gdy inni eksperci sprawdzą, dam przedstawicielowi, który już zarobiłeś.
Kortuk
Nie wierzę, że to prawda. Punkt 1 + 2 dotyczący wyszukiwania TLB jest poprawny AFAICT, ale 3 nie. Ścieżki tabeli stron na x86 (lub x86-64) nie są obsługiwane w oprogramowaniu (obowiązuje wyjątek, zobacz później), ale w sprzęcie. To znaczy, gdy CPU stwierdzi, że nie może rozwiązać adresu przy użyciu TLB, sam przejdzie po tabelach stron, zaczynając od tabeli wskazanej przez rejestr CR3. Tylko wtedy, gdy ta rozdzielczość nie powiedzie się, wywoła procedurę obsługi błędów strony procesora. Wyjątkiem są rozszerzenia wirtualizacji, w których w niektórych trybach hiperwizor rozwiązuje błąd strony występujący u gościa.
Morty
Nie sądzę, że x86 ma sposób na aktualizację oprogramowania TLB. ISA, które pozwalają na obsługę miękkiego TLB, mają specjalne instrukcje dla SW do modyfikowania wpisów TLB, ale nie sądzę, że x86 ma to, oprócz invlpgunieważnienia jakiegokolwiek buforowania TLB dla danego adresu virt. Jeśli podczas przeglądania strony HW nie znajdzie wpisu dla tego adresu wirtualnego lub uprawnienia do wpisu nie zezwalają na dostęp, otrzymasz #PFwyjątek. System operacyjny radzi sobie z tym, aktualizując tabelę stron (być może po stronicowaniu danych z dysku lub wykonując kopiowanie przy zapisie), a następnie wznawiając, aby ładowanie / przechowywanie z błędem uruchomiło się ponownie i powiodło przejście do HW.
Peter Cordes,
Powiązane: Co dzieje się po braku LB TL2?
Peter Cordes,
4

Zgadzam się, że należy to do wymiany stosów architektury komputerowej, a nie wymiany stosów elektronicznych, ale ponieważ jest to tutaj:

@davidcary jest poprawny.

Trochę historii:

Spacery po tablicach stron Intel x86 NIE były buforowane aż do P5, czyli Pentium. Mówiąc dokładniej, dostępy do pamięci obszaru spacer po tablicy stron nie były buforowane, pomija się pamięć podręczną. Ponieważ większość maszyn do tego czasu była zapisywana, otrzymywały wartości zgodne z pamięcią podręczną. Ale nie węszyli skrzynek.

P6, aka Pentium Pro i AFAIK, wszystkie kolejne spacery po tabelach stron procesorów mogły uzyskać dostęp do bufora i używać wartości pobranej z bufora. Dlatego pracowali z buforami zapisu. (Można oczywiście umieścić tabele stron w pamięci nieuleczalnej, zdefiniowanej np. Przez MTRR. Jest to jednak duża utrata wydajności, chociaż może być użyteczna przy debugowaniu systemów operacyjnych.)

Nawiasem mówiąc, ten „dostęp do pamięci strony tabeli stron może uzyskiwać dostęp do pamięci podręcznej danych” jest odrębny od „pozycji tabeli stron mogą być przechowywane (buforowane) w buforze Lookaside TLB Ttranslation”. Na niektórych komputerach TLB nazywa się „pamięcią podręczną tłumaczenia”.

Innym powiązanym problemem jest to, że wewnętrzne węzły tabel stron mogą być buforowane w jeszcze większej liczbie struktur danych podobnych do TLB, np. Pamięci podręcznej PDE.

Jedna kluczowa różnica: pamięć podręczna danych jest spójna i szpiegowana. Ale pamięci podręczne TLB i PDE nie są podsłuchiwane, tzn. Nie są spójne. Najważniejsze jest to, że ponieważ tabele stron mogą być buforowane w niespójnych buforach TLB i PDE itp., Oprogramowanie musi jawnie opróżniać poszczególne wpisy lub grupy zbiorcze (jak cała TLB), gdy wpisy w tablicy stron mogą być tak buforowane są zmieniane. Przynajmniej po zmianie w „niebezpieczny” sposób, przechodząc z RW-> R-> I lub zmieniając adresy.

Myślę, że można uczciwie powiedzieć, że za każdym razem, gdy dodawany jest nowy rodzaj niespójnego buforowania podobnego do TLB, niektóre systemy operacyjne ulegają awarii, ponieważ domyślnie zakładają, że tak się nie dzieje.

Krazy Glew
źródło
Nowa komp. łuk. se propozycja rozpoczęła się „3 miesiące temu”. Myślę, że był wcześniejszy, który nigdy nie wyszedł poza obszar51 (za mało obserwujących?).
Paul A. Clayton