Segmentacja pamięci
Segmentacja pamięci to technika zarządzania pamięcią systemu operacyjnego polegająca na podziale podstawowej pamięci komputera na segmenty lub sekcje . W systemie komputerowym wykorzystującym segmentację odniesienie do lokalizacji pamięci zawiera wartość, która identyfikuje segment i przesunięcie (lokalizację pamięci) w obrębie tego segmentu. Segmenty lub sekcje są również używane w plikach obiektowych skompilowanych programów, gdy są połączone razem w plik obrazu programu i kiedy obraz jest ładowany do pamięci.
Segmenty zwykle odpowiadają naturalnym podziałom programu, takim jak poszczególne procedury lub tabele danych, więc segmentacja jest generalnie bardziej widoczna dla programisty niż samo stronicowanie . Segmenty mogą być tworzone dla modułów programu lub dla klas użycia pamięci, takich jak segmenty kodu i danych . Niektóre segmenty mogą być współdzielone między programami.
Segmentacja została pierwotnie wymyślona jako metoda, dzięki której oprogramowanie systemowe może izolować procesy oprogramowania ( zadania ) i dane, z których korzystają. Miało to na celu zwiększenie niezawodności systemów obsługujących wiele procesów jednocześnie. W architekturze x86-64 jest to uważane za starsze, a większość nowoczesnego oprogramowania systemowego opartego na architekturze x86-64 nie używa segmentacji pamięci. Zamiast tego obsługują programy i ich dane, wykorzystując stronicowanie pamięci który służy również jako sposób ochrony pamięci. Jednak większość implementacji x86-64 nadal obsługuje go ze względu na kompatybilność wsteczną.
Implementacja sprzętowa
W systemie wykorzystującym segmentację adresy pamięci komputera składają się z identyfikatora segmentu i przesunięcia w segmencie. Jednostka zarządzania pamięcią sprzętową (MMU) jest odpowiedzialna za translację segmentu i przesunięcia na adres fizyczny oraz za przeprowadzanie kontroli, aby upewnić się, że translacja może zostać wykonana i że odwołanie do tego segmentu i przesunięcia jest dozwolone.
Każdy segment ma długość i zestaw uprawnień (na przykład odczyt , zapis , wykonanie ) z nim skojarzony. Proces jest dozwolony przez uprawnienia i jeśli przesunięcie w obrębie segmentu mieści się w zakresie określonym przez długość segmentu. W przeciwnym razie zgłaszany jest wyjątek sprzętowy , taki jak błąd segmentacji .
Segmenty mogą być również wykorzystywane do implementacji pamięci wirtualnej . W tym przypadku każdy segment ma przypisaną flagę wskazującą, czy jest obecny w pamięci głównej, czy nie. W przypadku dostępu do segmentu, którego nie ma w pamięci głównej, zgłaszany jest wyjątek, a system operacyjny wczytuje segment do pamięci z pamięci dodatkowej.
Segmentacja to jedna z metod implementacji ochrony pamięci . Paging jest inny i można je łączyć. Rozmiar segmentu pamięci na ogół nie jest stały i może wynosić zaledwie jeden bajt .
Segmentacja została zaimplementowana na kilka sposobów na różnych urządzeniach, ze stronicowaniem lub bez. Segmentacja pamięci Intel x86 nie pasuje do żadnego modelu i została omówiona osobno poniżej, a także bardziej szczegółowo w osobnym artykule.
Segmentacja bez stronicowania
Z każdym segmentem związana jest informacja, która wskazuje, gdzie segment jest zlokalizowany w pamięci — podstawa segmentu . Gdy program odwołuje się do lokalizacji pamięci, przesunięcie jest dodawane do podstawy segmentu w celu wygenerowania fizycznego adresu pamięci.
Implementacja pamięci wirtualnej w systemie wykorzystującym segmentację bez stronicowania wymaga wymiany całych segmentów między pamięcią główną a pamięcią dodatkową. Gdy segment jest wymieniany, system operacyjny musi przydzielić wystarczającą ilość ciągłej wolnej pamięci, aby pomieścić cały segment. Często fragmentacji pamięci , jeśli nie ma wystarczającej ilości ciągłej pamięci, nawet jeśli w sumie może być jej wystarczająco dużo.
Segmentacja ze stronicowaniem
Zamiast miejsca w pamięci informacja o segmencie zawiera adres tablicy stron dla segmentu. Gdy program odwołuje się do lokalizacji pamięci, przesunięcie jest tłumaczone na adres pamięci przy użyciu tablicy stron. Segment można rozszerzyć, przydzielając kolejną stronę pamięci i dodając ją do tablicy stron segmentu.
Implementacja pamięci wirtualnej w systemie wykorzystującym segmentację ze stronicowaniem zwykle przenosi tylko pojedyncze strony tam iz powrotem między pamięcią główną a pamięcią dodatkową, podobnie jak w systemie stronicowanym bez segmentacji. Strony segmentu mogą znajdować się w dowolnym miejscu w pamięci głównej i nie muszą być ciągłe. Zwykle skutkuje to zmniejszoną ilością danych wejściowych/wyjściowych między pamięcią podstawową i dodatkową oraz zmniejszoną fragmentacją pamięci.
Historia
Komputer Burroughs Corporation B5000 był jednym z pierwszych, który wdrożył segmentację i „być może pierwszym komercyjnym komputerem zapewniającym pamięć wirtualną” opartą na segmentacji. Późniejszy B6500 również zaimplementował segmentację; wersja jego architektury jest nadal używana na serwerach Unisys ClearPath Libra.
Komputer GE-645 , modyfikacja GE-635 z dodaną obsługą segmentacji i stronicowania, został zaprojektowany w 1964 roku do obsługi Multics .
Intel iAPX 432 , rozpoczęty w 1975 roku, próbował zaimplementować prawdziwą architekturę segmentową z ochroną pamięci na mikroprocesorze.
Wersja 960MX procesorów Intel i960 obsługiwała instrukcje ładowania i przechowywania ze źródłem lub miejscem docelowym będącym „deskryptorem dostępu” do obiektu i przesunięciem do obiektu, przy czym deskryptor dostępu znajdował się w rejestrze 32-bitowym i z przesunięciem obliczany z przesunięcia podstawowego w następnym rejestrze oraz z przesunięcia dodatkowego i opcjonalnie rejestru indeksowego określonego w instrukcji. Deskryptor dostępu zawiera bity uprawnień i 26-bitowy indeks obiektu; indeks obiektu jest indeksem do tablicy deskryptorów obiektów, podając typ obiektu, długość obiektu i adres fizyczny dla danych obiektu, tablicę stron dla obiektu lub tablicę stron najwyższego poziomu dla dwupoziomowego tablica stron dla obiektu, w zależności od typu obiektu.
Prime , Stratus , Apollo , IBM System/38 i IBM AS/400 (w tym IBM i ) używają segmentacji pamięci.
Przykłady
Architektura S/370
W modelach IBM System/370 z pamięcią wirtualną (DAT) i adresami 24-bitowymi rejestr kontrolny 0 określa rozmiar segmentu 64 KiB lub 1 MiB i rozmiar strony 2 KiB lub 4 KiB; rejestr kontrolny 1 zawiera oznaczenie tablicy segmentu (STD), które określa długość i rzeczywisty adres tablicy segmentu. Każdy wpis w tablicy segmentu zawiera lokalizację tablicy stron, długość tablicy stron i nieważny bit. IBM później rozszerzył rozmiar adresu do 31 bitów i dodał dwa bity do wpisów w tablicy segmentów:
- Segment-Protection Bit
- Segment jest tylko do odczytu
- Common-Segment Bit
- Segment jest współdzielony między przestrzeniami adresowymi; ten bit jest ustawiony na optymalizację użycia TLB
Każda implementacja IBM DAT zawiera pamięć podręczną tłumaczeń, którą IBM nazwał buforem translacji Lookaside Buffer (TLB). Chociaż Zasady działania omawiają TLB w sposób ogólny, szczegóły nie są częścią architektury i różnią się w zależności od modelu.
Począwszy od zespołów procesorów 3031, 3032 i 3033 , IBM oferował funkcję o nazwie Przestrzeń dwuadresowa (DAS), która umożliwia programowi przełączanie się między tablicami translacji dla dwóch przestrzeni adresowych, określanych jako podstawowa przestrzeń adresowa (CR1) i dodatkowa przestrzeń adresowa przestrzeni adresowej (CR7) oraz do przenoszenia danych pomiędzy przestrzeniami adresowymi podlegającymi ochronie klucza. DAS obsługuje tablicę translacji do konwersji 16-bitowego numeru przestrzeni adresowej (ASN) na STD, z uprzywilejowanymi instrukcjami ładowania STD do CR1 (podstawowy) lub CR7 (pomocniczy).
architektura x86
Segmentacja pamięci używana przez wczesne procesory x86 , począwszy od Intel 8086 , nie zapewnia żadnej ochrony. Każdy program działający na tych procesorach może uzyskać dostęp do dowolnego segmentu bez żadnych ograniczeń. Segment jest identyfikowany tylko przez jego lokalizację początkową; nie ma sprawdzania długości. Ziarnistość adresu początkowego segmentu wynosi 16 bajtów, a przesunięcie wynosi 16 bitów, obsługując rozmiary segmentów do 64 KiB, więc segmenty mogą (i często tak się dzieje) nakładać, a każdy adres fizyczny można oznaczyć za pomocą 4096 par segment-przesunięcie (pozwalając na przesunięcie adresu owinąć).
Segmentacja w Intel 80286 i nowszych zapewnia ochronę: wraz z wprowadzeniem 80286, Intel z mocą wsteczną nazwał jedyny tryb operacyjny poprzednich modeli procesorów x86 „ trybem rzeczywistym ” i wprowadził nowy „ tryb chroniony ” z funkcjami ochrony. Aby zapewnić kompatybilność wsteczną, wszystkie procesory x86 uruchamiają się w „trybie rzeczywistym” bez ochrony pamięci, stałych segmentów 64 KiB i tylko 20-bitowego (1024 KiB) adresowania. Procesor 80286 lub nowszy musi zostać przełączony w inny tryb przez oprogramowanie, aby wykorzystać pełną przestrzeń adresową i zaawansowane funkcje MMU.
Procesory Intel 80386 i nowsze obsługują również stronicowanie; w tych procesorach tablica segmentów zamiast wskazywać tablicę stron segmentu zawiera adres segmentu w pamięci liniowej . Adresy w pamięci liniowej są następnie odwzorowywane na adresy fizyczne przy użyciu oddzielnej tablicy stron, jeśli włączono stronicowanie.
Architektura x86-64 nie wykorzystuje segmentacji w trybie długim (tryb 64-bitowy). W architekturze x86-64 jest to uważane za starsze, a większość nowoczesnego oprogramowania systemowego opartego na architekturze x86-64 nie używa segmentacji pamięci. Zamiast tego obsługują programy i ich dane, wykorzystując stronicowanie pamięci , które służy również jako sposób ochrony pamięci. Chociaż większość implementacji x86-64 nadal obsługuje go ze względu na kompatybilność wsteczną. Cztery z rejestrów segmentowych: CS, SS, DS i ES są wymuszone na 0, a limit na 2 64 . Rejestry segmentowe FS i GS mogą nadal mieć niezerowy adres bazowy. Dzięki temu systemy operacyjne mogą używać tych segmentów do specjalnych celów.
Zobacz też
- Zarządzanie pamięcią (systemy operacyjne)
- Wirtualna przestrzeń adresowa
- Pamięć wirtualna
- Segment danych
- Segment BSS
- Segmentacja pamięci x86
- Błąd segmentacji
- Płaski model pamięci
Notatki
Linki zewnętrzne
- IA-32 Intel Architecture Software Developer's Manual, tom 3A: Podręcznik programowania systemu. http://www.intel.com/products/processor/manuals/index.htm .
- Systemy operacyjne: elementy wewnętrzne i zasady projektowania autorstwa Williama Stallingsa. Wydawca: Prentice Hall. ISBN 0-13-147954-7 . ISBN 978-0-13-147954-8 .