Większość współczesnych systemów dzieli pamięć na strony o rozmiarze 4-64 KB, często z możliwością stosowania tzw. ogromnych stron o rozmiarze 2 MB lub 1 GB (często możliwe są oba warianty). Translacje stron są buforowane w buforze translacji (TLB – translation lookaside buffer). Niektóre systemy, głównie starsze konstrukcje RISC, stosują pułapkę w systemie operacyjnym, gdy tłumaczenie strony nie zostanie znalezione w TLB. Większość systemów używa sprzętowego spaceru po drzewie. Większość systemów pozwala na wyłączenie MMU, ale niektóre z nich wyłączają MMU, gdy wpadają w pułapkę kodu OS.

VAXEdit

Strony VAX-a mają 512 bajtów, co jest bardzo małe. System operacyjny może traktować wiele stron tak, jakby były pojedynczą, większą stroną. Na przykład Linux na VAX grupuje osiem stron razem. W ten sposób system jest postrzegany jako posiadający 4 KB stron. VAX dzieli pamięć na cztery regiony o stałym przeznaczeniu, każdy o rozmiarze 1 GB. Są to:

Przestrzeń P0 Używana na pamięć ogólnego przeznaczenia przeznaczoną dla poszczególnych procesów, taką jak sterty. Przestrzeń P1 (lub przestrzeń kontrolna), która również jest per-procesowa i jest zwykle używana dla stosów nadzorcy, wykonawczego, jądra, użytkownika i innych per-procesowych struktur kontrolnych zarządzanych przez system operacyjny. Przestrzeń S0 (lub przestrzeń systemowa), która jest globalna dla wszystkich procesów i przechowuje kod i dane systemu operacyjnego, stronicowane lub nie, w tym tabele stron. S1 przestrzeń, która jest nieużywana i „Zarezerwowana dla Digital”.

Tablice stronicowania są dużymi tablicami liniowymi. Normalnie byłoby to bardzo marnotrawne, gdy adresy są używane na obu końcach możliwego zakresu, ale tablica stron dla aplikacji jest sama przechowywana w pamięci stronicowanej jądra. Tak więc jest efektywnie dwupoziomowe drzewo, pozwalające aplikacjom na rzadki układ pamięci bez marnowania dużej ilości miejsca na nieużywane wpisy w tablicy stron. VAX MMU jest godny uwagi z powodu braku bitu dostępu. Systemy operacyjne, które implementują stronicowanie muszą znaleźć jakiś sposób na emulację bitu dostępu, jeśli mają działać wydajnie. Zazwyczaj system operacyjny będzie okresowo odmapowywał strony, aby usterki typu page-not-present mogły być wykorzystane do umożliwienia systemowi ustawienia bitu accessed.

ARMEdit

Procesory aplikacji oparte na architekturze ARM implementują MMU zdefiniowane przez architekturę systemu pamięci wirtualnej ARM. Obecna architektura definiuje PTE do opisywania stron 4 KB i 64 KB, sekcji 1 MB i supersekcji 16 MB; starsze wersje definiowały również maleńką stronę 1 KB. ARM używa dwupoziomowej tabeli stron, jeśli używa stron 4 KB i 64 KB, lub tylko jednopoziomowej tabeli stron dla sekcji 1 MB i sekcji 16 MB.

Aktualizacje TLB są wykonywane automatycznie przez sprzęt do chodzenia po tabeli stron. PTE zawierają uprawnienia dostępu do odczytu/zapisu oparte na uprawnieniach, informacje o możliwości buforowania, bit NX i bit niezabezpieczenia.

IBM System/360 Model 67, IBM System/370 i następcyEdit

Multimedialny system IBM System/360 Model 67, który został wprowadzony w sierpniu 1965 roku, zawierał jednostkę MMU zwaną skrzynką dynamicznej translacji adresów (DAT). Ma on niezwykłą cechę przechowywania bitów dostępu i brudnych bitów poza tablicą stron (wraz z czterobitowym kluczem ochronnym dla wszystkich procesorów S/360). Odnoszą się one raczej do pamięci fizycznej niż wirtualnej, a dostęp do nich jest uzyskiwany za pomocą instrukcji specjalnego przeznaczenia. Zmniejsza to obciążenie systemu operacyjnego, który w przeciwnym razie musiałby propagować dostępne i brudne bity z tablic stron do bardziej fizycznie zorientowanej struktury danych. Dzięki temu wirtualizacja na poziomie systemu operacyjnego, później nazwana parawirtualizacją, jest łatwiejsza.

Począwszy od sierpnia 1972 roku, IBM System/370 ma podobną jednostkę MMU, chociaż początkowo obsługiwała tylko 24-bitową wirtualną przestrzeń adresową, a nie 32-bitową wirtualną przestrzeń adresową System/360 Model 67. Przechowuje również bity dostępu i brudne bity poza tablicą stron. Na początku 1983 roku architektura System/370-XA rozszerzyła wirtualną przestrzeń adresową do 31 bitów, a w 2000 roku wprowadzono 64-bitową architekturę z/Architektura z przestrzenią adresową rozszerzoną do 64 bitów; te nadal przechowują bity dostępu i bity brudne poza tablicą stron.

DEC AlphaEdit

Procesor DEC Alpha dzieli pamięć na strony 8 KB. Po pominięciu TLB, kod maszynowy firmware’u niskiego poziomu (zwany tutaj PALcode) przemierza trzypoziomową tablicę stron o strukturze drzewa. Adresy są podzielone w następujący sposób: 21 bitów nieużywanych, 10 bitów do indeksowania poziomu korzenia drzewa, 10 bitów do indeksowania poziomu środkowego drzewa, 10 bitów do indeksowania poziomu liści drzewa oraz 13 bitów, które przechodzą do adresu fizycznego bez modyfikacji. Obsługiwane są pełne bity uprawnień read/write/execute.

MIPSEdit

Architektura MIPS obsługuje od jednego do 64 wpisów w TLB. Liczba wpisów TLB jest konfigurowalna w konfiguracji procesora przed syntezą. Wpisy TLB są podwójne. Każdy wpis TLB mapuje numer strony wirtualnej (VPN2) na jeden z dwóch numerów ramki strony (PFN0 lub PFN1), w zależności od najmniej znaczącego bitu adresu wirtualnego, który nie jest częścią maski strony. Ten bit i bity maski strony nie są zapisywane w VPN2. Każdy wpis TLB ma swój własny rozmiar strony, który może mieć dowolną wartość od 1 KB do 256 MB w wielokrotnościach czterech. Każdy PFN we wpisie TLB ma atrybut buforowania, bit stanu brudnego i ważnego. VPN2 posiada bit stanu globalnego oraz identyfikator przypisany przez system operacyjny, który bierze udział w dopasowaniu wpisu TLB adresu wirtualnego, jeżeli bit stanu globalnego jest ustawiony na zero. PFN przechowuje adres fizyczny bez bitów maski strony.

Wyjątek uzupełnienia TLB jest generowany, gdy w TLB nie ma wpisów, które pasują do odwzorowanego adresu wirtualnego. Wyjątek TLB invalid jest generowany, gdy istnieje dopasowanie, ale wpis jest oznaczony jako nieważny. Wyjątek TLB modified jest generowany, gdy instrukcja store odwołuje się do zmapowanego adresu, a status dirty pasującego wpisu nie jest ustawiony. Jeśli wyjątek TLB wystąpi podczas przetwarzania wyjątku TLB, wyjątku podwójnego błędu TLB, jest on wysyłany do własnego programu obsługi wyjątków.

MIPS32 i MIPS32r2 obsługują 32 bity wirtualnej przestrzeni adresowej i do 36 bitów fizycznej przestrzeni adresowej. MIPS64 obsługuje do 64 bitów wirtualnej przestrzeni adresowej i do 59 bitów fizycznej przestrzeni adresowej.

Sun 1Edit

Oryginalny Sun 1 to komputer jednopłytkowy zbudowany na bazie mikroprocesora Motorola 68000 i wprowadzony na rynek w 1982 roku. Zawiera oryginalną jednostkę zarządzania pamięcią Sun 1, która zapewnia translację adresów, ochronę pamięci, współdzielenie pamięci i przydział pamięci dla wielu procesów działających na procesorze. Cały dostęp procesora do prywatnej pamięci RAM na płycie, zewnętrznej pamięci Multibus, pokładowego wejścia/wyjścia oraz wejścia/wyjścia Multibus przechodzi przez jednostkę MMU, gdzie translacja adresów i ochrona są wykonywane w jednolity sposób. MMU jest zaimplementowana sprzętowo na płycie CPU.

MMU składa się z rejestru kontekstowego, mapy segmentów i mapy stron. Wirtualne adresy z CPU są tłumaczone na adresy pośrednie przez mapę segmentów, które z kolei są tłumaczone na adresy fizyczne przez mapę stron. Rozmiar strony to 2 KB, a rozmiar segmentu to 32 KB, co daje 16 stron na segment. Równolegle może być mapowanych do 16 kontekstów. Maksymalna logiczna przestrzeń adresowa dla jednego kontekstu wynosi 1024 strony lub 2 MB. Maksymalny adres fizyczny, który może być mapowany jednocześnie, to również 2 MB.

Rejestr kontekstowy jest ważny w wielozadaniowym systemie operacyjnym, ponieważ pozwala procesorowi przełączać się między procesami bez przeładowywania wszystkich informacji o stanie translacji. 4-bitowy rejestr kontekstu może przełączać się między 16 sekcjami mapy segmentów pod kontrolą nadzorcy, co pozwala na jednoczesne mapowanie 16 kontekstów. Każdy kontekst ma swoją własną wirtualną przestrzeń adresową. Współdzielenie wirtualnej przestrzeni adresowej i komunikacja międzykontekstowa może być zapewniona przez zapis tych samych wartości do map segmentów lub stron różnych kontekstów. Dodatkowe konteksty mogą być obsługiwane przez traktowanie mapy segmentu jako pamięci podręcznej kontekstów i zastępowanie nieaktualnych kontekstów na zasadzie najmniejszego użycia.

Rejestr kontekstowy nie rozróżnia stanów użytkownika i nadzorcy. Przerwania i pułapki nie przełączają kontekstów, co wymaga, aby wszystkie ważne wektory przerwań były zawsze mapowane na stronie 0 kontekstu, podobnie jak ważny stos nadzorcy.

PowerPCEdit

W PowerPC G1, G2, G3 i G4 strony mają zwykle 4 KB. Po pominięciu TLB, standardowa jednostka MMU PowerPC rozpoczyna dwa równoczesne wyszukiwania. Jedna z nich próbuje dopasować adres do jednego z czterech lub ośmiu rejestrów translacji adresów bloków danych (DBAT) lub czterech lub ośmiu rejestrów translacji adresów bloków instrukcji (IBAT), odpowiednio do sytuacji. Rejestry BAT mogą mapować liniowe fragmenty pamięci o wielkości nawet 256 MB i są zwykle używane przez system operacyjny do mapowania dużych części przestrzeni adresowej na użytek własny jądra systemu operacyjnego. Jeśli wyszukiwanie BAT powiedzie się, inne wyszukiwanie jest wstrzymywane i ignorowane.

Inne wyszukiwanie, nieobsługiwane bezpośrednio przez wszystkie procesory z tej rodziny, odbywa się za pośrednictwem tak zwanej „odwróconej tabeli stron”, która działa jako haszowane rozszerzenie TLB poza układem. Najpierw, cztery górne bity adresu są używane do wyboru jednego z 16 rejestrów segmentowych. Następnie 24 bity z rejestru segmentu zastępują te cztery bity, dając 52-bitowy adres. Zastosowanie rejestrów segmentowych pozwala wielu procesom współdzielić tę samą tablicę haszującą.

52-bitowy adres jest haszowany, a następnie używany jako indeks do tablicy poza chipem. Tam grupa ośmiostronicowych wpisów tabeli jest skanowana w poszukiwaniu jednego, który pasuje. Jeśli żaden nie pasuje z powodu nadmiernych kolizji hashowania, procesor próbuje ponownie z nieco inną funkcją hashowania. Jeśli i to się nie powiedzie, procesor zatrzymuje się w systemie operacyjnym (z wyłączonym MMU), aby problem mógł zostać rozwiązany. OS musi odrzucić wpis z tablicy haszującej, aby zrobić miejsce na nowy wpis. OS może wygenerować nowy wpis z bardziej normalnej, drzewiastej tabeli stron lub z per-mappingowych struktur danych, które prawdopodobnie będą wolniejsze i bardziej efektywne przestrzennie. Wsparcie dla kontroli no-execute jest w rejestrach segmentu, co prowadzi do 256 MB granularity.

Głównym problemem tego projektu jest słaba lokalizacja pamięci podręcznej spowodowana przez funkcję haszowania. Konstrukcje oparte na drzewach unikają tego przez umieszczenie wpisów tablicy stron dla sąsiednich stron w sąsiednich lokalizacjach. System operacyjny działający na PowerPC może zminimalizować rozmiar tablicy haszującej, aby zmniejszyć ten problem.

Nieco powolne jest również usuwanie wpisów tablicy stron procesu. System operacyjny może unikać ponownego użycia wartości segmentów, aby opóźnić zmierzenie się z tym, lub może zdecydować się na cierpienie z powodu marnowania pamięci związanego z per-procesowymi tablicami hash. Układy G1 nie wyszukują wpisów w tablicy stron, ale generują hash, przy czym oczekuje się, że system operacyjny przeszuka standardową tablicę hash za pomocą oprogramowania. System operacyjny może zapisywać do TLB. Chipy G2, G3 i wczesne G4 używają sprzętu do przeszukiwania tablicy hash. Najnowsze układy pozwalają systemowi operacyjnemu na wybór jednej z tych metod. W układach, w których jest to opcjonalne lub w ogóle nie jest obsługiwane, system operacyjny może wybrać wyłącznie tablicę stron opartą na drzewie.

IA-32 / x86Edit

Architektura x86 ewoluowała przez bardzo długi czas, zachowując pełną zgodność oprogramowania, nawet w przypadku kodu systemu operacyjnego. W związku z tym MMU jest niezwykle złożona, z wieloma różnymi możliwymi trybami pracy. Normalne działanie tradycyjnego procesora 80386 i jego następców (IA-32) jest opisane tutaj.

Procesor przede wszystkim dzieli pamięć na strony o rozmiarze 4 KB. Rejestry segmentowe, fundamentalne dla starszych konstrukcji 8088 i 80286 MMU, nie są używane w nowoczesnych systemach operacyjnych, z jednym głównym wyjątkiem: dostępem do danych specyficznych dla wątku dla aplikacji lub danych specyficznych dla procesora dla jądra systemu operacyjnego, co odbywa się przy jawnym użyciu rejestrów segmentowych FS i GS. Każdy dostęp do pamięci wiąże się z rejestrem segmentu, wybieranym w zależności od wykonywanego kodu. Rejestr segmentu działa jako indeks do tabeli, która dostarcza offset, który jest dodawany do adresu wirtualnego. Z wyjątkiem przypadków użycia FS lub GS, system operacyjny zapewnia, że offset będzie wynosił zero.

Po dodaniu offsetu adres jest maskowany, aby nie był większy niż 32 bity. Wynik może być wyszukany poprzez tablicę stron o strukturze drzewa, przy czym bity adresu są dzielone w następujący sposób: 10 bitów dla gałęzi drzewa, 10 bitów dla liści gałęzi, a 12 najniższych bitów jest bezpośrednio kopiowanych do wyniku. Niektóre systemy operacyjne, takie jak OpenBSD z funkcją W^X i Linux z łatkami Exec Shield lub PaX, mogą również ograniczać długość segmentu kodu, określoną przez rejestr CS, aby uniemożliwić wykonanie kodu w modyfikowalnych regionach przestrzeni adresowej.

Mniejsze rewizje MMU wprowadzone z Pentium pozwoliły na bardzo duże strony 4 MB przez pominięcie dolnego poziomu drzewa (pozostawia to 10 bitów na indeksowanie pierwszego poziomu hierarchii strony z pozostałymi 10+12 bitami kopiowanymi bezpośrednio do wyniku). Mniejsze rewizje MMU wprowadzone wraz z Pentium Pro wprowadziły funkcję rozszerzenia adresu fizycznego (PAE), umożliwiającą stosowanie 36-bitowych adresów fizycznych z 2+9+9 bitami dla trójpoziomowych tablic stron i 12 najniższymi bitami kopiowanymi bezpośrednio do wyniku. Duże strony (2 MB) są również dostępne poprzez pominięcie dolnego poziomu drzewa (co daje 2+9 bitów dla dwupoziomowej hierarchii tabel i pozostałe 9+12 najniższych bitów kopiowanych bezpośrednio). Ponadto tabela atrybutów stron pozwalała na określenie możliwości buforowania przez sprawdzenie kilku wysokich bitów w małej tabeli on-CPU.

Obsługa niewykonywania była pierwotnie zapewniona tylko na podstawie per-segmentu, co czyniło ją bardzo niewygodną w użyciu. Nowsze układy x86 udostępniają w trybie PAE bit no-execute na stronę. Opisane powyżej mechanizmy W^X, Exec Shield i PaX emulują obsługę niewykonywania na stronę na maszynach z procesorami x86 pozbawionymi bitu NX przez ustawienie długości segmentu kodu, co powoduje spadek wydajności i zmniejszenie dostępnej przestrzeni adresowej.

x86-64Edit

Heterogeneous System Architecture (HSA) tworzy zunifikowaną wirtualną przestrzeń adresową dla procesorów CPU, GPU i DSP, unieważniając sztuczki z mapowaniem i kopiowaniem danych.

x86-64 to 64-bitowe rozszerzenie x86, które prawie całkowicie usuwa segmentację na rzecz płaskiego modelu pamięci używanego przez prawie wszystkie systemy operacyjne dla procesorów 386 lub nowszych. W trybie długim wszystkie offsety segmentów są ignorowane, z wyjątkiem segmentów FS i GS. Gdy jest używany ze stronami o rozmiarze 4 KB, drzewo tablicy stron ma cztery poziomy zamiast trzech.

Adresy wirtualne są podzielone w następujący sposób: 16 bitów nieużywanych, po dziewięć bitów dla czterech poziomów drzewa (w sumie 36 bitów), a 12 najniższych bitów bezpośrednio kopiowanych do wyniku. W przypadku stron 2 MB są tylko trzy poziomy tablicy stron, co daje w sumie 27 bitów używanych do stronicowania i 21 bitów offsetu. Niektóre nowsze procesory obsługują również stronę 1 GB z dwoma poziomami stronicowania i 30 bitami offsetu.

CPUID może być użyty do określenia, czy strony 1 GB są obsługiwane. We wszystkich trzech przypadkach wymagane jest, aby 16 najwyższych bitów było równe 48-temu bitowi, lub innymi słowy, niskie 48 bitów jest rozszerzone znakiem do wyższych bitów. Robi się to, aby umożliwić przyszłe rozszerzenie zakresu adresowalnego, bez naruszania kompatybilności wstecznej. Na wszystkich poziomach tabeli stron wpis tabeli stron zawiera bit no-execute.

Unisys MCP Systems (Burroughs B5000)Edit

Ta sekcja może być myląca lub niejasna dla czytelników. Prosimy o pomoc w wyjaśnieniu tej sekcji. Może być dyskusja na ten temat na stronie talk. (Wrzesień 2020) (Learn how and when to remove this template message)

Burroughs B5000 z 1961 roku był pierwszym komercyjnym systemem obsługującym pamięć wirtualną (po Atlasie), mimo że nie ma MMU Zapewnia dwie funkcje MMU – wirtualne adresy pamięci i ochronę pamięci – z innym podejściem architektonicznym.

Po pierwsze, w mapowaniu wirtualnych adresów pamięci, zamiast potrzebować MMU, systemy MCP są oparte na deskryptorach. Każdy przydzielony blok pamięci otrzymuje deskryptor główny z właściwościami bloku (tj. rozmiarem, adresem i tym, czy jest obecny w pamięci). Kiedy zgłaszane jest żądanie dostępu do bloku w celu odczytu lub zapisu, sprzęt sprawdza jego obecność za pomocą bitu obecności (pbit) w deskryptorze.

A pbit równy 1 oznacza obecność bloku. W tym przypadku dostęp do bloku jest możliwy poprzez adres fizyczny w deskryptorze. Jeżeli pbit wynosi zero, generowane jest przerwanie dla MCP (systemu operacyjnego) w celu uobecnienia bloku. Jeżeli pole adresu jest równe zero, to jest to pierwszy dostęp do tego bloku i jest on alokowany (init pbit). Jeśli pole adresu jest niezerowe, to jest to adres dyskowy bloku, który wcześniej został wywalczony, więc blok jest pobierany z dysku i pbit jest ustawiany na jeden, a adres pamięci fizycznej aktualizowany, aby wskazywał na blok w pamięci (kolejny pbit). To sprawia, że deskryptory są odpowiednikiem wpisu w tablicy stron w systemie MMU. Wydajność systemu może być monitorowana poprzez liczbę pbitów. Init pbity wskazują na początkowe alokacje, ale wysoki poziom innych pbitów wskazuje, że system może być thrashing.

Wszystkie alokacje pamięci są więc całkowicie automatyczne (jedna z cech nowoczesnych systemów) i nie ma innego sposobu alokacji bloków niż ten mechanizm. Nie istnieją takie wywołania jak malloc czy dealloc, gdyż bloki pamięci są również automatycznie odrzucane. Schemat ten jest również leniwy, ponieważ blok nie zostanie zaalokowany dopóki nie zostanie do niego odwołanie. Gdy pamięć jest prawie pełna, MCP bada zbiór roboczy, próbując kompakcji (ponieważ system jest segmentowany, a nie stronicowany), deallokacji segmentów tylko do odczytu (takich jak segmenty kodu, które mogą być przywrócone z ich oryginalnej kopii) i, w ostateczności, toczenia brudnych segmentów danych na dysk.

Innym sposobem, w jaki B5000 zapewnia funkcję MMU, jest ochrona. Ponieważ wszystkie dostępy odbywają się przez deskryptor, sprzęt może sprawdzić, czy wszystkie dostępy mieszczą się w granicach, a w przypadku zapisu, czy proces ma uprawnienia do zapisu. System MCP jest z natury bezpieczny i dlatego nie potrzebuje MMU do zapewnienia takiego poziomu ochrony pamięci. Deskryptory są tylko do odczytu dla procesów użytkownika i mogą być aktualizowane tylko przez system (sprzętowy lub MCP). (Słowa, których znacznik jest liczbą nieparzystą, są tylko do odczytu; deskryptory mają znacznik 5, a słowa kodowe 3.)

Bloki mogą być współdzielone między procesami przez deskryptory kopii w stosie procesów. W ten sposób niektóre procesy mogą mieć uprawnienia do zapisu, podczas gdy inne nie. Segment kodu jest tylko do odczytu, a więc reentrant i współdzielony między procesami. Deskryptory kopiowania zawierają 20-bitowe pole adresowe podające indeks deskryptora nadrzędnego w tablicy deskryptorów nadrzędnych. W ten sposób zaimplementowano również bardzo wydajny i bezpieczny mechanizm IPC. Bloki mogą być łatwo przenoszone, ponieważ tylko deskryptor główny wymaga aktualizacji, gdy zmienia się status bloku.

Jedynym innym aspektem jest wydajność – czy systemy oparte na MMU czy nie oparte na MMU zapewniają lepszą wydajność? Systemy MCP mogą być zaimplementowane na szczycie standardowego sprzętu, który ma MMU (na przykład standardowy komputer PC). Nawet jeśli implementacja systemu używa MMU w jakiś sposób, nie będzie to w ogóle widoczne na poziomie MCP.

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.