Tryb chroniony
Zarządzanie pamięcią RAM komputera stało się możliwe w momencie wprowadzenia na rynek przez firmę Intel procesora 286. W momencie, gdy system operacyjny lub program działa w trybie chronionym, możliwe staje się korzystanie z wielozadaniowości, pamięci wirtualnej, pojemności pamięci RAM większych niż 1MB, oraz możliwy jest dostęp do obszarów pamięci chronionej, czyli takiej, z którą w danym momencie może pracować tylko jeden program. Tryb chroniony zapewnia bardzo zaawansowany oraz znacząco lepszy sposób zarządzania pamięcią od tego gwarantowanego przez tryb rzeczywisty. Wszystkie systemy operacyjne, z których korzysta się obecnie na świecie, czyli na przykład Windows i Linux pracują w omawianym trybie chronionym.
Pamięć wirtualna
W momencie, gdy w pamięci RAM zaczyna powoli brakować miejsca dla właśnie uruchamianych programów, system operacyjny przenosi część z nich do obszaru pamięci wirtualnej, którą system inicjalizuje na dysku twardym. Wielką zaletą takiego rozwiązania jest bardzo wielka ilość możliwej do wykorzystania pamięci, ograniczona jedynie pojemnością naszego dysku twardego. Wadę natomiast stanowi odczuwalnie dłuższy czas dostępu do danych, które znajdują się na dysku twardym w ramach pamięci wirtualnej. Pamięć wirtualna jest najczęściej widziana z systemu jako plik, zwany plikiem wymiany.
Tryb chroniony
Tryb chroniony powstał wraz z procesorami 80286, w których umożliwiał zaadresowanie 16 MB pamięci. Pełne skrzydła tryb ten rozwinął dopiero w momencie wprowadzenia na rynek przez firmę Intel procesorów 80386, w których dostępna przestrzeń adresowa wynosiła 4 GB. Chroniony tryb procesorów 80286 jest wersją zubożoną trybu, który znajdziemy w procesorze 80386, zajmiemy się więc analizą tego bardziej nowoczesnego trybu. Wprowadzenie do użytku trybu chronionego umożliwiło powstanie wielozadaniowych, profesjonalnych, sieciowo zorientowanych systemów operacyjnych. Mechanizmy ochronne są gwarantem łatwego wykrywania i korygowania błędów oraz bezpieczeństwa danych systemowych, system operacyjny może bowiem posiadać całkowicie zamkniętą architekturę, udostępniając zasoby komputera uruchamianym na nim programom według ściśle określonych zasad. Wielozadaniowość systemu operacyjnego umożliwia niezależne wykonywanie się wielu zadań w tym samym momencie. Zarządcą tych zadań jest system operacyjny. Po połączeniu trybu chronionego ze stronicowaniem pamięci, komputery klasy PC stały się najpopularniejszą klasą komputerów na świecie.
Zasada działania pamięci
Fizycznie pamięć RAM jest zespołem układów scalonych. Każdy z tych układów składa się z ogromnej ilości popularnych układów techniki cyfrowej takich jak bistabilne przerzutniki D typu flip - flop, czy też podstawowe bramki logiczne. Przerzutniki bistabilne cechują się tym, że posiadają dwa stany trwałej równowagi, mogą więc przechowywać w sobie jeden bit informacji, który odpowiada wartości logicznego zera lub jedynki. Przerzutniki te układa się w wielkie matryce, dzięki czemu zapewnia się swobodny dostęp do każdego obszaru pamięci. Za przekształcanie napływających z procesora lub płyty głównej adresów odpowiada znajdujący się w każdej kości pamięci RAM dekoder adresu. Dzięki dekoderowi układ pamięci wie, do którego elementu matrycy chcemy się odwołać. Matryca działa w ten sposób, że na odpowiednią linię słowa podaje się napięcie, a następnie zapisuje się lub pobiera zawartość określonej linii bitów. Należy wziąć pod uwagę, że komputery klasy PC nie pozwalają na programowy odczyt pojedynczego bitu pamięci, najmniejszą możliwą do odczytania pojemnością informacji jest jeden bajt, który jak wiemy składa się z 8 bitów. Biorąc pod uwagę różne elementy konstrukcyjne pamięć dzielimy na statyczną i dynamiczną.
Pamięć statyczna
Komórka pamięci statycznej, przechowująca pojedynczy bit informacji, przedstawiona jest na poniższym rysunku.
Pamięć statyczna jest zgodnie z nazwą nielotną, nie wymaga też cyklu odświeżania. Zależnie od wartości jaką reprezentuje dana komórka, jeden z tranzystorów znajduje się w stanie przewodzenia, natomiast drugi w stanie odcięcia. W momencie, gdy komórka wybrana nie jest, na linii słowa ustala się napięcie 0,3V. Z tego powodu prąd, który płynie poprzez tranzystor przewodzący, płynie do linii słowa, czyli złącze z linią bitów musi być spolaryzowane w kierunku zaporowym. Kiedy chcemy odczytać stan pamięci, na linię słowa podawane jest napięcie 3V, na skutek czego zaporowo polaryzuje się złącze z linią słowa, a w kierunku przewodzenia spolaryzowane jest złącze z linią bitów. Spadek napięcia, które odkłada się na odpowiednim rezystorze jest powodem zmiany różnicy potencjałów, która w zależności od tego, która z linii D czy ~D posiada większy potencjał, jest odczytywana przez wzmacniacz różnicowy jako 1 lub jako 0. Kiedy zapisujemy komórki pamięci na linii słowa wystawiane jest napięcie 3V, natomiast na linii bitów wystawia się odpowiednie wartości, co jest powodem właściwego ustawienia tranzystorów.
Pamięć dynamiczna
Komórka pamięci dynamicznej, przechowująca pojedynczy bit informacji, przedstawiona jest na poniższym rysunku.
Informacje przechowywane są w pamięci DRAM pod postacią ładunku zgromadzonego przez kondensator Cs. Na skutek rozładowania kondensatora, ustala na nim napięcie odpowiadające logicznemu zeru, natomiast poprzez proces ładowania, ustalone napięcie odpowiada jedynce logicznej.
Organizując adres jak na rysunku, komórka posiada wejście adresowe W dla wierszy, oraz pojedynczą linię danych wspólną dla komórek o adresie określanym przez kolumnę B. Wspólny dla kolumny adresowej B jest wzmacniacz odczytu. Po wybraniu komórki, na wejściach adresowych B oraz W ustala się stan wysoki, a pojemność Cs jest dołączana do linii danych. Podczas zapisu doprowadzane jest do niej napięcie ze wzmacniacza zapisu, które odpowiada logicznej jedynce lub zeru. Po fazie odczytu ładunek znajdujący się w pojemności Cs stopniowo ładuje dużo większą pojemność Cb, na którą składa się dodatkowo pojemność drenu, dlatego napięcie odczytu powinno być dużo wyższe od napięcia na kondensatorze Cs. Odczyt powinien być wzmacniany dobrym układem uzupełnionym o elementy odświeżające pamięć, które będą odświeżały poszczególne kolumny niezależnie od wykonywanego cyklu. Innym rozwiązaniem jest zastosowanie wielotranzystorowych komórek pamięciowych z dużo prostszym układem odświeżania oraz prostym wzmacniaczem odczytu/zapisu.
Rodzaje pamięci
Pamięć operacyjna znajdująca się w każdym komputerze nazywana jest pamięcią RAM - Random Access Memory. W dosłownym tłumaczeniu jest to pamięć o swobodnym dostępie do każdej komórki pamięci. Biorąc pod uwagę różny dostęp i budowę, można wyróżnić wśród pamięci RAM typy przedstawione poniżej.
Podział pamięci ze względu na ich budowę:
- SRAM - Static RAM. Jest to pamięć statyczna, która wykonana jest w oparciu o bipolarne tranzystory. Została ona dokładniej omówiona we wcześniejszych akapitach. Cechą charakterystyczną dla niej jest niezwykle krótki czas dostępu do poszczególnych komórek pamięci oraz nielotność danych. Wadą pamięci SRAM jest ich droga cena, z tego powodu wykorzystywane są niemal wyłącznie jako pamięci typu cache.
- DRAM - Dynamic RAM. Każda komórka pamięci DRAM w rzeczywistości składa się z kondensatora oraz tranzystora. Dlatego też pamięć DRAM umożliwia uzyskanie bardzo wysokiego stopnia integracji wielu przyrządów półprzewodnikowych na bardzo małej powierzchni. Architektura tego typu pamięci posiada jednak znaczną wadę. Każda informacja zapisana w pamięci dynamicznej jest przechowywana w kondensatorach o bardzo małej pojemności, które dosyć szybko tracą zgromadzony na swoich okładkach ładunek. Fakt ten wymaga od projektantów pamięci zaimplementowania układu ciągłego odświeżania zawartości pamięci DRAM. Pojedyncza komórka pamięci może być adresowana w dwóch etapach. Na początku wybiera się adres wiersza, jest to cykl RAS - Row Adress Strobe. Kolejnym etapem jest cykl adresowania kolumny, który nosi nazwę cyklu CAS - Colum Adress Strobe. Kiedy odpowiednie adresy pamięci zostaną zaadresowane przez procesor komputera, możliwe staje się dokonanie zapisu lub odczytu interesującej nas informacji, zależnie od tego, jaką wartością logiczną cechuje się dany sygnał zapisu lub odczytu.
- SDRAM - Synchronous Dynamic RAM. Jest to rodzaj synchronicznej pamięci dynamicznej. Tego typu pamięć jest bardzo podobna w swojej budowie do pamięci typu DRAM. Dostęp do komórek jest jednak zsynchronizowany z zegarem zewnętrznym, który taktuje procesor.
Podział pamięci ze względu na dostęp:
- FPM DRAM - Fast Page Mode DRAM. Pamięć tego typu była wykorzystywana jako pamięć SIMM w starych komputerach 486 oraz Pentium. Charakterystycznym dla układów FPM - DRAM jest znacznie szybszy dostęp do pamięci, w porównaniu z klasycznymi modułami DRAM. Adres wiersza RAS, czyli adres strony wybierany jest tylko raz, o ile interesujące nas komórki pamięci znajdują się w ramach tej samej strony pamięci. Wybierane za każdym razem są jedynie kolumny, co w rezultacie znacznie skraca czas operacji na pamięci.
- EDO DRAM - Extended Data Out DRAM. Pamięć ta przypomina swoją budową pamięć FPM - DRAM. Jedyną różnicą jest w przypadku pamięci EDO - DRAM jest odczytywanie informacji, które pozostają na magistrali również wtedy, kiedy sygnał CAS nie jest już aktywny. Taki mechanizm buforowania procesora może w trakcie odczytu danych generować następny adres. To rozwiązanie umożliwia zazwyczaj zaoszczędzenie jednego lub dwóch taktów zegara, ale może być także wykorzystywane przy operacjach odczytu.
- BEDO DRAM - Burst EDO DRAM. Ten rodzaj pamięci cechuje się jeszcze większą prędkością. Swego czasu możliwe było wykorzystywanie jej jedynie w nowoczesnych płytach głównych komputerów wyposażonych w nowe procesory Pentium. Zaprzestano adresowania pojedynczych komórek pamięci roboczej na korzyść zapisywania oraz odczytywania danych pogrupowanych w pakiety, które fachowo znane są pod nazwą Burst. Zazwyczaj pojedynczy pakiet Burst składa się z czterech słów podwójnych, liczy więc 4 x 32 bity. Bardzo szybki dostęp do pamięci możliwy jest jedynie dzięki temu, że Burst EDO - DRAM może wyręczać procesor w procesie adresowania adresów kolumn, zarówno w czasie zapisu jak i odczytu danych.
Pojęcie adresu
Adres jest to specyficzna liczba opisująca komórkę pamięci. Przy pomocy adresu możemy informować procesor, gdzie powinna zostać zapisana lub skąd powinna zostać odczyta informacja. Pojęcie adresu już nie wystarcza, biorąc pod uwagę dużą ilość sposobów dostępu procesora do pamięci. Poniżej zdefiniujemy najważniejsze pojęcia adresów, które powinny zostać poznane, by móc bez żadnych problemów orientować się w czasie czytania specjalistycznej literatury. Możemy wyróżnić następujące rodzaje adresów:
- Adres fizyczny - physical adress. Jest to adres najniższego poziome. W momencie komunikacji procesora z układem, który obsługuje dostęp do pamięci, na liniach adresowych tego układu wystawiany jest właśnie adres fizyczny. Jest on wykorzystywany do tworzenia tablic, które implementują stronicowanie albo do komunikacji z różnymi urządzeniami. Należy podkreślić, że w czasie gdy wyłączymy mechanizm stronicowania pamięci, adres liniowy staje się równoznaczny z adresem fizycznym.
- Adres liniowy - linear adress. Jest to forma przejściowa pomiędzy adresem fizycznym, a logicznym. Dzięki adresowi liniowemu możliwe jest uzyskanie ciągłości pamięci nawet wtedy, gdy jest ona fizycznie rozdzielona. Adres liniowy zamieniany jest przez mechanizm stronicowania, przy pomocy tablicy stron, na adres fizyczny. Systemy wielozadaniowe charakteryzują się brakiem możliwości wymiany adresów liniowych pomiędzy zadaniami, ponieważ każde z zadań powinno posiadać swoją oddzielną tablicę stron. Adresy liniowe są najczęściej wykorzystywane do tworzenia deskryptorów.
- Adres logiczny - logical adress. Adres ten jest złożony z dwóch części: identyfikatora segmentu oraz przemieszczenia wewnątrz tego segmentu. W trybie rzeczywistym i V86 identyfikator segmentu jest podzielonym przez 16 adresem liniowym, natomiast dla trybu chronionego jest to selektor segmentu. Tego typu adres zapisywany jest w postaci SELEKTOR: OFFSET lub SEGMENT: OFFSET. Powinniśmy wykorzystywać adres logiczny do odczytywania oraz zapisywania danych, jest on bowiem automatycznie zamieniany przez procesor najpierw na adres liniowy, a potem na fizyczny.
- Adres segmentowy - segment. Stanowi on pierwszą część adresu logicznego. Jeśli podany został bez przemieszczenia znaczy to, że wskazuje on nie na pojedynczą komórkę pamięci, a na cały blok pamięci. Przemieszczenie, jakie jest domyślnie przyjmowane wynosi zero. Adres segmentowy jest zwracany przez pewne funkcje interfejsu API - Application Program Interface.
- Adres relatywny - offset. Offset jest przemieszczeniem względem pewnego segmentu lub bloku danych. Adres segmentu powinien być znany.
Jeszcze raz o pamięci wirtualnej
Dzięki wykorzystaniu mechanizmu stronicowania pamięci jest możliwe stworzenie pamięci wirtualnej - virtual memory. Dzięki temu dostępna przestrzeń pamięci powiększona zostaje o nieistniejące jej obszary. W momencie, gdy zostanie stwierdzone żądanie przydziału pamięci, a cały obszar fizyczny jest wykorzystywany, system operacyjny najpierw zapisuje pamięć fizyczną na dysk, a następnie, przy udziale mechanizmu stronicowania, przepina pamięć, udostępniając ją tym samym zadaniu, które zgłosiło żądanie. Jeśli pamięć, która zapisana jest na dysku, jest nam potrzebna w danym momencie, system operacyjny dokonuje zapisu innego obszaru i tak dalej. Zapis napięci jest dokonywany do specjalnie w tym celu stworzonego pliku zwanego plikiem wymiany - swap file, albo partycją wymiany - swap partition. Jeśli mamy do czynienia z plikiem, powinien on zajmować kolejne sektory i nie wolno go przenosić w inne miejsce na dysku twardym. Rozmiar pamięci wirtualnej ograniczany jest rozmiarem partycji lub pliku wymiany. Należy pamiętać, że pewne obszary pamięci powinny zostać zablokowane przed ewentualną wymianą na dysk, dotyczy to zwłaszcza kluczowych do poprawnego działania systemu procedur obsługi przerwań, a także procedur systemowych, które nie powinny czekać tak długo na odczyt z dysku.
Aby doszło do wymiany powinniśmy uzyskać kontrolę nad wyjątkiem Page Fault zapisanym pod adresem 0DH, a także nad tablicami stron. Trzeba zdefiniować określony bit wpisu w tablicach, który będzie sygnaturą możliwości wymiany danej strony z dyskiem twardym. W czasie, gdy bit wpisu zostanie wyzerowany, reszta bitów staje się dostępna i powinna być wykorzystana jako numer sektora w partycji lub pliku wymiany. Procedura obsługi stanu wyjątkowego 0DH powinna najpierw odczytać liniowy adres komórki, do której dostęp wygenerował wyjątek - rejestr CR2. Mając już ten adres możemy znaleźć właściwy wpis w poszczególnych tablicach. W następnej kolejności należy odszukać stronę, która zostanie zapisana na dysk. Strona powinna być obecna w pamięci oraz mieć prawo do wymiany, a więc jej sygnatur musi być ustawiona na wartość 1. Strona jest zapisywana na dysk, zerowana jest jej sygnatura i uzupełniany jej wpis o odpowiedni sektor partycji lub pliku wymiany. W następnej kolejności wolna pamięć fizyczna jest podpinana pod tą, która odpowiadała za wygenerowanie wyjątku. Na zakończenie całej procedury dane są odczytywane z dysku.