AW PS200
Transkrypt
AW PS200
Materiały do wykładu 4. Mikroprocesor Marcin Peczarski Instytut Informatyki Uniwersytet Warszawski 5 kwietnia 2009 Architektura mikroprocesora Rejestry Układ współpracy z szynami Jednostka sterująca połączenia wewnętrzne Jednostka arytmetyczno-logiczna Jednostka arytmetyczno-logiczna Jednostka arytmetyczno-logiczna . Kod maszynowy a Asembler . ⊲ Kod maszynowy – binarny sposób opisu rozkazów procesora ⋄ Każda architektura ma swój unikalny kod maszynowy. ⋄ W obrębie tej samej architektury kod maszynowy może być nieco różny dla poszczególnych modeli procesorów. ⊲ Asembler – język programowania niskiego poziomu ⋄ Jedno polecenie odpowiada zwykle jednemu rozkazowi maszynowemu. ⋄ Każda architektura ma swój unikalny Asembler. ⊲ asembler – program tłumaczący Asembler na kod maszynowy Dlaczego Z80? . ⊲ Jeden z najpopularniejszych mikroprocesorów 8-bitowych ⊲ Nadal produkowany i używany ⊲ Bezpośredni wpływ na najpopularniejszą obecnie architekturę x86 ⊲ Kompromisy projektowe, kompatybilność z 8080 ⊲ Wystarczająco prosty Z80 – rejestry . A F A’ F’ PC B C B’ C’ SP D E D’ E’ IX H L H’ L’ IY I IFF R Z80 – przesyłanie danych 8-bitowych (1) LD d, s 0 1 d s d, s argument 000 001 010 011 100 101 110 111 B C D E H L (HL) A ⊲ Nie ma rozkazu LD (HL), (HL); kod 01110110 to rozkaz HALT! . Z80 – przesyłanie danych 8-bitowych (2) LD d, n 0 0 d 1 1 0 n d argument 000 001 010 011 100 101 110 111 B C D E H L (HL) A . Z80 – przesyłanie danych 8-bitowych (3) LD (p), A LD A, (p) 0 0 0 p d 0 1 0 LD (aa), A LD A, (aa) 0 0 1 1 d 0 1 0 aal aah p para rejestrów d kierunek 0 1 BC DE 0 1 z akumulatora do pamięci z pamięci do akumulatora . Z80 – rejestry indeksowe (1) LD r, (HL) r 0 1 1 1 0 LD r, (i + d) 1 1 i 1 1 1 0 1 r 0 1 1 1 0 d r rejestr i rejestr indeksowy 000 001 010 011 100 101 111 B C D E H L A 0 1 IX IY . Z80 – rejestry indeksowe (2) LD (HL), n LD (i + d), n 0 0 1 1 0 1 1 0 n 1 1 i 1 1 1 0 1 0 0 1 1 0 1 1 0 d n i rejestr indeksowy 0 1 IX IY . Z80 – rejestry primowane EX AF, AF’ 0 0 0 0 1 0 0 0 EXX 1 1 0 1 1 0 0 1 . Z80 – rejestr znaczników S Z – AC . – P/V N CY ⊲ S – najstarszy bit wyniku operacji, wynik ujemny ⊲ Z – wynik operacji zerowy ⊲ AC – pomocnicze przeniesienie z pozycji 3, arytmetyka BCD ⊲ P/V – znacznik parzystości dla operacji logicznych i nadmiaru (ang. overflow) dla operacji arytmetycznych ⊲ N – znacznik zerowany przy wykonywaniu dodawania i ustawiany przy wykonywaniu odejmowania, arytmetyka BCD ⊲ CY – znacznik przeniesienia (pożyczki przy odejmowaniu) Z80 – 8-bitowe operacje arytmetyczno-logiczne 1 0 op s 1 1 op 1 1 0 n s argument op operacja 000 001 010 011 100 101 110 111 B C D E H L (HL) A 000 001 010 011 100 101 110 111 ADD A, y ADC A, y SUB A, y SBC A, y AND A, y OR A, y XOR A, y CP A, y y ∈ {s, n} . Z80 – rotacje i przesunięcia bitów RL x CY RR x CY RLC x CY RRC x CY SLA x CY SRL x 0 SRA x . x x x x x 0 x CY x CY x ∈ {A, B, C, D, E, H, L, (HL), (IX + d), (IY + d)} Z80 – operacje na adresach (1) ⊲ Ładowanie LD p, nn LD p, (aa) LD (aa), p gdzie p ∈ {BC, DE, HL, SP, IX, IY} ⊲ Zamiana EX DE, HL ⊲ Inkrementacja i dekrementacja INC p DEC p gdzie p ∈ {BC, DE, HL, SP, IX, IY} . Z80 – operacje na adresach (2) ⊲ Arytmetyka 16-bitowa ADD HL, p ADC HL, p SBC HL, p gdzie p ∈ {BC, DE, HL, SP} ⊲ Dodawanie i odejmowanie wartości w rejestrach indeksowych ADD IX, p gdzie p ∈ {BC, DE, SP, IX} ADD IY, p gdzie p ∈ {BC, DE, SP, IY} . Z80 – stos (1) ⊲ Zajmuje pewien obszar w pamięci. ⊲ Rejestr SP wskazuje wierzchołek stosu – ostatni zajęty bajt. ⊲ Stos rośnie w dół – w kierunku mniejszych adresów. . Z80 – stos (2) . ⊲ PUSH p ⋄ Odkłada na stos najpierw starszy, potem młodszy bajt argumentu (little-endian). ⋄ Zmniejsza SP o 2. ⋄ p ∈ {AF, BC, DE, HL, IX, IY} ⊲ POP p ⋄ Zdejmuje ze stosu najpierw młodszy, potem starszy bajt i umieszcza je w argumencie. ⋄ Zwiększa SP o 2. ⋄ p ∈ {AF, BC, DE, HL, IX, IY} Z80 – stos (3) ⊲ Inicjowanie wskaźnika stosu LD SP, nn LD SP, (aa) LD SP, p gdzie p ∈ {HL, IX, IY} ⊲ Manipulowanie wierzchołkiem stosu INC SP DEC SP EX (SP), p gdzie p ∈ {HL, IX, IY} . Z80 – skoki i podprogramy JP aa 1 1 0 0 0 0 1 1 CALL aa 1 1 0 0 1 1 0 1 aal aal aah aah . RET 1 1 0 0 1 0 0 1 ⊲ JP wykonuje skok pod podany adres (wpisuje aa do PC). ⊲ CALL odkłada na stos adres następnego rozkazu (adres powrotu) i wykonuje skok pod podany adres. ⊲ RET zdejmuje ze stosu adres powrotu i wykonuje skok pod ten adres. Z80 – rozkazy warunkowe JP w, aa 1 1 w 0 1 0 CALL w, aa 1 1 w 1 0 0 aal aal aah aah . RET w 1 1 w 0 0 0 w skrót warunek skoku 000 001 010 011 100 101 110 111 NZ Z NC C PO PE P M Z=0 Z=1 CY = 0 CY = 1 P/V = 0 P/V = 1 S=0 S=1 Z80 – skoki względne JR d 0 0 0 1 1 0 0 0 JR v, d 0 0 1 v 0 0 0 d d v skrót warunek skoku 00 01 10 11 NZ Z NC C Z=0 Z=1 CY = 0 CY = 1 . ⊲ Skok względny dodaje do PC wartość d traktowaną jako liczba ze znakiem. Z80 – przykład procedury MUL: PUSH PUSH LD LD LD MULTST: CP JR SRL JR ADD MUL2BC: SLA RL JR MULEND: POP POP RET . AF ; Nie modyfikuj rejestrów roboczych. BC ; w B i C argumenty HL, 0 ; w HL wynik A, B B, H ; wyzerowanie B A, 0 Z, MULEND A NC, MUL2BC HL, BC C ; pomnożenie BC B ; przez 2 MULTST BC ; przywrócenie wartości AF ; rejestrom roboczym Z80 – przekazywanie argumentów przez stos LD H, (x) LD L, 5 PUSH HL CALL MUL INC SP INC SP LD (y), HL MUL: ; drugi (ostatni) argument ; pierwszy (przedostatni) argument ; argumenty na stosie od ostatniego ; czyszczenie stosu przez ; procedurę wołającą ; zapisanie wyniku PUSH IX LD IX, 3 ADD IX, SP ... ; (IX + 1) - pierwszy argument ... ; (IX + 2) - drugi argument POP IX RET . Z80 – przekazywanie argumentów przez stos LD H, 5 LD L, (x) PUSH HL CALL MUL LD (y), HL MUL: LD IX, 4 ADD IX, SP ... ... POP IY LD SP, IX JP (IY) ; pierwszy argument ; drugi argument ; argumenty na stosie od pierwszego ; zapisanie wyniku ; ; ; ; ; (IX - 1) - pierwszy argument (IX - 2) - drugi argument zdjęcie adresu powrotu stos czyści procedura wołana powrót z procedury . Z80 – cykl pracy cykl rozkazowy ADD A, E cykle procesora pobranie cykle zegara T1 T2 T3 T4 INC (HL) cykl rozkazowy pobranie cykle procesora cykle zegara . T1 T2 T3 zapis odczyt T4 ⊲ Liczą się tylko dostępy do pamięci! T1 T2 T3 T1 T2 T3 Z80 – przerwania . ⊲ Służą do sygnalizowania procesorowi, że jakieś urządzenie wymaga obsługi, np.: ⋄ wciśnięto klawisz, ⋄ odebrano pakiet danych. ⊲ Niemaskowalne ⋄ zawsze aktywne ⊲ Maskowalne ⋄ włączane rozkazem EI – ustawienie przerzutnika przerwań IFF ⋄ wyłączane rozkazem DI – wyzerowanie IFF ⋄ trzy tryby, ustawiane odpowiednio rozkazami: IM0, IM1, IM2 ⋄ Tryby 0 i 1 są odziedziczone po 8080, omówimy tylko tryb 2. Z80 – zgłaszanie przerwań . ⊲ Urządzenie chcąc zgłasić przerwanie, podaje stan niski na wejście NMI lub INT. ⊲ Procesor testuje stan tych wejść w ostatnim takcie zegara każdego cyklu rozkazowego. ⊲ Jeśli wejście NMI ma stan niski, zamiast wykonywać kolejny rozkaz, procesor przechodzi do obsługi przerwania niemaskowalnego. ⊲ Jeśli wejście INT ma stan niski i przerwanie maskowalne jest włączone, zamiast wykonywać kolejny rozkaz, procesor przechodzi do obsługi przerwania maskowalnego. Z80 – obsługa przerwania niemaskowalnego . ⊲ Zapamiętywany jest aktualny stan IFF. ⊲ Przerwania maskowalne są wyłączane – IFF jest zerowany. ⊲ Wykonywany jest skok do podprogramu obsługi rozpoczynającego się od adresu (66)16 . ⊲ Zakończenie obsługi polega na wykonaniu rozkazu RETN. ⊲ Rozkaz RETN zdejmuje ze stosu adres powrotu i wpisuje go do PC oraz przywraca poprzednią wartość IFF. Z80 – obsługa przerwania maskowalnego (1) . ⊲ Procesor generuje zmodyfikowany cykl pobrania rozkazu. ⊲ W tym cyklu wystawia sygnał potwierdzenia przyjęcia przerwania. ⊲ Urządzenie zgłaszające przerwanie po rozpoznaniu potwierdzenia wystawia na szynę danych numer przerwania b. ⊲ Wartość PC jest odkładana na stosie. ⊲ Przerwanie maskowalne jest wyłączane. ⊲ Z tablicy przerwań pobierany jest adres obsługi przerwania. ⊲ Tablica przerwań jest wskazywana przez rejestr przerwań I. Z80 – obsługa przerwania maskowalnego (2) . ⊲ Adres początku procedury obługi przerwania numer b znajduje się pod adresami 28 · I + b (młodszy bajt), 28 · I + b + 1 (starszy bajt). ⊲ Do PC wpisywany jest adres początku procedury obługi przerwania. ⊲ Przed zakończeniem obsługi zwykle włącza się ponownie przyjmowanie przerwań rozkazem EI. ⊲ Zakończenie obsługi polega zwykle na wykonaniu rozkazu RETI. ⊲ Rozkaz RETI zdejmuje ze stosu adres powrotu i wpisuje go do PC. ⊲ Do manipulowania rejestrem przerwań służą rozkazy LD I, A LD A, I Z80 – szkielet procedury obsługi przerwania INT: EX AF, AF’ EXX ... EXX EX AF, AF’ EI RETI . Z80 – wejście-wyjście ⊲ Komunikacja z urządzeniami, np.: ⋄ odczytanie kodu wciśniętego klawisza, ⋄ odczytanie odebranego pakietu danych, ⋄ sterowanie wyświetlaczem. ⊲ Oddzielna przestrzeń adresowa wejścia-wyjścia ⊲ Rozkazy IN A, (n) OUT (n), A IN r, (C) OUT (C), r gdzie r ∈ {A, B, C, D, E, H, L} . Z80 – pozostałe rozkazy (1) ⊲ Arytmetyczno-logiczne INC x DEC x BIT b, x SET b, x RES b, x RLD RRD CPL NEG CCF SCF DAA gdzie b ∈ {0, 1, . . . , 7}, x ∈ {A, B, C, D, E, H, L, (HL), (IX + d), (IY + d)} . Z80 – pozostałe rozkazy (2) ⊲ Skoki DJNZ d JP (p) gdzie d ∈ {−128, −127, . . . , 127}, p ∈ {HL, IX, IY} ⊲ Operacje na ciągach bajtów w pamięci LDI LDD LDIR LDDR CPI CPD CPIR CPDR . Z80 – pozostałe rozkazy (3) ⊲ Przesłania blokowe z wejścia i na wyjście INI IND INIR INDR OUTI OUTD OUTIR OUTDR ⊲ Przerwania programowe RST a gdzie a ∈ {0, 8, 16, . . . , 56} . Z80 – pozostałe rozkazy (4) ⊲ Inne NOP HALT LD R, A LD A, R ⊲ Nieudokumentowane EX DE, IX EX DE, IY SLL x / SL1 x ... . Małe podsumowanie (1) . ⊲ Z punku widzenia programisty wszystkie mikroprocesory działają podobnie do opisanego. ⊲ Poszczególne architektury różnią się m.in.: ⋄ porządkiem bajtów, ⋄ liczbą i przeznaczeniem rejestrów, ⋄ listą oferowanych instrukcji (rozkazów), ⋄ semantyką operacji dwuargumentowych, ⋄ sposobem realizacji sterowania programem, ⋄ trybami adresowania, ⋄ systemem przerwań. Małe podsumowanie (2) . ⊲ Dalsze różnice: ⋄ rozdzielne lub wspólne przestrzenie adresowe: danych i programu (architektury typu Princeton lub Harward), wejścia-wyjścia, ⋄ mechanizmy ochrony pamięci (brak, segmentacja, stronicowanie). ⊲ Żeby móc działać szybciej, współczesne mikroprocesory mają zupełnie inną organizację (budowę) niż opisany. Rejestry (1) ⊲ danych ⊲ adresowe ⊲ ogólnego przeznaczenia ⊲ specjalizowane ⊲ stanu, znaczników ⊲ wskaźnik stosu ⊲ licznik programu ⊲ zmiennopozycyjne ⊲ wektorowe ⊲ segmentowe ⊲ zarządzania pamięcią ⊲ debugowania . Rejestry (2) ⊲ architektura bezrejestrowa ⊲ minimalny zestaw rejestrów ⊲ mały zestaw rejestrów specjalizowanych ⊲ mały zestaw rejestrów uniwersalnych ⊲ duży zestaw rejestrów uniwersalnych ⊲ bufor wierzchołka stosu ⊲ stosowy zestaw rejestrów . Lista instrukcji (rozkazów) . ⊲ Aplikacyjne ⋄ przesyłanie danych ⋄ operacje arytmetyczne ⋄ operacje bitowe ⋄ operacje na blokach danych ⋄ instrukcje sterujące (skok bezwarunkowy i warunkowy, warunkowe wykonanie instrukcji, wołanie procedury, powrót z procedury) ⊲ Systemowe (tryb uprzywilejowany lub nadzorcy) ⋄ zarządzanie systemowymi strukturami danych ⋄ zmiana trybu pracy procesora Operacje dwuargumentowe Przykładowa składnia Możliwa semantyka add r1, r2 r1 := r1 + r2 add r1, r2 r2 := r1 + r2 add r1, r2, r3 r1 := r2 + r3 add r1, r2, r3 r3 := r1 + r2 . Sterowanie wykonaniem programu ⊲ Jednoetapowe (bez znaczników) bz s1, label ; branch if s1 = 0 jecxz label ; jump if ecx = 0 ⊲ Dwuetapowe ze znacznikami CP A, 0 JR Z, MULEND ; set flags ; jump if Z = 1 cmp eax, 0 jz mulend ; set flags ; jump if zf = 1 ⊲ Dwuetapowe z predykatami cmp.eq p1, p2 = r1, r2 (p1) add r3 = 1, r3 (p2) add r3 = 3, r3 ; if r1 = r2 ; then r3 := r3 + 1 ; else r3 := r3 + 3 . Tryby adresowania argumentów (1) Nazwa . Z80 IA-32 LD B, 7 mov ebx, 7 LD A, (1000) mov eax, [1000] ADD A, B add eax, ebx (rejestrowy) pośredni ADD A, (HL) add eax, [ebx] indeksowy LD A, (IX+8) mov eax, [ebx+4*ecx+8] stosowy PUSH AF POP AF EX (SP), HL push eax pop eax xchg [esp+8*ecx], eax względny JR Z, MULEND jz mulend natychmiastowy bezpośredni rejestrowy (bezpośredni) Tryby adresowania argumentów (2) Nazwa Oznaczenia rejestrowy pośredni z preinkrementacją [+r1] (+r1) rejestrowy pośredni z postinkrementacją . Z80 IA-32 [r1+] (r1+) @r1+ LDI POP AF movs pop eax rejestrowy pośredni z predekrementacją [-r1] (-r1) DJNZ d PUSH AF loop d push eax rejestrowy pośredni z postdekrementacją [r1-] (r1-) @r1- LDD movs System przerwań ⊲ Przerwania sprzętowe ⋄ maskowalne ⋄ niemaskowalne ⊲ Przerwania programowe ⊲ Praca krokowa – debugowanie ⊲ Wyjątki – ponawianie instrukcji, która spowodowała wyjątek ⊲ Element tablicy przerwań ⋄ adres procedury obsługi ⋄ instrukcja skoku do procedury obsługi ⋄ deskryptor procedury obsługi . Pomiar wydajności ⊲ IPS – Instructions Per Second ⋄ MIPS = 106 · IPS ⊲ FLOPS – Floating Point Operations Per Second ⋄ MFLOPS = 106 · FLOPS ⋄ GFLOPS = 109 · FLOPS ⋄ TFLOPS = 1012 · FLOPS ⋄ PFLOPS = 1015 · FLOPS . Metody zwiększania wydajności (1) ⊲ Zwiększanie częstotliwości taktowania ⋄ ograniczenia konstrukcyjne i technologiczne ⋄ wydzielanie ciepła ⋄ czas propagacji ⊲ Inne pomysły ⋄ pobieranie instrukcji na zakładkę ⋄ kolejka (bufor) instrukcji ⋄ przetwarzanie potokowe ⋄ zrównoleglanie wykonywania instrukcji . Metody zwiększania wydajności (2) . ⊲ Nienadążanie szybkość pracy pamięci za wzrostem szybkości pracy procesorów ⋄ zwiększanie szerokości szyny danych ⋄ wielopoziomowe pamięci podręczne, początkowo jako zewnętrzne, a obecnie w jednym układzie scalonym z procesorem ⋄ pamięci umożliwiające pobieranie danych co jeden cykl zegara, a nawet dwa razy w jednym cyklu zegara Przetwarzanie potokowe I1 I2 I1 I3 I2 . I4 I3 I4 F D E M W F D E M W F D E M W F D E M W F – fetch F D E M W F D E M W F D E M W F D E M W D – decode E – execute M – memory access W – write back Potokowanie rozkazów . ⊲ Rozkazy procesora takiego jak Z80 źle się potokuje: ⋄ kod rozkazu zajmuje od 1 do 4 bajtów, co wymaga do 4 dostępów do pamięci; ⋄ rozkaz może wykonywać skomplikowane operacje na argumentach w pamięci, co może wymagać kilku kolejnych odwołań. ⊲ Listę rozkazów należy przeprojektować tak, aby wszystkie rozkazy: ⋄ miały kod tego samego rozmiaru, ⋄ wykonywały podobną liczbę operacji, ⋄ potrzebowały co najwyżej jednego dodatkowego dostępu do pamięci (oprócz wczytania kodu rozkazu). Klasy rozkazów ⊲ Ograniczamy repertuar rozkazów do następujących klas. ⊲ Odczyt z pamięci do rejestru (ang. load), np.: r1 := (r2 + offset) ⊲ Zapis z rejestru do pamięci (ang. store), np.: (r2 + offset) := r1 ⊲ Arytmetyczno-logiczne tylko na rejestrach, np.: r1 := r2 + r3 ⊲ Rozgałęzienia jednoetapowe, np.: branch to label if r1 = r2 . Podział rozkazów na etapy . ⊲ Rozważamy przykładowy potok piecioetapowy. ⊲ F – pobranie kodu rozkazu z pamięci ⊲ D – zdekodowanie rozkazu i pobranie argumentów z rejestrów ⊲ E – wykonanie operacji arytmetyczno-logicznych, obliczenie adresu ⊲ M – odczytanie danych z pamięci lub zapisanie danych do pamięci ⊲ W – zapisanie wyniku do rejestru Przykładowe czasy wykonania . klasa instrukcji F D E M W razem odczyt z pam. 200 ps 100 ps 200 ps 200 ps 100 ps 800 ps zapis do pam. 200 ps 100 ps 200 ps 200 ps arytm.-logiczne 200 ps 100 ps 200 ps rozgałęzienia 200 ps 100 ps 200 ps 700 ps 100 ps 600 ps 500 ps ⊲ Rozkaz musi przebywać w jednym etapie potoku 200 ps. ⊲ Czas wykonania jednego rozkazu wynosi 1000 ps, czyli dłużej niż najdłuższy czas wykonania rozkazu wykonywanego niepotokowo. ⊲ Czas wykonania n rozkazów wynosi 200(n + 4) ps. Zależności zasobów, strukturalne . ⊲ Potok może zostać wstrzymany, gdy rozkazy będące na różnych etapach wykonania potrzebują dostępu do tego samego sprzętu. ⊲ Przykładowo rozkaz chce wykonać odczyt danych z pamięci, a w tym samym czasie trzeba pobrać kod kolejnego rozkazu. F D E M W F D E M W F D E M W F D E M W ⊲ Zależności strukturalne usuwa się przez dołożenie sprzętu. ⊲ Dlatego m.in. współczesne mikroprocesory mają oddzielne pamięci podręczne pierwszego poziomu dla kodu i danych. Zależności danych typu define-use . ⊲ Potok może zostać wstrzymany, gdy rozkaz potrzebuje wyniku poprzedniego rozkazu. r1 := r2 + r3 r4 := r1 - r5 F D E M W F D D D E M W ⊲ Takie zależności usuwa się przez data forwarding lub data bypassing. ⊲ Wynik obliczony na etapie E pierwszego rozkazu przesyła się bezpośrednio do etapu E drugiego rozkazu, zanim zostanie zapisany do rejestru wynikowego. r1 := r2 + r3 r4 := r1 - r5 F D E M W F D E M W Zależności danych typu load-use . ⊲ Potok może zostać wstrzymany, gdy rozkaz potrzebuje danych ładowanych z pamięci przez poprzedni rozkaz. r1 := (r2 + 4) r4 := r1 - r5 F D E M W F D D D E M W ⊲ Data forwarding nie zawsze jest w stanie usunąć taką zależność. r1 := (r2 + 4) r4 := r1 - r5 F D E M W F D D E M W ⊲ Dodatkowe opóźnienie wprowadzane przez rozkaz, gdy następny rozkaz potrzebuje jego wyniku, nazywa się latency. ⊲ Kompilator może usuwać latency, zmieniając kolejność rozkazów. Zależności sterowania . ⊲ Potok musi być opróżniony, gdy rozkaz warunkowy wykona skok. branch F D E M W F D F F D E M W ⊲ W rozważanym przykładzie dodatkowe opóźnienie (latency) wynosi dwa takty. Rozwiązywanie zależności sterowania ⊲ Równoległe przetwarzanie obu gałęzi programu ⊲ Predykcja skoków (przewidywanie rozgałęzień) ⋄ zawsze następuje skok ⋄ nigdy nie następuje skok ⋄ decyduje kod instrukcji (kompilator) ⋄ jak przy ostatnim wykonaniu ⋄ tablica historii skoków ⊲ Opóźnione rozgałęzianie . Budowa potoku . ⊲ Przykład potoku trzyetapowego f µf g g µgh h ⊲ Każdy etap potoku to układ sekwencyjny, na rysunku są to f , g, h. ⊲ Stan przetwarzania pomiędzy etapami jest zapamiętywany w rejestrach potokowych, na rysunku µf g i µgh . Metody zrównoleglania . Procesor Zrównoleglenie superskalarny w trakcie wykonywania wektorowy (SIMD – Single Instruction Multiple Data) algorytm z bardzo długim słowem instrukcji (VLIW – Very Long Instruction Word) kompilator Przetwarzanie wielopotokowe . pipeline 1 scheduler pipeline 2 re-order buffer pipeline 3 ⊲ Wydawanie/wykonywanie rozkazów w zmienionej kolejności (ang. out of order issue/execution) Zależności danych przy out of order issue ⊲ RAW – odczyt po zapisie load-use mov eax, [ecx+4] add ebx, eax . define-use add eax, ecx add ebx, eax ⊲ WAR – zapis po odczycie add eax, ebx mov ebx, 4 ⊲ WAW – zapis po zapisie add eax, ebx and ecx, edx ⊲ Zależności RAW rozwiązuje się jak poprzednio przez data forwarding lub data bypassing. ⊲ Zależności WAR i WAW są zależnościami fałszywymi i rozwiązuje się je przez przemianowanie rejestrów. Architektury RISC i CISC (1) . RISC – Reduced Instruction Set Computers CISC – Complex Instruction Set Computers Zawierają ograniczony, prosty zbiór instrukcji. Występują skomplikowane instrukcje wspierające języki wysokiego poziomu. Zawierają małą liczbą rejestrów i/lub rejestry specjalizowane. Zawierają dużą liczbę uniwersalnych rejestrów. Instrukcje arytmetyczno-logiczne wykonywane są na rejestrach. Instrukcje arytmetyczno-logiczne mogą pobierać argumenty z pamięci i umieszczać wynik w pamięci. Architektury RISC i CISC (2) . RISC – Reduced Instruction Set Computers CISC – Complex Instruction Set Computers Kody instrukcji są stałej długości, typowo 4 bajty, i mają stałe rozmieszczenie pól, co ułatwia dekodowanie. Kody instrukcji mają zmienną długość, typowo od jednego do kilkunastu bajtów. Występuje prefiksowanie instrukcji utrudniające dekodowanie. Posiadają dużą liczbę trybów adresowania. Dozwolone jest adresowanie niewyrównane. Posiadają małą liczbę trybów adresowania. Dozwolone jest tylko adresowanie wyrównane. Architektury RISC i CISC (3) CISC rozkazy Translator µops RISC . Geneza mikroprocesora . ⊲ Zbyt czasochłonne projektowanie od podstaw z bramek logicznych nowego modelu np. kalkulatora lub sterownika windy ⊲ Podczas projektowania łatwo popełnić trudny do usunięcia błąd ⊲ Układ uniwersalny – mikroprocesor ⊲ Nowa funkcjonalność przez wymianę programu Geneza mikroprogramowania . ⊲ Zbyt czasochłonne projektowanie od podstaw z bramek logicznych nowej jednostki sterującej (mikro)procesora ⊲ Podczas projektowania łatwo popełnić trudny do usunięcia błąd ⊲ Uniwersalna jednostka sterująca ⊲ Nowa funkcjonalność przez wymianę mikroprogramu Mikroprogramowanie Język wysokiego poziomu Asembler Kod maszynowy µoperacje µprogram sprzęt . Sprzętowe wsparcie dla systemów operacyjnych ⊲ Translacja adresów ⋄ segmentacja ⋄ stronicowanie, prosta i odwrotna tablica stron ⊲ Poziomy ochrony ⋄ wewnętrzny, nadzorcy, uprzywilejowany ⋄ zewnętrzny, aplikacji ⊲ Wywoływanie usług systemu operacyjnego ⋄ przerwania ⋄ specjalna instrukcja (syscall) . Segmentacja pamieć wirtualna procesu 1 pamięć liniowa . pamieć wirtualna procesu 2 Stronicowanie . pamięć fizyczna (ramki) liniowa pamięć wirtualna (strony) dysk Tablica stron . liniowy adres wirtualny nr strony przemieszczenie tablica stron atrybuty nr ramki specjalny rejestr nr ramki przemieszczenie nr ramki adres fizyczny Stronicowanie wielopoziomowe . liniowy adres wirtualny przemieszczenie nr tablicy nr strony katalog tablic tablica stron nr ramki nr ramki nr ramki specjalny rejestr przemieszczenie nr ramki adres fizyczny Odwrócona tablica stron . liniowy adres wirtualny nr strony przemieszczenie funkcja haszująca odwrócona tablica stron nr strony atrybuty przemieszczenie nr ramki adres fizyczny TLB . ⊲ Każde odwołanie do pamięci wymaga zajrzenia do tablicy stron, która sama jest przechowywana w pamięci. ⊲ Taki mechanizm jest nieefektywny. ⊲ Przy odwoływaniu się do pamięci obowiązuje zasada lokalności. ⊲ Rozwiązaniem jest bufor translacji adresów (ang. TLB – Translation Lookaside Buffer). DMA – Direct Memory Access . ⊲ Odciąża procesor przy przesyłaniu dużych bloków danych. ⊲ Dane przesyłane są bezpośrednio między sterownikiem urządzenia a pamięcią operacyjną. ⊲ Przesyłanie obsługuje sterownik DMA – specjalizowany układ podłączony do szyny systemowej. ⊲ Fazy transmisji: ⋄ rozkazów – procesor inicjuje kanał DMA i zapisuje parametry transmisji, ⋄ danych – wykonywane jest przesyłanie, ⋄ statusu – sterownik DMA zgłasza przerwanie, procesor odczytuje status i zwalnia kanał DMA. Mikroprocesory są wszędzie .