Temat 07 - Okreslenie przestrzeni adresowej komputera

www.scritube.com/limba/poloneza/Budowa-komputera75244.php

 

 Przed analizą związaną z pracą procesora w trybie rzeczywistym i chronionym zdefiniowania wymagają dwa stosowane dalej pojęcia.
 

Określenie: Adres widziany przez program nazywamy adresem logicznym. Zbiór wszystkich adresów logicznych tworzy tzw. logiczną przestrzeń adresową.
Określenie: Adres, który trafia na szynę adresową pamięci fizycznie występującej w komputerze nazywamy adresem fizycznym.

Praca procesora w trybie rzeczywistym

Firma INTEL wprowadzając swoje procesory 16-bitowe 8080 i 8086 zastosowała adres logiczny składający się z dwóch części (mówimy o dwuwymiarowej logicznej przestrzeni adresowej):

  • 16 bitowej części segmentowej (zawartość jednego z rejestrów segmentowych )
  • 16 bitowego przemieszczenia (adres efektywny),

co zapisujemy w postaci:

część segmentowa : przemieszczenie

Procesor 8086 posiadał 20 bitową szynę adresową a zatem opierał się na 20 bitowym adresie fizycznym. Adres ten był obliczany według następującej reguły:

adres fizyczny = część segmentowa*16 + przemieszczenie

Oznacza tą, że przemieszczenie dodaje się do części segmentowej przesuniętej o 4 bity w lewo, co daje adres 20 bitowy, którym można zaadresować 220 = 1048576 bitów = 1MB pamięci operacyjnej RAM.


Rys. 13.1. Układ generacji adresu fizycznego w trybie rzeczywistym.(zobacz jak )

Interpretacja takiego sposobu generowania adresu fizycznego jest została zilustrowana na rys. 13.2. Zawartość rejestru segmentowego przemnożona przez 16 podaje nam adres początku danego segmentu w pamięci. Od tego początku odsuwamy się o ilość komórek podaną w adresie efektywnym. Ponieważ adres efektywny jest liczbą 16-bitową, maksymalna odległość odczytywanej komórki od początku segmentu wynosi 216=65536 B (przy założeniu bajtowej długości komórek), czyli 64 KB. Pamięć jest więc wi-dziana przez procesor poprzez okno wielkości 64 KB. Okno to można przesuwać, przeładowując rejestry segmentowe, jednakże ze skokiem nie mniejszym niż 16 B (bo zawartość rejestru segmentowego mnożymy przez 16). W ramach ustalonego okna komórkę pamięci, na której zostanie wykonana operacja, wybieramy przy pomocy adresu efektywnego.

Rys.13.2. Interpretacja adresowania pamięci w trybie rzeczywistym

Adresy często zapisuje się w systemie heksadecymalnym: wówczas 16 bitowa część segmentowa ma 4 cyfry i tyle samo cyfr ma część przemieszczenia. W 1MB przestrzeni adresowej można wyróżnić 16 segmentów po 64kB Każdy z nich ma swoje określone zastosowanie a także zaczyna się i kończy adresami, które podajemy heksadecymalnie w postaci segmentowej oraz liniowej. Dane te zestawiono w Tablicy 13.1.
 

Tablica 13.1. Segmenty pamięci komputerów klasy IBM PC (80886) w trybie rzeczywistym
NUMER
ADRES POCZĄTKU
ADRES KOŃCA
ZASTOSOWANIE
LOGICZNY
FIZYCZNY
LOGICZNY
FIZYCZNY
0H
0000H:0000H 00000H 0000H:FFFFH 0FFFFH Programy użytkownika
1H
1000H:0000H 10000H 1000H:FFFFH 1FFFFH Programy użytkownika
2H
2000H:0000H 20000H 2000H: FFFFH 2FFFFH Programy użytkownika
3H
3000H:0000H 30000H 3000H: FFFFH 3FFFFH Programy użytkownika
4H
4000H:0000H 40000H 4000H: FFFFH 4FFFFH Programy użytkownika
5H
5000H:0000H 50000H 5000H: FFFFH 5FFFFH Programy użytkownika
6H
6000H:0000H 60000H 6000H: FFFFH 6FFFFH Programy użytkownika
7H
7000H:0000H 70000H 7000H: FFFFH 7FFFFH Programy użytkownika
8H
8000H:0000H 80000H 8000H: FFFFH 8FFFFH Programy użytkownika
9H
9000H:0000H 90000H 9000H: FFFFH 9FFFFH Programy użytkownika
AH
A000H:0000H A0000H A000H: FFFFH AFFFFH Pamięć ekranu
BH
B000H:0000H B0000H B000H: FFFFH BFFFFH Pamięć ekranu
CH
C000H:0000H C0000H C000H: FFFFH CFFFFH BIOS – rozszerzenie
DH
D000H:0000H D0000H D000H: FFFFH DFFFFH BIOS – rozszerzenie
EH
E000H:0000H E0000H E000H: FFFFH EFFFFH BIOS
FH
F000H:0000H F0000H F000H: FFFFH FFFFFH BIOS


Praca procesora w trybie wirtualnym chronionym

Jeżeli szyna adresowa procesora ma 32 bity wówczas istnieje możliwość fizycznego zaadresowania pamięci nie tylko do 1MB jak to ma miejsce w omówionym trybie rzeczywistym ale aż do 232 = 4GB. Gdyby rozciągnąć możliwości trybu rzeczywistego z translacją adresu przedstawioną wyżej na 32 bity, taki byłby też wymiar logicznej przestrzeni adresowej. Jednak jeżeli użyje się trybu wirtualnego pracy procesora przestrzeń logiczna pamięci może być dużo większa., a niedostatek przestrzeni fizycznej można uzupełnić mechanizmem tzw. pamięci wirtualnej.
W trybie wirtualnym chronionym (protected virtual address mode) pracy procesora adres logiczny składa się, podobnie jak w trybie rzeczywistym z

  • 16 bitowej części segmentowej nazywanej selektorem segmentu
  • 32 bitowego przemieszczenia.

Zbiór wszystkich adresów logicznych tworzy logiczną przestrzeń adresową. Natomiast dwuwymiarowa budowa adresu logicznego prowadzi do podziału pamięci na segmenty zwanego segmentacją przestrzeni logicznej. Teoretycznie umożliwia ona zaadresowanie przestrzeni logicznej obejmującej 248 adresów logicznych czyli 256 TB (terabajtów). W praktyce nie wszystkie bity części segmentowej są wykorzystywane do adresowania.
Selektor segmentu zawiera następujące pola:

  • numer deskryptora segmentu (13 bitów) będący indeksem do tablicy deskryptorów
  • kod TI typu tablicy deskryptorów: g1obala/lokalna (1 bit)
  • poziom ochrony zadania żądającego dostępu do pamięci (2 bity)

Numer deskryptora wskazuje na odpowiednią pozycję w tablicy deskryptorów.
Tablica deskryptorów składa się z = 8192 pól zwanych deskryptorami segmentów po 23 = 8 bajtów na każdy deskryptor. Zajmuje ona zatem jeden segment o objętości 216 = 64kB. Deskryptory segmentów wchodzące w skład tej tablicy stanowią pełny opis segmentu pamięci w trybie wirtualnym. Każdy deskryptor segmentu zawiera następujące pola:

  • adres bazowy segmentu (32 bity)
  • wielkość segmentu (20 bitów)
  • atrybuty
  • czy segment obecny fizycznie w pamięci (1 bit),
  • pole dostępne dla programu (1 bit),
  • poziom ochrony (2 bity).,
  • ziarnistość segmentu (segment o długości 220 = 1MB lub 232 = 4GB) (1 bit),
  • długość słowa (1 hit),
  • czy segment pamięci (1 bit)
  • typ segmentu (kodu/danych/odczyt/zapis) (3 bity),
  • czy segment użyty (1 bit)

Translacja dwuwymiarowego adresu logicznego złożonego z selektora segmentu i przemieszczenia na 32 bitowy adres liniowy w fizycznej przestrzeni adresowej przebiega za pomocą wprowadzonych struktur adresujących:

  • przemieszczenia,
  • selektora segmentu,
  • tablic deskryptorów.

Sposób translacji pokazano na rys. 13.3.
Bity 3 - 15 selektora segmentu (w adresie logicznym) indeksują tablicę deskryptorów wybierając jeden konkretny deskryptor segmentu. Z deskryptora tego wybiera się 32 bitowy adres bazowy segmentu. Po dodaniu do adresu bazowego segmentu 32 bitowego przemieszczenia (z adresu logicznego) otrzymujemy 32 bitowy adres liniowy w liniowej przestrzeni adresowej. Liniowa przestrzeń adresowa obejmuje 232 = 4GB a wiec (powiedzmy na razie) tyle ile mamy do dyspozycji pamięci fizycznej. Jest to jednak wielokrotnie mniej niż wynosi rozmiar przestrzeni adresów logicznych widzianych i wykorzystywanych przez zadanie (program).

Rys. 13.3. Uproszczony schemat translacji adresu logicznego na liniowy w trybie wirtualnym

Ponadto w deskryptorze segmentu mamy informację o długości segmentu pozwalającą na znalezienie adresu liniowego końca segmentu. W ten sposób otrzymujemy trzy charakterystyczne adresy liniowe związane z segmentem:

  • adres liniowy pewnej komórki segmentu = adres bazowy segmentu + przemieszczenie,
  • adres liniowy początku segmentu = adres bazowy segmentu,
  • adres liniowy końca segmentu adres bazowy segmentu + wielkość segmentu.

Jeżeli przemieszczenie wypadnie większe od wielkości segmentu to procesor automatycznie wykryje błąd przekroczenia segmentu i przejdzie w tryb obsługi tego błędu (tzw. wyjątek). Jest to cecha trybu wirtualnego dająca mu wielką przewagę nad trybem rzeczywistym, w którym błędne adresy bliskie przemieszczenia) mogły doprowadzić do zamazania sąsiednich, niechronionych segmentów powodując zniszczenie danych lub programu.



Praktyczna realizacja tablic deskryptorów w 32 bitowych procesorach

W praktyce procesor zapewnia jednoczesny dostęp nie do jednej, jak pokazaliśmy w uproszczeniu na rys.13.3., ale dwóch tablic deskryptorów:

  • Lokalnej Tablicy Deskryptorów
  • Globalnej Tablicy Deskryptorów.

Każda z nich zajmuje 1 segment. Obecność dwóch tablic umożliwia wygodną gospodarkę pamięcią i ochronę danych w systemach wielozadaniowych.
Tablica globalna zawiera deskryptory segmentów pamięci logicznej, które są wspólna własnością wszystkich zadań przede wszystkim są to tzw. segmenty systemowe.
Tablica lokalna jest własnością aktualnie wykonywanego zadania i zawiera deskryptory segmentów pamięci, które mogą być do jego dyspozycji.
W pamięci logicznej będzie znajdowało się wiele Lokalnych Tablic Deskryptorów należących do różnych zadań. Wszystkie one będą segmentami systemowymi i będą miały swoje deskryptory w tablicy globalnej. Wybierając zadanie wybieramy jednocześnie indeks do tablicy globalnej, który wskaże i zlokalizuje w pamięci liniowej jedna tablice lokalną przeznaczona do użycia w danej chwili.
Aby zlokalizować położenie tablic deskryptorów aktualnie używanych wprowadzono do procesora dwa rejestry:

  • Rejestr Globalnej Tablicy Deskryptorów zawierający pola:
    • adres bazowy Globalnej Tablicy Deskryptorów
    • wielkość Globalnej Tablicy Deskryptorów
  • Rejestr Lokalnej Tablicy Deskryptorów zawierający pola:
    • selektor stanowiący indeks do Globalnej Tablicy Deskryptorów na pozycję, gdzie znajduje się deskryptor segmentu zawierającego Lokalną Tablicę Deskryptorów właściwą dla danego zadania,
    • rejestr podręczny na adres bazowy lokalnej tablicy deskryptorów (32 bity),
    • rejestr podręczny na wielkość lokalnej tablicy deskryptorów (16 bitów),
    • rejestr podręczny na atrybuty lokalnej tablicy deskryptorów.

W czasie pracy procesora (w jednym zadaniu) może być dostępna jedna Globalna Tablica Deskryptorów zlokalizowana przez zawartość Rejestru Globalnej Tablicy Deskryptorów (adres bazowy i wielkość) oraz jedna tablica lokalna zdefiniowana przez odpowiednio załadowany selektor w Rejestrze Lokalnej Tablicy Deskryptorów. Selektor ten stanowi indeks do Globalnej Tablicy Deskryptorów na pozycję deskryptora odpowiedniej tablicy lokalnej właściwej danemu zadaniu. Ustawienie tego selektora odbywa się za pomocą właściwej instrukcji procesora obsługującej pamięć w trybie wirtualnym. Następnie w tablicy lokalnej następuje wybranie deskryptora segmentu za pomocą selektora segmentu w adresie logicznym.
Z przedstawionej zasady translacji adresu wynika wielkość logicznej przestrzeni adresowej, tj. liczba różnych adresów logicznych jakie mogą być używane wy programie. Będzie to maksymalna wielkość pamięci logicznej widzianej przez pojedyncze zadanie. Każde zadanie ma dostęp do jednej Globalnej i jednej własnej Lokalnej Tablicy Deskryptorów. Te dwie tablice zawieraj 2*213 = 16K deskryptorów segmentów. Do tylu segmentów pamięci ma dostęp zadanie. Natomiast wielkość segmentu zależy od długości przemieszczenia. Jeżeli jest ono 16 bitowe (w procesorze 286) segment ma długość 64kB i przestrzeń adresów wirtualnych obejmuje 16K* 64KB = 1GB. Przy przemieszczeniach 32 bitowych (procesory 386, 486, Pentium) wielkość segmentu wynosi 232 = 4GB, a wówczas przestrzeń adresów widzianych przez program wynosi 16K*4GB = 4TB (terabajty).
W praktyce procesor dysponuje sześcioma rejestrami: CS, DS, SS, ES, FS, GS. Tyle też segmentów może zostać zaadresowanych jednocześnie bez zmiany zawartości tych rejestrów i przestrzeń adresowa dostępna w ten sposób obejmie 6*4GB = 24GB.
Przy szynie adresowej 32 bitowej fizycznie pamięć może mieć tylko 4GB, a więc objętość równoważną jednemu segmentowi, 1/16384 przestrzeni logicznej.
A jednak posługiwanie się ogromną przestrzenią adresów logicznych jest sensowne i oprogramowanie komputera pracującego w trybie wirtualnym procesora może widzieć całą przestrzeń logiczną mino że fizycznie zainstalowana będzie pamięć o pojemności stanowiącej tylko niewielką część tej przestrzeni.. Będzie to możliwe za pomocą mechanizmu tzw. pamięci wirtualnej. Dane z adresowej przestrzeni logicznej nie mieszczące się w pamięci fizycznej i w danej chwili nie potrzebne są przechowywane na dysku. Do pamięci fizycznej ściągane są tylko te fragmenty przestrzeni logicznej, które są potrzebne. Po wykorzystaniu są one z powrotem odsyłane na dysk. ten sposób w niewielkiej pamięci fizycznej jest emulowana cała przestrzeń adresów logicznych. Jednak zanim przedstawimy zasadę pracy pamięci wirtualnej najpierw wprowadzimy drugi obok segmentacji mechanizm translacji adresu zwany stronicowaniem.



Stronicowanie liniowej przestrzeni adresowej

Stronicowanie jest mechanizmem podziału przestrzeni adresów liniowych na niewielkie jednostki, typowo 212 = 4kB zwane stronami. Ponieważ przestrzeń adresów liniowych jak i przestrzeń adresów fizycznych obejmuje 232 adresów, zatem liczba stron wynosi 220 = lM.
Strony są więc ponumerowane numerami dwudziestobitowymi od 00000H do FFFFFH i adres fizyczny bajta w stronicowanej pamięci jest to para liczb:

numer strony (liczba 20 bitowa) : przemieszczenie na stronie (liczba 12 bitowa)

Adresowanie bajta na stronie odbywa się za pomocą 12 bitów, które stanowią 12 najmniej znaczących bitów adresu liniowego. Zbiór 1 M stron jest podzielony na 1K grup po 1K stron w każdej grupie.
Każda grupa stron ma swoja Tabelę Stron składającą się z 1K wierszy, z których każdy definiuje jedną stronę – patrz rys.13.4. Składa się on z 4 bajtów, z czego 20 bitów jest przeznaczone na numer strony a 12 bitów na atrybuty strony (omawiamy je dalej). Objętość Tablicy Stron wynosi zatem 1K*4B = 4kB czyli jedną stronę. Maksymalna liczba grup stron i ich tablic zdefiniowanych w systemie wynosi 1K.

Rys.13.4. Generacja adresu w trybie stronicowania

Jeżeli poszukiwana strona jest nieobecna w pamięci operacyjnej generowany jest wyjątek i program obsługi tego wyjątku powinien spowodować wczytanie brakującej strony z dysku i zmodyfikowanie odpowiedniej pozycji w tabeli stron.
Posługiwanie się przy translacji adresu liniowego na fizyczny wyłącznie danymi z pamięci (katalogi i tabele stron) prowadziłoby do znacznego zmniejszenia szybkości działania systemu. W celu przeciwdziałania takiej wprowadzono w procesorze pomocniczą pamięć typu cache przechowującą zawartość trzydziestu dwóch ostatnio używanych tablic stron. Pamięć ta oznaczana jest przez TLB (translation lookaside buffer).



Mechanizm pamięci wirtualnej

Mechanizm pamięci wirtualnej polega na tym, ze nie cała przestrzeń adresów logicznych widzianych przez zadanie ma swoje oparcie w pamięci fizycznej. Przestrzeń adresów logicznych (selektor segmentu: przemieszczenie) odwołujących się do potrzebnych zadaniu segmentów kodu, danych i stosu jest na etapie translacji odwzorowywana na 4GB przestrzeń 32 bitowych adresów liniowych, z których wszystkie mogą być użyte w zadaniu. Jednak ta przestrzeń nie może być cała zrealizowana w fizycznej pamięci operacyjnej komputera. Dlatego w praktyce zostaje podzielona na 1M stron i tylko część spośród nich jest jednocześnie przechowywana w pamięci fizycznej. Zarządzaniem przeładowywaniem stron pomiędzy dyskiem i pamięcią operacyjną zajmuje się system operacyjny za pomocą funkcji wykonywanych przez procesor w trybie wyjątku procesora (tzn. przerwania generowanego przez sam procesor).
Rozpatrzmy elementarny przykład programu P, który zajmuje jedną stronę pamięci (4KB) i korzysta z danych Dl, D2 zajmujących dwie strony pamięci (8 KB). Przestrzeń liniowa zajmowana przez zadanie obejmuje zatem 3 strony i ma postać:
 

Tymczasem pamięć fizyczna komputera obejmuje tylko 8KB a zatem jest w niej miejsce na dwie strony. Miejsca w pamięci operacyjnej na strony nazywamy ramkami stron. Pamięć fizyczna w naszym przykładzie zawiera 2 ramki stron:

  1. Załóżmy, że w pewnej fazie wykonywania programu strona 0 zawierająca jego kod i strona 1 z danymi Dl są w pamięci operacyjnej (RAM). Ponadto obrazy wszystkich stron przestrzeni liniowej znajdują się na dysku. Zatem strona 2 z danymi D2 jako aktualnie nie potrzebna istnieje tylko na dysku. Pokazuje to poniższy rysunek
  1. Przypuśćmy, że w kodzie programu wystąpiła w pewnym miejscu instrukcja wymagająca odwołania do 1 strony pamięci liniowej pod przesunięcie 100. Strona ta aktualnie rezyduje w pamięci fizycznej w ramce nr 1 i odwołanie może być wykonane. Będzie ono polegało na wystawieniu adresu fizycznego 1:100 (gdzie 1 oznacza numer ramki) i jest zaznaczone strzałką na powyższym rysunku. W odpowiedzi pamięć wystawi procesorowi na szynę danych zawartość adresowanej komórki.
  1. W dalszej części tego samego programu P może wystąpić odwołanie do pamięci do innej danej, znajdującej się w bloku D2 na stronie 2 przestrzeni adresów liniowych pod przesunięciem 110. Strona ta nie rezyduje aktualnie w pamięci fizycznej lecz na dysku. Stwierdzenie tego faktu powoduje, że procesor przestaje wykonywać bieżące zadanie i przechodzi w stan wyjątku: zaczyna obsługiwać funkcję systemu operacyjnego która:
    • usuwa z ramki 1 pamięci operacyjnej stronę nr 1 i zapisuje ją na dysku,
    • ładuje z dysku do ramki 1 pamięci operacyjnej stronę nr 2.
  2. W wyniku tych operacji stan pamięci wirtualnej staje się następujący:
  1. Procesor kończy wykonywanie wyjątku i powraca do wykonania przerwanego odwołania do strony nr 2 pod przesuniecie 110. Tym razem strona 2 rezyduje w pamięci fizycznej, w ramce 1 i możliwe jest odwołanie się do niej przez adres fizyczny 1 :110 (1 jest numerem ramki). Odwołanie zostaje wykonane. W odpowiedzi pamięć wystawia na szynę danych zawartość adresowanej komórki.

Cechą charakterystyczną takiego mechanizmu działania pamięci jest fakt, że zadanie w ogóle „nie wie” ile pamięci fizycznej posiada komputer i czy mieści się w niej program P i dane Dl, D2. Zadanie operuje na całej przestrzeni adresów liniowych obejmującej strony 0, 1 i 2 i nie ma dla niego znaczenia, ze przestrzeń ta jest emulowana na mniejszym, dwuramkowym obszarze pamięci fizycznej. Do emulacji służy mechanizm przeładowywania stron na dysk i z dysku. Fakt, iż pamięć fizyczna jest mała w porównaniu z rozmiarem przestrzeni logicznej jest tylko „wewnętrzną sprawą” procesora.


 

Źródło: https://83.14.239.10/komputer/syst_komput/systemy_komputerowe_pliki/praca_w_trybie.html