2013-09-26 14 views
14

Które adresowanie jest używane w procesorach x86/x86_64 do buforowania w L1, L2 i L3 (LLC) - fizyczne lub wirtualne (przy użyciu PT/PTE i TLB) iw jakiś sposób wpływa na to PAT(page attribute table)?Fizyczne lub wirtualne adresowanie jest używane w procesorach x86/x86_64 do buforowania w L1, L2 i L3?

Czy w tym przypadku występuje różnica między sterownikami (przestrzeń jądra) a aplikacjami (przestrzeń użytkownika)?

+0

Nie można adresować do pamięci podręcznej. Możesz adresować tylko pamięć. Pamięć podręczna jest obsługiwana przez procesor prywatnie. –

+1

@Kerrek SB Tak, wiem, ale czy cache CPU używa TLB i wszystkich narzutów wirtualnego adresowania czy nie? – Alex

Odpowiedz

28

Odpowiedź na twoje pytanie jest - to zależy. Jest to ściśle decyzja o wyborze procesora, która równoważy kompromis pomiędzy wydajnością i złożonością.

Weźmy na przykład najnowsze procesory Intel Core - są one fizycznie oznaczone i właściwie zindeksowane (co najmniej zgodnie z http://www.realworldtech.com/sandy-bridge/7/). Oznacza to, że pamięci podręczne mogą uzupełniać tylko wyszukiwania w czystej fizycznej przestrzeni adresowej w celu ustalenia, czy linia istnieje, czy nie. Ponieważ jednak L1 to 32k, 8-drożny asocjacyjny, oznacza to, że używa on 64 zestawów, więc potrzebujesz tylko bitów adresowych od 6 do 11, aby znaleźć poprawny zestaw. Tak się składa, że ​​adresy wirtualne i fizyczne są takie same w tym zakresie, więc można wyszukiwać DTLB równolegle z odczytem zestawu pamięci podręcznej - znanego triku (patrz - http://en.wikipedia.org/wiki/CPU_cache).

Teoretycznie można zbudować wirtualny indeks cache z wirtualnym znacznikiem, który usunie wymóg przejścia przez translację adresów (wyszukiwanie TLB, a także przechodzenie stron w przypadku pomyłek TLB). Jednak spowodowałoby to wiele problemów, szczególnie w przypadku aliasów pamięci - przypadek, w którym dwa wirtualne adresy są odwzorowane na ten sam fizyczny.

Załóżmy, że core1 ma adres wirtualny Pamięć podręczna w tak w pełni wirtualnej pamięci podręcznej (odwzorowuje ją na adres fizyczny C, ale tego jeszcze nie zrobiliśmy). core2 zapisuje do wirtualnego addera B, który odwzorowuje na ten sam fizyczny add C - to znaczy, że potrzebujemy jakiegoś mechanizmu (zazwyczaj "snoop", terminu wymyślonego przez Jima Goodmana), który idzie i unieważnia tę linię w core1, zarządzając scalaniem danych i zarządzaniem koherencją Jeśli potrzebne. Jednak core1 nie może odpowiedzieć na to snoop, ponieważ nie wie o adresie wirtualnym B i nie przechowuje fizycznego adresu C w wirtualnej pamięci podręcznej. Widzimy więc, że mamy problem, chociaż dotyczy to głównie ścisłych systemów x86, inne architektury mogą być bardziej luźne i pozwalają na łatwiejsze zarządzanie takimi pamięciami podręcznymi.

Jeśli chodzi o pozostałe pytania - nie ma rzeczywistego połączenia z PAT, o czym mogę pomyśleć, pamięć podręczna jest już zaprojektowana i nie można jej zmienić dla różnych typów pamięci. Ta sama odpowiedź na drugie pytanie - HW jest w większości pod rozróżnieniem między trybem użytkownika/jądra (z wyjątkiem mechanizmów, które zapewnia sprawdzanie zabezpieczeń, głównie różne pierścienie).

+1

Wielkie dzięki! Czy twoim zdaniem, czy istnieje jakaś korzyść wynikająca ze znajomości mechanizmu na platformie x86 i czy ja jako programista o tym wiesz, mogę w jakiś sposób zoptymalizować wydajność mojego programu? – Alex

+2

Absolutnie programista, który nie zna HW, na którym działa, wykonałby niewłaściwą pracę w zakresie optymalizacji (jeśli jest taka potrzeba) lub debugowania (gdy trzeba). Typ adresu odwzorowania pamięci podręcznej jest rzeczywiście trochę niski, chociaż otwiera luk do niektórych ważnych optymalizacji, takich jak wewnętrzna prefekcja SW i konstrukcja uwzględniająca pamięć podręczną). Zobacz ten świetny post na przykładach - http://stackoverflow.com/questions/16699247/what-is-cache-friendly-code. Pojawia się również kwestia wykonywania poza zamówieniem, które może dać pewne wskazówki, i oczywiście różnorodność optymalizacji kompilatora (nie HW, ale także ważne) – Leeor

+0

Mam na myśli - skorzystaj z wiedzy, że w x86: "oni są fizycznie oznaczony i wirtualnie indeksowany " – Alex

Powiązane problemy