Programowanie Niskopoziomowe Wykład 4: Architektura i zarządzanie pamięcią IA-32 Dr inż. Marek Mika Państwowa Wyższa Szkoła Zawodowa im. Jana Amosa Komeńskiego W Lesznie
Plan Wstęp Tryby pracy Rejestry Zarządzanie pamięcią
Architektura IA-32 Wiele usprawnień stosowanych we współczesnych procesorach m.in.: potokowość superskalarność predykcja skoków hiperwątkowość wielordzeniowość Z programistycznego punktu widzenia IA-32 nie zmieniła się znacząco poza wprowadzeniem zbioru instrukcji o wyższej wydajności
Tryby pracy Tryb chroniony (protected mode) Windows, Linux dostępne wszystkie instrukcje i cechy procesora programy mają przydzielone odrębne segmenty pamięci procesor chroni programy przed dostępem do innych segmentów pamięci Tryb rzeczywisty (real-addres mode) MS-DOS środowisko procesora 8086 z kilkowa udoskonaleniami (możliwość przełączania w inny tryb stosowany, gdy potrzebny bezpośredni dostęp do sprzętu i pamięci programy działające w tym trybie mogą powodować zawieszenia systemu Tryb systemowy (system management mode) oferuje implementację takich funkcji jak zarządzanie energią, diagnostyka i bezpieczeństwo systemu, które zazwyczaj używane są wyłącznie przez producentów sprzętu Tryb wirtualny (virtual-8086 mode) jest to szczególny przypadek w trybie chronionym, który umożliwia wykonywanie programów trybu rzeczywistego, ale jest zabezpieczony przed możliwością zawieszenia każdy program ma swój własny komputer 8086
Przestrzeń adresowa W 32-bitowym trybie chronionym do 4 GB W trybie rzeczywistym do 1 MB (adresy 20- bitowe) W trybie chronionym każdy program wykonywany w trybie wirtualnym dostaje swoje 1 MB pamięci Począwszy od procesora P6 technika Extended Physical Addressing umożliwia zaadresowanie do 64 GB
Rejestry EAX EBX ECX EDX EBP ESP ESI EDI EFLAGS EIP CS SS DS ES FS GS
Dostęp do fragmentów rejestrów danych Wykonywany za pośrednictwem 8-bitowych i 16-bitowych nazw Zastosowanie wyłącznie do rejestrów EAX, EBX, ECX 8 8 32-bitowe 16-bitowe 8-bitowe (starszy) 8-bitowe (młodszy) EAX AX AH AL. AH 16 AL EBX BX BH BL AX ECX CX CH CL EDX DX DH DL 32 EAX
Rejestry adresowe Młodsza część rejestrów adresowych - rejestry 16- bitowe (brak 8-bitowych) używane zazwyczaj tylko w trybie rzeczywistym. 32-bitowe ESI EDI EBP ESP 16-bitowe SI DI BP SP
Zastosowania rejestrów (1) Rejestry uniwersalne (danych i adresowe): EAX akumulator (automatycznie używany przy mnożeniu i dzieleniu) EBX wskaźnik do danych w segmencie DS ECX licznik pętli i łańcuchów znakowych EDX wskaźnik we/wy ESP wskaźnik stosu (nie powinien być używany w operacjach arytmetycznych i do przesyłania danych) ESI oraz EDI rejestry indeksowe (źródłowy i docelowy używane w instrukcjach łańcuchowych, wskaźniki danych w segmencie DS. i ES) EBP wskaźnik ramki stosu (bazowy)
Zastosowania rejestrów (2) Rejestry segmentowe CS segment kodu DS segment danych SS segment stosu ES, FS, GS dodatkowe segmenty EIP licznik rozkazów EFLAGS znaczniki stanu i kontrolne każdy znacznik (flaga) to pojedynczy bit (stany set lub clear) młodsza część 16-bitowy rejestr FLAGS Inne rejestry systemowe takie jak: IDTR, GDTR, LDTR itd.
Znaczniki stanu Przeniesienia (C Carry) przy przekroczeniu zakresu w arytmetyce bez znaku Przepełnienia (O Overflow) przy przekroczeniu zakresu w arytmetyce ze znakiem Znaku (S Sign) przy ujemnym wyniku Zera (Z Zero) przy wyniku równym 0 Przeniesienia pomocniczego przy przeniesieniu z 3 na 4 bit Parzystości suma jedynek w zapisie binarnym jest liczbą parzystą
Rejestry koprocesora Osiem 80-bitowych rejestrów zmiennoprzecinkowych ST(0), ST(1),,ST(7) organizacja stosowa używane we wszystkich operacjach zmiennoprzecinkowych ST(0) ST(1) ST(2) ST(3) ST(4) ST(5) ST(6) ST(7) 48-bitów 48-bitów 16 16 16 11 licznik rozkazów FPU wskaźnik danych (operand) FPU rejestr sterujący (ustawianie m.in. typu zaokrąglenia, maski wyjątków) rejestr stosu koprocesora (określa typ zawartości rejestrów ST(0)..ST(7)) rejestr stanu koprocesora (m.in. wyjątki położenie wierzchołka stosu) rejestr kodu operacji (bez prefiksu)
Rejestry MMX i XMM Osiem 64-bitowych rejestrów MMX do operacji na spakowanych liczbach całkowitych, do przechowywania operandów dla operacji wykonywanych na rejestrach MMX i XMM Osiem 128-bitowych rejestrów XMM w jednostce wektorowej (SIMD) do operacji na spakowanych lub skalarnych liczb zmiennoprzecinkowych pojedynczej precyzji 32-bitowy rejestr MXCSR bity stanu i sterujące używane w zmiennoprzecinkowych operacjach jednostki wektorowej (SIMD) MXCSR MM7 MM6 MM5 MM4 MM3 MM2 MM1 MM0 XMM7 XMM6 XMM5 XMM4 XMM3 XMM2 XMM1 XMM0
ZARZĄDZANIE PAMIĘCIĄ
Tryb rzeczywisty Real-address mode Przestrzeń adresowa 1MB Adresy 20-bitowe Programy mogą mieć dostęp do dowolnego obszaru pamięci Jednozadaniowość System MS-DOS (także wczesne wersje MS- Windows)
adresy liniowe Pamięć segmentowana Sposób adresowania adres bezwzględny (absolutny, liniowy) jest kombinacją 16-bitowej zawartości rejestru segmentowego i 16-bitowego przesunięcia (offset) względem początku segmentu F000 E000 D000 C000 B000 A000 9000 8000 7000 6000 5000 4000 3000 2000 1000 0000 8000:FFFF 8000:0000 segment offset 0250 pojedynczy segment (64kB) 8000:0250
Wyznaczanie adresu bezwzględnego Dla danego adresu segmentowego i przemieszczenia obliczenie adresu bezwzględnego polega na: pomnożeniu adresu segmentowego przez 16 (dołożenie szesnastkowego 0 na końcu) dodaniu przemieszczenia (ofsetu) Przykład: zamiana adresu 08F10:016A na adres liniowy Adres segmentu: 0 8 F 1 0 Offset: + 0 1 6 A Adres bezwzględny: 0 9 0 7 A Typowy program korzysta z trzech segmentów pamięci: kodu, danych i stosu. Rejestry CS, DS i SS przechowują adres segmentu i zapobiegają nakładaniu się segmentów.
Tryb chroniony Przestrzeń adresowa 4 GB Adresy 32-bitowe Każdy program ma własny obszar pamięci chroniony przed dostępem innych programów Zaprojektowany dla zastosowań wielozadaniowych Systemy operacyjne Unix-owe (w tym Linux) i MS- Windows (NT) Tablica deskryptorów segmentów Struktura programu: obszary kodu, danych i stosu deskryptory segmentów CS, DS, SS globalna tablica deskryptorów (GDT) Programy pisane w MASM-ie najczęściej stosują płaski model pamięci
Fizyczna pamięć RAM Obszar nieużywany Płaski model pamięci Wszystkie segmenty odwzorowane w całej 32-bitowej fizycznej przestrzeni adresowej Co najmniej dwa segmenty (jeden danych i jeden kodu) Globalna tablica deskryptorów FFFFFFFF (4GB) Deskryptor segmentu w GDT adres bazowy limit dostęp 00000000 0040 ---- 00040000 00000000
Wielosegmentowy model pamięci Każdy program ma własną lokalną tablicę deskryptorów, która przechowuje deskryptory dla każdego segmentu używanego przez program Lokalna tablica deskryptorów (LDT) FFFFFFFF (4GB) adres bazowy limit dostęp 00026000 0010 00008000 000A 00003000 0002 mnożone przez 100H 00026000 00008000 00003000 00000000
Translacja adresów Procesory IA-32 używają jedno- lub dwuetapowego procesu translacji adresu logicznego na unikalny adres w przestrzeni adresowej pamięci Pierwszy etap polega na wyznaczeniu adresu liniowego na podstawie adresu segmentu i przemieszczenia Drugi opcjonalny etap, nazywany translacją strony, zamienia adres liniowy na adres fizyczny
Zamiana adresu logicznego na adres liniowy Selektor segmentu wskazuje na deskryptor segmentu zawierający adres bazowy segmentu pamięci 32-bitowe przemieszczenie z adresu logicznego jest dodawane do bazowego adresu segmentu tworząc 32-bitowy adres liniowy. Adres logiczny selektor offset Tablica deskryptorów deskryptor segmentu + GDTR/LDTR bazowy adres tablicy deskryptorów adres liniowy
Indeksowanie w tablicy deskryptorów Każdy deskryptor segmentu indeksuje lokalną tablicę deskryptorów (LDT) programu Każda pozycja w tablicy odwzorowuje adres liniowy Adres logiczny SS ESP 0018 0000002A Lokalna tablica deskryptorów Przestrzeń adresów liniowych (nieużywane) DRAM DS offset 0010 000001B6 CS IP 0008 00002CD3 (indeks) 18 10 08 00 001A0000 0002A000 0001A000 00003000 rejestr LDTR
Stronicowanie (1) Pamięć wirtualna używa pamięci dyskowej jako części pamięci, dzięki czemu łączna zajętość pamięci przez wszystkie uruchomione programy może być większa od fizycznego rozmiaru pamięci RAM Tylko część programu musi być przechowywana w pamięci, a pozostałą część może być przechowywana na dysku Obszar pamięci używany przez program jest podzielony na mniejsze części nazywane stronami (najczęściej 4kB) Podczas wykonywania programu procesor wybiórczo usuwa nieaktywne strony z pamięci, a na ich miejsce ładuje inne bezpośrednio ppotrzebne strony
Stronicowanie (2) System operacyjny zarządza katalogiem stron i tablicami stron Translacja strony: CPU zamienia adres liniowy na adres fizyczny Błąd strony: występuje wtedy, gdy potrzebna strona nie znajduje się w pamięci, a CPU przerywa program Menedżer pamięci wirtualnej (VMM Virtual Memory Manager) narzędzie systemu operacyjnego zarządzające ładowaniem i usuwaniem stron pamięci wirtualnej Po skopiowaniu strony do pamięci program wznawia działanie
Translacja strony Adres liniowy jest podzielony na 10-bitowy indeks katalogu stron, 10-bitowy indeks tablicy stron, 12-bitowe przemieszczenie w obrębie strony CPU używa wszystkich 3 pól do wyznaczenia adresu fizycznego Adres liniowy katalog tablica offset Katalog stron Tablica stron Ramka strony adres fizyczny indeks tab. stron indeks katalogu CR3 32 bity
DZIĘKUJĘ ZA UWAGĘ