JELON 5, 5.Wsp˙˙praca mikroprocesora z pami˙ci˙.


5.Współpraca mikroprocesora z pamięcią.

5.1.Organizacja pamięci.

Pamięć rzeczywista (fizyczna) adresowana przez procesor w trakcie wykonywania programu może być traktowana jako jednowymiarowa tablica bajtów. Wielkość fizycznej pamięci, którą procesor może zaadresować, jest określona przez liczbę linii adresowych. Liczby te są różne dla różnych mikroprocesorów rodziny 80x86 firmy Intel. Mikroprocesor 8086 ma 20 wyprowadzeń adresowych, a zatem generuje adres z zakresu 0..220 - 1. Wielkość fizycznej przestrzeni adresowej procesora 8086 wynosi 1 Mbajt. Mikroprocesor 80286 ma 24 linie adresowe, a zatem adresuje 16 Mbajtów pamięci. Z kolei mikroprocesory 80386 i i486 mogą zaadresować pamięć fizyczną o pojemności 4 Gbajtów za pomocą 32 linii adresowych.

Adres fizyczny, pojawiający się na wyprowadzeniach adresowych mikroprocesora, powstaje w wyniku odpowiedniego przetworzenia adresu logicznego, tzn. adresu widzianego przez program. We wszystkich procesorach rodziny 80x86 logiczna przestrzeń adresowa jest dwuwymiarowa. Metoda organizacji pamięci logicznej przyjęta w omawianych procesorach nosi nazwę segmentacji. Adres logiczny jest reprezentowany przez parę liczb: jedna z nich (selektor) określa segment, druga (przemieszczenie - offset) - położenie wewnątrz segmentu. W każdej chwili podczas wykonywania programu procesor ma bezpośredni dostęp do wybranych segmentów - czterech w 80286 i sześciu w 80386 i i486. Są to segmenty, których selektory znajdują się aktualnie w rejestrach segmentów mikroprocesora.

5.2.Translacja adresu pamięci w trybie rzeczywistym.

W trybie rzeczywistym mechanizm adresowania jest identyczny jak zastosowany w pierwszym mikroprocesorze rodziny - 8086. Położenie segmentu w przestrzeni adresowej jest określone przez odpowiedniego rejestru segmentu pomnożoną przez 16 (przesunięcie o 4 bity w lewo). Zatem adres początku segmentu jest wielokrotnością 16. Ponieważ rejestry segmentów są 16 - bitowe, po przesunięciu o 4 - bity uzyskuje się adres 20 - bitowy. Segmenty w trybie rzeczywistym pokrywają zatem 1 Mbajt pamięci. Pełna pamięć fizyczna procesorów 80286, 80386

i i486 (tj. adresowana za pomocą odpowiednio 24 i 32 linii adresowych) nie jest tu dostępna.

Przemieszczenie określające położenie w segmencie jest w tym trybie reprezentowane również przez liczby 16 - bitowe, zatem długość segmentu jest ustalona i wynosi 64 kBajty. W mikroprocesorze 80386 (i486) pracującym w trybie rzeczywistym, możliwe jest posługiwanie się alternatywnym sposobem wyliczenia przemieszczenia, mianowicie: wyznaczane jest przemieszczanie 32 - bitowe, lecz jednocześnie jest zachowane ograniczenie wielkości segmentu do 64 kBajtów.

W celu odróżnienia obu sposobów wyliczania przemieszczenia mówi się o adresowaniu 16 - bitowym i adresowaniu 32 - bitowym. Użycie adresu 32 - bitowego w instrukcji jest wymuszane przez poprzedzenie jej specjalnym przedrostkiem rozmiaru adresu tj. bajtem 67H.

5.3.Translacja adresu pamięci w trybie wirtualnym z ochroną.

Ogólna idea dwuwymiarowej logicznej przestrzeni adresowej jest zachowana również w trybie wirtualnym, lecz w tym przypadku inny jest sposób translacji adresu logicznego. Rejestry segmentów procesora są stowarzyszone z niewidocznymi dla programisty rejestrami deskryptorów, w których jest przechowywana informacja o sposobie tłumaczenia wartości selektora wpisanego do rejestru segmentu. Dokładnie - w ukrytym rejestrze jest zawarty adres bazowy i wielkość segmentu wskazanego przez selektor. Dodatkowo w tym rejestrze są zapisane atrybuty określające prawa dostępu do segmentu używane przez mechanizm ochrony. Podobnie jak w rzeczywistym trybie pracy, również w trybie wirtualnym jest wykonywana operacja translacji adresu logicznego na fizyczny. W procesorze 80286 jest to operacja jednoetapowa, natomiast w procesorze 80386 (i486) istnieje pośredni wynik translacji - adres w przestrzeni liniowej, który po zastosowaniu mechanizmu stronicowania daje adres fizyczny. Stronicowanie może być wyłączone i wówczas liniowa przestrzeń adresowa jest identyczna z przestrzenią fizyczną.

5.4.Segmentacja.

Zarówno w trybie rzeczywistym jak i w trybie wirtualnym programy wykonują instrukcje umieszczające selektor w odpowiednim rejestrze segmentu. Istotna różnica między tymi trybami polega na innej interpretacji zawartości rejestru segmentu. Położenie segmentu jest w trybie rzeczywistym określone przez wartość selektora bezpośrednio. W trybie wirtualnym powiązanie między selektorem a wyznaczanym przezeń segmentem jest zrealizowane poprzez deskryptor segmentu. Deskryptor jest 8 - bajtowym rekordem opisującym m.in. położenie i wielkość segmentu. Selektor wskazuje więc bezpośrednio na deskryptor segmentu, a pośrednio na segment. Deskryptory segmentów są umieszczane w pamięci kolejno tworząc tzw. tablice deskryptorów. Wykonywany program ma dostęp do dwóch tablic deskryptorów: globalnej tablicy deskryptorów GDT i lokalnej tablicy deskryptorów LDT. Stosowanie dwóch tablic deskryptorów umożliwia realizację ochrony pamięci zadań w systemach wielozadaniowych . W systemie może istnieć wiele LDT, zwykle po jednej na każde zadanie. Rozmiar logicznej przestrzeni adresowej określa się jako maksymalną wielkość pamięci widzianą przez pojedyncze zadanie.

Położenie tablic deskryptorów GDT i aktualnie używanej LDT jest określone poprzez zawartość specjalnych rejestrów procesora - odpowiednio rejestru globalnej tablicy deskryptorów GDTR (Global Descriptor Table Register ) i rejestru lokalnej tablicy deskryptorów LDTR (Local Descriptor Table Register ).

W każdym z rejestrów jest umieszczony liniowy adres początku odpowiedniej tablicy oraz wielkość tablicy. Struktura rejestru LDTR jest analogiczna do rejestru segmentu: zawiera część ukrytą, ładowaną automatycznie, będącą odpowiednikiem rejestru deskryptora segmentu. Wynika to z faktu, że lokalna tablica deskryptorów sama stanowi odrębny segment, należący do grupy tzw. segmentów systemowych. Jako segment ma swój deskryptor, który musi być umieszczony w globalnej tablicy deskryptorów. Rejestr LDTR jest traktowany w czasie ładowania podobnie jak rejestr segmentu. Tablica LDT, podobnie jak GDT może zawierać do 8192 deskryptorów tzn. jej długość nie może przekraczać 64KB.

5.5.Stronicowanie.

Podobnie jak mechanizm segmentacji, również mechanizm stronicowania (istniejący tylko w mikroprocesorach 80386 i i486) posługuje się w procesie translacji tablicami systemowymi zawartymi w pamięci. Stronicowanie odbywa się zupełnie niezależnie od segmentacji.

Adresy tablic GDT i LDT umieszczone w odpowiednich rejestrach dotyczą liniowej przestrzeni adresowej. Mechanizm segmentacji nic „nie wie” o fizycznym położeniu tych tablic w pamięci. Z kolei adresy tablic, z których korzysta mechanizm stronicowania są adresami fizycznymi.

Zarówno liniowa jak i fizyczna przestrzeń adresowa obejmuje 4GB. Stronicowanie polega na wyróżnieniu w obu tych przestrzeniach bloków pamięci - stron - o ustalonej długości 4KB, rozmieszczonych sekwencyjnie począwszy od adresu 0 i przyporządkowaniu stronom w przestrzeni liniowej stron w przestrzeni fizycznej. Każda z tych przestrzeni składa się z 232/212 = 220 = 1M stron. Położenie strony jest jednoznacznie określone za pomocą 20-bitowego numeru. W mikroprocesorze zastosowano dwupoziomową organizację tablic translacji. Wprowadzono dwa rodzje tablic: tablice stron zawierające numery stron w fizycznej przestrzeni adresowej oraz katalogi tablic stron. Każdy element katalogu wskazuje na właściwą tablicę stron.

Podobnie jak ma to miejsce w przypadku segmentacji, również przy stronicowaniu używany jest specjalny rejestr mikroprocesora do wskazania położenia tablic systemowych w pamięci. Rolę tę pełni rejestr sterujący CR3 mikroprocesora zawierający numer strony, na której zapisano katalog tablic stron. W celu przyspieszenia procesu translacji adresu liniowego na fizyczny mikroprocesor 80386 (i486) wyposażono w wewnętrzną pamięć asocjacyjną elementów tablic stron TLB, w której przechowywane są ostatnio używane opisy stron.

5.6.Pamięć wirtualna.

Realizacja pamięci wirtualnej (logicznej) o wielkości większej niż rozmiar faktycznie zainstalowanej pamięci operacyjnej polega na uzupełnieniu pamięci operacyjnej przez pomocniczą pamięć masową i na odpowiednim zarządzaniu przesyłaniem danych między tymi pamięciami. Pamięć dyskowa służy do przechowywania obrazów tych fragmentów pamięci (logicznej), które aktualnie nie mieszczą się w pamięci fizycznej. Niezbędne w trakcie wykonywania programu fragmenty (kod,dane) są odczytywane z dysku i umieszczane w pamięci operacyjnej, z kolei niektóre fragmenty spośród obecnych w pamięci muszą być przenoszone na dysk w celu uzyskania wolnego miejsca. Zarządzaniem pamięci wirtualnej zajmuje się system operacyjny korzystając z mechanizmów wbudowanych w mikroprocesor. Realizacja pamięci wirtualnej w systemach z mikroprocesorami 80286, 80386 i i486 jest ściśle związana z segmentacją i stronicowaniem.

W mikroprocesorze 80286 pamięć wirtualna może być zrealizowana jedynie z zastosowaniem segmentacji.

Istotnym elementem implementacji pamięci wirtualnej, wpływającym na efektywność działania systemu, jest strategia usuwania segmentów z pamięci operacyjnej w celu uzyskania miejsca do wprowadzenia brakujących segmentów. Często stosowana jest strategia usuwania tych części pamięci, które były najdawniej używane. Inna stosowana strategia polega na usuwaniu z pamięci segmentów najrzadziej używanych.

Realizacja pamięci wirtualnej w oparciu o mechanizm segmentacji może być stosowana zarówno w systemach z mikroprocesorem 80286 jak i 80386 (i486). W tym rozwiązaniu pojawiają się jednak problemy związane z faktem, że segmenty mają niejednakową długość. Często wprowadzenie nowego segmentu do pamięci operacyjnej wymaga usunięcia kilku mniejszych segmentów.

W mikroprocesory 80386 i i486 wbudowano mechanizmy umożliwiające efektywną realizację pamięci wirtualnej w oparciu o stronicowanie. Przy realizacji pamięci wirtualnej w oparciu o stronicowanie unika się fragmentacji (wszystkie bloki mają jednakową długość). W systemach z mikroprocesorami 80386 i i486 wskazana jest implementacja pamięci wirtualnej w oparciu o stronicowanie, zaś innych mechanizmów systemowych - z wykorzystaniem segmentacji lub łączenie segmentacji i stronicowania.

5.7.Pamięć kieszeniowa.

Pamięć kieszeniowa stosowana jest w celu odciążenia magistrali systemowej i w celu zwiększenia mocy obliczeniowej procesora. Ze względu na jej pojemność i bezpośrednie sąsiedztwo procesora, czasy dostępu są krótkie. Procesor, odwołując się do pamięci kieszeniowej, zamiast do pamięci operacyjnej, pracuje z maksymalną szybkością. Znanych jest wiele rodzajów pamięci kieszeniowych, realizujących różne algorytmy zwalniania miejsca w pamięci operacyjnej.

5.7.1.Zasada działania.

Procesor wykonuje cykl odczytu z pamięci w celu pobrania kodu rozkazu do kolejki rozkazów lub w celu pobrania danej potrzebnej do wykonania zdekodowanego rozkazu. W obydwu przypadkach jest obliczany fizyczny adres pamięci operacyjnej.

Każdy zapis danej jest zawsze, bezwarunkowo kierowany do pamięci operacyjnej. Jeżeli adresowany obszar pamięci operacyjnej jest reprezentowany w pamięci kieszeniowej, to dana jest także zapisywana do pamięci kieszeniowej. Zlecenie zapisu do obszaru pamięci nie reprezentowanego w pamięci kieszeniowej nie powoduje skopiowania tego obszaru do pamięci kieszeniowej.

Pamięć kieszeniowa jest sterowana za pomocą bitów CE i WT, należących do rejestru stanu CR0. Możliwe są następujące wysterowania pamięci kieszeniowej w zależności od bitów CE i WT:

00 - dla trafień pamięć kieszeniowa stanowi szybką pamięć statyczną, cykle dostępu nie są wyprowadzane na zewnątrz procesora; nie jest wykonywane unieważnienie; dla chybień cykle dostępu są kierowane do pamięci operacyjnej; tryb pracy jest przeznaczony głównie do celów uruchomieniowych i diagnostycznych;

01 - zachowana jest zgodność treści pomiędzy pamięcią kieszeniową i pamięcią operacyjną; nie jest wykonywane wypełnianie pamięci kieszeniowej w przypadku chybień; unieważnienie jest wykonywane; cykle zapisu kierowane są do pamięci operacyjnej i, jeżeli zachodzi potrzeba, również do pamięci kieszeniowej; ten tryb pracy jest użyteczny przy wykonywaniu krótkich procedur, które nie powinny niszczyć zawartości pamięci kieszeniowej;

10 - sterowanie niedozwolone, sygnalizowane przez procesor jako błąd; przewidziane do realizacji bardziej złożonej techniki zapisu do pamięci w przyszłych procesorach;

11 - normalna praca pamięci kieszeniowej.

5.7.2.Fizyczna realizacja pamięci kieszeniowej.

Pamięć kieszeniowa mikroprocesora 80486 ma pojemność 8 kB. Jednostka przedzielanej pamięci ma długość 16 bajtów. Jednostkę tę nazywamy linią. Każdorazowo, gdy wystąpi chybienie i gdy jest to dozwolone, linia jest wypełniana zawartością fragmentu pamięci operacyjnej. Linia jest unieważniana, gdy wystąpi modyfikacja choć jednego bajtu pamięci operacyjnej zawartego w tym fragmencie, oczywiście gdy jest to dozwolone. Obszar ośmiu kilobajtów pamięci kieszeniowej logicznie jest podzielony na 128 pól zawierających po 4 linie. Fizycznie są to 4 bloki pamięci asocjacyjnej zawierające po 128 słów. Jedno słowo stanowi linia 16 - bajtowa wraz z 21 - bitowym wyróżnikiem. Z każdą czteroliniową paczką związane jest słowo stanu o długości 7 bitów. W słowie stanu zawarte są 4 bity określające zajętość każdej linii i 3 bity używane przez algorytm zwalniania linii.



Wyszukiwarka