Sposób zarządzania pamięcią RAM
Tryb chroniony
Sposób zarządzania pamięcią RAM komputera który stał się możliwy od czasów wprowadzenia na rynek procesora 286. Gdy program lub system operacyjny działa w trybie chronionym, może korzystać z wielozadaniowości, z pamięci RAM powyżej 1 MB, pamięci wirtualnej i chronionych obszarów pamięci (tzn. takich, z których nie mogą w tym samym czasie skorzystać inne programy). Tryb chroniony oferuje zaawansowany i znacznie lepszy sposób zarządzania pamięcią od gwarantowanego przez tryb rzeczywisty. Nowoczesne systemy operacyjne, takie jak Windows, OS/2 czy UNIX, pracują w trybie chronionym
pamięć wirtualna
Gdy w pamięci RAM komputera brakuje miejsca dla uruchamianych programów, system operacyjny może część z nich przesunąć do pamięci wirtualnej - istniejącej na dysku twardym. Zaletą tego rozwiązania jest ekran wolny od irytujących komunikatów o braku pamięci; wadą - długi, w porównaniu do pamięci RAM, czas dostępu do informacji znajdującej się na dysku twardym. Por. plik wymiany
. Tryb chroniony
Tryb chroniony istnieje począwszy od procesorów 80286 gdzie pozwalał zaadresować 16Mb pamięci, jednak pełne skrzydła rozwinął dopiero w procesorze 80386 i obecnie udostępnia nam przestrzeń adresową wielkości 4Gb. Tryb chroniony maszyn 80286 jest zubożoną wersją w stosunku do 80386, więc nie będziemy się nim dokładnie zajmować.
Dzięki wprowadzeniu trybu chronionego możliwe się stało stworzenie profesjonalnych, wielozadaniowych systemów operacyjnych, zorientowanych sieciowo. Mechanizmy ochrony zapewniają łatwe wykrywanie błędów i bezpieczeństwo danych systemowych (system może mieć architekturę całkowicie zamkniętą i udostępniać programom zasoby komputera według własnych praw). Wielozadaniowość pozwala na jednoczesne wykonywanie się niezależnie wielu zadań, którymi zarządza system operacyjny. W połączeniu ze stronicowaniem pamięci tryb chroniony czyni komputery klasy PC najpoważniejszymi komputerami osobistymi.
Zasada działania pamięci
Pamięć RAM fizycznie występuje w postaci układów scalonych (chipów). Każdy taki chip składa się z układów zwanych przerzutnikami, zazwyczaj są to przerzutniki bistabilne (flip-flop) typu D. Charakteryzują się one tym iż posiadają dwa stany równowagi trwałej, a więc mogą przechowywać jeden bit informacji (przyjmujący wartości 0 lub 1). Przerzutniki układane są w matrycę, dzięki czemu zapewniony jest swobodny dostęp do pamięci:
Specjalny układ zwany dekoderem adresu przekształca napływające adresy tak aby móc dokonać odczytu z matrycy. Sama matryca działa w ten sposób iż na żądaną linię słowa podajemy napięcie, po czym możemy pobrać/zapisać wartości na linii bitów.
Pamiętać należy iż architektura komputerów PC uniemożliwia nam programowy odczyt pojedynczego bitu. Najmniejszą jednostką którą możemy odczytać jest bajt (8 bitów).
Ze względu na różne elementy konstrukcyjne dzielimy pamięci na statyczną i dynamiczną.
Pamięć statyczna
Oto układ komórki statycznej przechowujący bit informacji:
Pamięć oparta o te układy charakteryzuje się tym iż jest nieulotna i nie wymaga odświeżania.
W zależności od tego jaką wartość reprezentuje komórka, jeden z tranzystorów przewodzi, a drugi jest w stanie odcięcia. Gdy komórka nie jest wybrana na linii słowa występuje napięcie 0,3 V dzięki czemu prąd płynący przez przewodzący tranzystor płynie do linii słowa (złącze połączone z linią bitów jest spolaryzowane zaporowo). Gdy chcemy odczytać stan, na linii słowa podajemy napięcie 3 V przez co spolaryzowane zaporowo staje się złącze z linią słowa, natomiast przewodzić zaczyna złącze z linią bitów. Spadek napięcia na odpowiednim rezystorze powoduje różnicę potencjałów która odczytywana jest przez wzmacniacz różnicowy jako 0 lub 1 (w zależności czy linia D czy D zaprzeczone ma wyższy potencjał). Podczas zapisu komórki na linii słowa również wystawiamy napięcie 3 V a na linie bitów żądane wartości, co spowoduje odpowiednie ustawienie tranzystorów.
Pamięć dynamiczna
Oto układ komórki dynamicznej przechowujący bit informacji:
Pamięć dynamiczna cechuje się ulotnością ze względu na użycie pojemności C. Wymaga to niestety odświeżania poprzez podanie odczytywanej wartości na sprzężenie zwrotne. Konieczny wtedy jest okresowy odczyt komórki, realizowany sprzętowo, lub programowo.
W przypadku wartości 1 kondensator jest załadowany, w przypadku 0 rozładowany. Zapisywanie wartości polega na podaniu stanu logicznego na linię bitów i napięcia na bramkę tranzystora T2 co powoduje ładowanie/rozładowanie kondensatora. Odczyt działa analogicznie, z tym że napięcie podajemy na bramkę T3. Wtedy prąd płynie przez tranzystory T1 i T3 do linii bitów.
Typy pamięci
Pamięć operacyjna każdego komputera zwana jest pamięcią RAM (Random Access Memory), czyli pamięcią o dostępie swobodnym. Ze względu na różną budowę i dostęp, wśród pamięci RAM wyróżniamy poszczególne typy.
Podział ze względu na budowę
SRAM - (Static RAM), pamięć statyczna wykonana w oparciu o tranzystory bipolarne. Cechuje ją bardzo krótki czas dostępu do poszczególnej komórki i nieulotność. Niestety, pamięci SRAM są drogie, dlatego też wykorzystuje się je głównie jako pamięci cache.
DRAM - (Dynamic RAM) pamięć dynamiczna wykonana w oparciu o tranzystory MOS. Pamięć ta jest wolniejsza niż pamięć SRAM a w dodatku jest ona ulotna. Aby pamięć ta nie utraciła danych trzeba ją odświeżać z częstotliwością co najmniej kilkaset Hz. Odświeżanie polega na zwykłym odczycie zawartości komórki.
SDRAM - (Synchronous Dynamic RAM) pamięć dynamiczna, synchroniczna. Pamięć ta jest podobna do pamięci DRAM, z tym że dostęp do komórek pamięci jest zsynchronizowany z zewnętrznym zegarem taktującym procesor.
Podział ze względu na dostęp
FPM RAM - (Fast Page Mode RAM), pamięć ta zorganizowana jest w strony, przy czym najszybciej realizowany jest dostęp do kolejnych komórek w obrębie strony.
EDO RAM - (Extended Data Output RAM), jest to pamięć w przypadku której w czasie odczytu danej komórki, może zostać pobrany adres następnej.
BEDO RAM - (Burst EDO RAM), w przypadku tej pamięci zamiast jednego adresu pobierane są cztery, przy czym na magistralę wystawiany jest tylko pierwszy co znacznie zwiększa szybkość dostępu.
. Pojęcie adresu
Adresem nazywamy pewną specyficzną liczbę, która opisuje komórkę pamięci. Za pomocą adresu informujemy procesor gdzie ma zostać zapisana, lub odczytana dana. Niestety, ze względu na różne sposoby dostępu procesora do pamięci samo pojęcie adresu niewiele już znaczy. Poniżej zdefiniowane są najistotniejsze pojęcia adresów, które należy poznać aby bez problemu orientować się podczas czytania specjalistycznej literatury:
adres fizyczny - (physical address) jest adresem najniższego poziomu. Podczas komunikacji procesora z układem obsługującym pamięć, na jego liniach adresowych wystawiany jest właśnie adres fizyczny. Wykorzystujemy go przy tworzeniu tablic implementujących stronicowanie, lub podczas komunikowania się z dowolnymi urządzeniami. Należy zauważyć, że podczas gdy mechanizm stronicowania pamięci jest wyłączony, adres fizyczny jest równy adresowi liniowemu,
adres liniowy - (linear address) jest formą przejściową między adresem fizycznym. Dzięki istnieniu adresu liniowego można uzyskać ciągłość pamięci nawet, jeżeli fizycznie jest ona porozrzucana. Adres liniowy jest zamieniany przez mechanizm stronicowania na adres fizyczny za pomocą tablic stron. W systemach wielozadaniowych niemożliwa jest wymiana adresów liniowych pomiędzy zadaniami, gdyż każde z nich może mieć oddzielne tablice stron. Adresy liniowe wykorzystujemy głównie przy tworzeniu deskryptorów,
adres logiczny - (logical address) jest adresem złożonym z dwóch członów: identyfikatora segmentu i przemieszczenia w tym segmencie. Dla trybu rzeczywistego i V86 identyfikatorem segmentu będzie jego adres liniowy podzielony przez 16, dla trybu chronionego będzie to selektor segmentu. Adres taki zapisujemy w postaci SEGMENT: OFFSET lub SELEKTOR: OFFSET. Adres logiczny powinien być wykorzystywany do zapisywania lub odczytywania danych, procesor automatycznie zamienia go na adres logiczny a następnie na adres fizyczny,
adres segmentowy - (segment) jest pierwszą częścią adresu logicznego. Jeżeli został podany bez przemieszczenia oznacza to, że wskazuje nie konkretną komórkę pamięci a cały blok. Domyślnie przyjmujemy przemieszczenie 0. Adres segmentowy zwracany jest przez niektóre funkcje interfejsów API (Application Program Interface),
adres relatywny - (offset) jest przemieszczeniem względem segmentu, lub jakiegoś bloku danych. Adres takiego segmentu musi być znany.
. Pamięć wirtualna
Dzięki mechanizmowi stronicowania pamięci możliwe jest stworzenie pamięci wirtualnej (virtual memory). Polega to na powiększeniu dostępnej przestrzeni o nieistniejące obszary pamięci. W chwili gdy wystąpi żądanie przydziału pamięci, a wykorzystany jest cały obszar fizyczny, system operacyjny zapisuje fragmenty pamięci fizycznej na dysk po czym przepina (za pomocą mechanizmu stronicowania) tą pamięć udostępniając ją żądającemu zadaniu. Jeżeli pamięć zapisana na dysk jest potrzebna, system zapisuje inny obszar i tak w kółko. Zapis dokonywany jest do specjalnego pliku wymiany (swap file), lub partycji wymiany (swap partition). Jeżeli jest to plik, musi on zajmować kolejne sektory i nie może być przenoszony w inne miejsce dysku. Rozmiar pamięci wirtualnej jest ograniczony przez rozmiar pliku lub partycji.
Pamiętać należy, że niektóre obszary pamięci powinny być zablokowane przed wymianą na dysk (dotyczy to głównie procedur obsługi przerwań, oraz procedur, które nie mogą czekać na stosunkowo długi czas odczytu z dysku).
Aby zrealizować czynność wymiany musimy mieć kontrolę nad wyjątkiem 0DH (Page fault), oraz nad tablicami stron. Należy zdefiniować jeden z bitów wpisu w tablicach, który będzie oznaczał czy strona może być wymieniona na dysk, czy nie. Ponieważ podczas, gdy bit P wpisu jest wyzerowany reszta bitów jest dostępna, należy je wykorzystać na numer sektora w pliku wymiany.
Procedura obsługi wyjątku 0DH musi w pierwszej kolejności odczytać adres liniowy komórki do której dostęp spowodował wyjątek (rejestr CR2). Na podstawie tego adresu znaleźć odpowiedni wpis w tablicach. Następnie trzeba odszukać stronę którą zapiszemy na dysk. Strona ta musi być obecna w pamięci (P=1) i musi mieć prawo do wymiany (zdefiniowany przez nas bit). Zapisujemy stronę na dysk, zerujemy bit P i uzupełnianiu jej wpis o sektor w pliku/partycji wymiany. Następnie wolną już stronę fizyczną podpinamy pod tą która wygenerowała wyjątek i na koniec i odczytujemy dane z dysku.