Budowa wnętrza procesora x86 Marika Kuczyńska, Joanna Tokarz Akademia Górnicz- Hutnicza im. Stanisława Staszica w Krakowie Wydział Fizyki i Informatyki Stosowanej Fizyka Techniczna Kraków, 20.03.2013
Plan prezentacji 1. Schemat Budowy procesora Intel (IA-32) 3. Jednostka Wykonawcza a) Rejestry ogólnego przeznaczenia - rejestry arytmetyczne - rejestry wskaźnikowe i indeksowe a) Rejestr znaczników (EFLAG, RFLAG) c) Wskaźnik instrukcji (EIP/RIP) d) Jednostka zmiennoprzecinkowa, koprocesor (FPU) e) Rejestry kontrolne (CR) 4. Instrukcje a) rejestry MMX (64bit) b) rejestry XXM (128bit) c) rozszerzenie AVD (rejestr YMM) (255bit)
Schemat blokowy mikroprocesora Intel IE-32 (32-bity) Jednostka wykonawcza Jednostka interfejsowa
Jednostka Wykonawcza Jednostka wykonawcza składa się z: h - podstawowych rejestrów wykonawczych: ogólnego przeznaczenia segmentów RFlag wskaźnika instrukcji - rejestrów koprocesora - rejestru kontrolnego - rejestru statusu - rejestru znaczników - rejestrów wskaźnikowych - rejestrów XMM i MMX
Jednostka wykonawcza mod 32 mod 64
Rejestry jednostki wykonawczej Główne rejestry: - 16 rejestrów ogólnego przeznaczenia GPRs (32/64 bity) - 6 rejestrów segmentowych (16 bitów) - rejestr znaczników (EFLAG\RFLAG) (32/64 bity) - licznik rozkazów EIP/RIP (32/64 bity) - 8 rejestrów jednostki zmiennoprzecinkowej - 16 rejestrów XMM (128 bitów)
Rejestr ogólnego przeznaczenia W skład bloku rejestru ogólnego przeznaczenia wchodzą: p - rejestr arytmetyczny - rejestr wskaźnikowy - rejestr indeksowy Zastosowanie: pk - Służą jako liczniki (głównie rejestr ECX) - Funkcjonują jako przechowalnie argumentów - Przechowywanie operandów i wyników obliczeń arytmetycznych. - Są wskaźnikami pamięci
Rejestr ogólnego przeznaczenia (General-Purpose Register) 8 bits 16 bits 32 bits - Rejestr bajtów (Byte Registers ) AL, BL, CL, DL, AH, BH, CH, DH - Rejestr słów (Word Registers) AX, BX, CX, DX, DI, SI, BP, SP - Rejestr podwójnych słów (Doubleword Registers ) EAX, EBX, ECX, EDX, EDI, ESI, EAX, EBX, ECX, EDX, EDI, ESI, EBP, EBP, ESP
Rejestr ogólnego przeznaczenia (General-Purpose Register) - Rejestr poczwórnych słów (Quadword Registers ) RAX, RBX, RCX, RDX, RDI, RSI, RBP, RSP, R8 - R15
Rejestr ogólnego przeznaczenia (General-Purpose Register) KIEDYŚ: Rejestry danych: EAX rejestr akumulacji EBX - rejestr bazowy ECX - rejestr licznika EDX - rejestr danych Rejestry adresowe: ESP wskaźnik stosu EBP wskaźnik bazowy ESI - wskaźnik źródła EDI - przeznaczenie k TERAZ: Każdy z 16 rejestrów może wykonywać każdą z wyżej wymienionych prac. Nie ma podziału na rejestry poszczególnego przeznaczenia, ponieważ rejestry są przemienne i wymienne. k R8 R15 reprezentują 8 nowych GPR, gotowych do użycia.
Rejestr znaczników (flag) Dzięki rejestrowi znaczników mamy możliwość kontrolowania ustawień samego procesora. k Zapisane są w nim takie ustawienia, jak np. : j j - możliwość korzystania z instrukcji wejścia-wyjścia, - informacje nt. ostatnio przeprowadzanej operacji arytmetycznej.
Rejestr znaczników (flag) EFLAG Flagi znajdujące się w rejestrze dzielimy na: k - flagi stanu (S) - flagi systemowe (X) - flagi sterowania (C)
Znaczenia flag (S) CF (carry flag) - znacznik przeniesienia 0 - wynik operacji arytmetycznej nie powoduje powstania przeniesienia z najbardziej znaczącego bitu 1 - wynik takie przeniesienie powoduje PF (parity flag) - znacznik parzystości - ustawiany w zależności od liczby jedynek w najmniej znaczących 8 bitach wyniku 0 - liczba jedynek w wyniku operacji nieparzysta 1 - liczba jedynek w wyniku operacji parzysta AF (auxiliary carry flag) - znacznik przeniesienia połówkowego (pomocniczego) 0 - brak przeniesienia pomiędzy trzecim i czwartym bitem bajta (BCD) 1 - występuje przeniesienie
Znaczenia flag (S) ZF (zero flag) - znacznik zera 0 - wynik operacji różny od zera 1 - wynik operacji równy zeru S SF (sign flag) - znacznik znaku - równy najbardziej znaczącemu bitowi wyniku 0 - wynik operacji dodatni 1 - wynik operacji ujemny F OF (overflow flag) - znacznik nadmiaru 0 - suma modulo 2 przeniesień z najbardziej znaczącej pozycji i pozycji przedostatniej jest równa 0 1 - suma modulo 2 przeniesień z najbardziej znaczącej pozycji i pozycji przedostatniej jest równa 1 (przekroczenie zakresu w kodzie U2) F TF (trap flag) - znacznik pułapki umożliwiającej pracę krokową 0 - praca krokowa wyłączona 1 - praca krokowa włączona, mikroprocesor po wykonaniu każdego rozkazu wykona skok do odpowiedniego podprogramu obsługi przerwania IF (interrupt flag) - znacznik przerwań 0 - brak zezwolenia na przyjmowanie przerwań z wejścia INT 1 - zezwolenie na przyjmowanie przerwań DF (direction flag) (C) - znacznik kierunku 0 - rejestry są zwiększane 1 - rejestry są zmniejszane
Znaczenia flag (X) IOPL (I/O priviege field) poziom uprzywilejowania we/wy 0 - odczyt/zapis jest zabroniony 1 odczyt/zapis jest dozwolony d NT (Nested task flag) - flaga zadania zagnieżdżonego 0 - obecny proces nie wywodzi się z żadnego innego 1 - proces jest zadaniem zagnieżdżonym g RF (resume flag) flaga wznowienia 0 nie wystąpiło przerwanie zatrzymujące wykonanie programu 1 - wystąpiło przerwanie zatrzymujące wykonanie programu g VM (Virtual-8086 mode flag) flaga trybu wirtualnego 8086 0 - brak przejścia, pozostanie w obecnym trybie 1 - przejście w tryb emulacji procesora 8086 AC (Alignment chcek flag) sprawdzenie wyrownania 0 - włączone 1 - włączone VIF (Virtual interrupt flag) flaga przerwania wirtualnego 0 - nie pozwala na przerwania w trybie wirtualnym 1 pozwala na wirtualne przerwania VIP (Virtual interrupt pending flag) oczekujące przerwanie wirtualne 0 - brak wirtualnych przerwań 1 - trwa wirtualne przerwanie ID (identification flag) - identyfikacja 0 nie można zmienić wartości 1 - można zmienić wartość
Wskaźnik instrukcji (instruction pointer) IP - wskazuje na adres aktualnie wykonywanej instrukcji. Procesor ma zapętlony sposób działania: pobiera instrukcję, wykonuje ją i, na koniec cyklu, zwiększa zawartość rejestru IP o długość wykonanej instrukcji. W razie uruchomienia programu, początkowo rejestr IP wskazuje na początek segmentu kodu. EIP rozszerzenie IP na 32 bity RIP rozszerzenie IP na 64 bity - nie możemy się dostać do IP bezpośrednio przez software - kontrolowany jest przez instrukcje takie jak: JMP, Jcc, CALL, RET, przerwania i wyjątki
Rejestry koprocesora FPU (floating point unit) Czyli tak zwany koprocesor - Jest to blok procesora wspomagający go w obliczeniach zmiennoprzecinkowych Składa się z: - Rejestrów kontrolnych - Rejestru statusu - rejestru znaczników - wskaźnika instrukcji - wskaźnika opernadów
Rejestry kontrolne Istnieje 5 rejestrów kontrolnych: d CR0- Modyfikuje podstawowe operacje procesora. k CR1- Ten rejestr jest zarezerwowany i nie mamy do niego żadnego dostępu. d CR2- Jeśli dojdzie do gdzieś do błędu, to adres wystąpienia tego błędu jest przechowywany właśnie w CR2 d CR3- Używany tylko jeśli bit PG w CR0 jest ustawiony. CR3 umożliwia procesorowi zlokalizowanie położenia tablicy katalogu stron dla obecnego zadania. Ostatnie (wyższe) 20 bitów tego rejestru wskazują na wskaźnik na katalog stron zwany PDBR (ang. Page Directory Base Register). d CR4- Używany w trybie chronionym w celu kontrolowania operacji takich jak wsparcie wirtualnego 8086, technologii stronicowania pamięci, kontroli błędów sprzętowych i innych.
Rejestry kontrolne - Mają długość 32 bitów na procesorze 386 lub wyższym. - Na procesorze x86-64 analogicznie rejestry mają długość 64 bitów.
Rejestry kontrolne - CR0 PE (Protection Enabled) 0 pracuje w trybie rzeczywistym 1 pracuje w trybie chronionym WP (Write Protection) 0 ochrona wyłączona 1 włącza ochronne zapisu MP (Monitor Coprocessor) 1 kontroluje instrukcje WAIT/FWAIT EM (Emulate Flag) 0 obecność jednostki x87 1 nie ma żadnego koprocesora TS (Task switched) Pozwala zachować zadania x87. 1 przełączanie zadań ES (Extention type) Mówi nam jaki mamy koprocesor. 0 80287 1 80387 NE (Numeric Error) 1 włącza wewnętrzne raportowanie błędów FPU AM (Aligment Mask) 0 maska wyłączona 1 włącza maskę wyrównania NW (No Write-Through) 0 zapis do pamięci poprzez cache 1 bezpośredni zapis do pamięci CD (Casche disable) 0 pamięć cache włączona 1 pamięć cache wyłączona PG (Paging Flag) 0 wyłączone stronicowanie 1 włączone stronicowanie
Rejestry kontrolne - CR4 VEM (Virtual 8086 Mode Extensions) PCE (Performance-Monitoring Counter Enable) 1 włącza wirtualną flagę przerwań g 0 - rozkaz może być wykonany tylko w PVI (Protected Mode Virtual Interrupts) trybie jądra (poziom 0) 1 - włącza sprzętowe wsparcie dla wirtualnej 1 - rozkaz RDPMC może być wykonany w flagi przerwań (VIF) w trybie chronionym każdym poziomie uprzywilejowani ;jhbj ;jhbdj TSD (Time Stamp Disable) OSFXSR (Operating system support for FXSAVE 0 - rozkaz RDTSC może być wykonany and FXSTOR instructions) na każdym poziomie uprzywilejowania 1 Wsparcie systemu operacyjnego dla 1 - rozkaz RDTSC może być wykonany instrukcji FXSAVE i FXSTOR g,, tylko w poziomie uprzywilejowania 0 OSXMMEXCEPT (Operating System Support for (czyli w trybie jądra) s Unmasked SIMD Floating-Point Exceptions) PGE (Page Global Enabled) 1 - Wsparcie systemu operacyjnego dla 1 włącza globalne stronicowanie niemaskowanych wyjątków technologii SIMD
Rejestr MMX * Rozszerzenie MMX wraz ze swoimi rejestrami zostało wprowadzone w procesorach Pentium (1997). k * Rejestry MMX są ponumerowane od MM0 do MM7 i wszystkie są 64-bitowe. i * Rejestry te nie są wydzielone, lecz są częścią składową rejestrów jednostki stałoprzecinkowej. i * MMX pozwala na : - przeprowadzanie kilku obliczeń stałoprzecinkowych jednocześnie. - wykorzystywane są również przez rozszerzenia stworzone przez AMD - 3DNow oraz 3DNow!, które z kolei umożliwiają przeprowadzanie obliczeń zmiennoprzecinkowych.
Rejestr XMM * Rejestry XMM zostały wprowadzone wraz z rozszerzeniem SSE w procesorach Pentium III (1999). * Są ponumerowane od XMM0 do XMM7, każdy po 128 bitów. * Rozszerzenie SSE jest kontynuacją rozszerzenia MMX, gdyż założenia są podobne, lecz umożliwiają dodatkowo obliczenia na liczbach zmiennoprzecinkowych. * Co więcej rejestry XMM nie są "aliasami" na rejestry FPU, zatem koprocesor i Rejestry technologii SSE mogą być używane równolegle.
Rejestr YMM AVX (Advanced Vector Extensions) rozszerzenie zestawu instrukcji SSE opublikowane w marcu 2008 przez firmę Intel. * wprowadzono 256-bitowe rejestry * Dodano kilka rozkazów działających wyłącznie na rejestrach YMM (19 instr). * Dodane specjalizowane instrukcje wspomagające szyfrowanie AES (6 instr). * Rozszerzone kodowanie rozkazów(166 instr). * Dodane 4-argumentowe rozkazy akumulujące wyniki mnożenia wektorów liczb zmiennoprzecinkowych (12 instr).
Mnemoniki instrukcji PS, PD - wektor liczb zmiennoprzecinkowych, SS, SD - skalar (pierwszy element wektora), tj. liczba zmiennoprzecinkowa, odpowiednio, pojedynczej i podwójnej precyzji. i wyniki mnożenia rozpoczynają się od VFM lub VFNM, np. VFMADDPD natomiast mnemoniki rozkazów wspomagających szyfrowanie od AES. np. AESDEC
Instrukcje Przesłaniania: - MOV przesłanianie proste - XCHG wymiana - MIVSX przesłanianie z rozszerzeniem bitu znaku - MOVZX przesłanie z rozszerzonymi zerami Arytmetyczno-logiczne (jednoargumentowe): - INC, DEC inkrementacja, dekrementacja - NOT, NEG negacja bitów, zamiana znaku Arytmetyczno-logiczne (dwuargumentowe): - ADD, ADC inkrementacja, dekrementacja - SUB, SBB odejmowanie zwykłe i z przeniesieniem - CMP porównanie: odejmowanie bez zapisu wyniku - AND, OR, XOR logiczne bitowe - TEST test: iloczyn logiczny bez zapisu wyniku
Instrukcje Przesunięcia i rotacje: liczba pozycja zapisana jest jako stała w instrukcji albo w CL - SHL, SHR logiczne w lewo/prawo; z dopełnieniem zerami - SAR arytmetyczne w prawo; z kopiowaniem znaku - ROL, ROR rotacja w lewo/prawo - RCL, RCR rotacja z bitem przeniesienia - SHLD, SHRD przesunięcie dwóch słów w lewo/prawo z zapisem bardziej/mniej znaczącego słowa wyniku Pobieranie adresu efektywnego: LEA - LEA EAX [EBX*8] - LEA EAX [EBX+EBX*8] - stosowane często do mnożenia przez 3,4,5,8,9
Instrukcje Mnożenie i dzielenie: - jednoargumentowe zawiera argument domyślny - dwuargumentowe rejestr, rejestr/pamięć - trójargumentowe rejestr, rejestr/pamięć, stała - MUL, IMUL, DIV, IDIV bez znaku i ze znakiem Skoki: - JMP skok bezwarunkowy - CALL skok ze śladem powrotu, przekazanie sterowania do procedury - Jcc skok po spełnieniu warunku - JMP EAX skok ze wskazanym zmiennym adresem docelowym - JMP [EBX+ECX*4] skok ze wskazanym zmiennym adresem docelowym - RET powrót z procedury - RET n powrót z procedury, po zdjęciu ze stosu n bajtów argumentów
DZIĘKUJEMY ZA UWAGĘ!