AKII-Pentium-PowerPC

Transkrypt

AKII-Pentium-PowerPC
Architektura Pentium
Potok P5 i P6
Struktura potoku Pentium / Pentium MMX
Port 4
Port 3
BTB0 BTB1
IFU1
IFU2
ID0
ID1
RAT
ROBR
RS
ROBW
Port 2
RRF
Port 1
Port 0
Struktura potoku w architekturze P6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Dr All Rename Que
Sch
Disp RF EX Flg BrC Dr
TCNxtIP
TC Fetch
Cykle potoku Pentium 4
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–1
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
*
N
+,
E
O
D
#
cache
R
Q
+
!
#
#
P
J
E
O
D
+
!
)
#
$
K
&
$
K
&
J
K
J
(
K
H
H
L
M
H
E
D
I
&
store
&
&
J
%
J
'
J
%
H
H
FG
FG
9
#
*
.
/
::
-
+,
0
2
0
0
=
;
<
1
#
)
>
?
=
#
#
2
5
@
3
4
(&
'
%&
9
6
-
8
A
B
C
/
4
7
#
$
"
!
cache
cache
)
!
Architektura Pentium
Organizacja Pentium III
PPC–2
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
M
cache
K
V
!
E
D
D
D
store
move
#
H
U
G
mul
add
U
T
T
F
F
F
F
T
T
G
C
IJ
C
IJ
C
BS
#
C
BS
#
C
B
#
C
B
#
C
B
#
P
P
IJ
V
IJ
Q
7
R
)
!
"
J
K
Q
9
(
'
8
&
'
.
(
%
(
&
%
,
*
$
9
+
+
,
0
;
'
%.
:
*
-
0
"#
!
<<
,
/
µ
trace cache
M
L
prognoza
pobrania
3
G
NO
?@
4
5
6
%
(
=
>
2
1
2
A
Architektura Pentium
Organizacja Pentium IV
cache
bypass network
PPC–3
Architektura Pentium
78
→
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
→
"
→
;
Q
"
,
=
#
<
+
N
-
)
'
+
→
K
<
#
"
.
/
4
K
!
!
Q
#
$%
&'
(
$
→
!
N
)
*
(
,+
.
K
/
0
5
6
:
1
2
3
9
pamięć
Kontekst procesora (IA-32)
Kontekst procesora – opis bie cego stanu procesu (segment TSS)
• zawarto rejestrów roboczych, rejestrów stanu i rejestrów wyj tków
• [wska nik kontekstu pami ci - wska nik LDTR do tablicy LDT]
• wska niki dost pnych systemowych struktur danych (stosy 4 poziomów)
• wska nik powi zania z procesem wywołuj cym (LINK)
• dane specyficzne (np. tablica zezwole we/wy)
PPC–4
Architektura Pentium
Kontekst pami ci
Kontekst pami ci – lokalny (LM) i globalny (GM)
Aktualizacja kontekstu pami ci tylko w trybie nadzoru
Kontekst pami ci (memory context) – w tablicy opisów (deskryptorów) pami ci
• adresy i rozmiary bloków pami ci (segmentów) procesu
i reguły dost pu do bloków pami ci procesu (deskryptory w LDT lub GDT)
• obecno bloków pami ci procesu w pami ci głównej
adres wirtualny (K)
PT
PCB (K)
PCB (N)
PCB (Q)
CPU(K)
dane specyficzne
Kontekst K
Kontekst N
Kontekst Q
[→ kontekst pami ci]
rejestry robocze
rejestry stanu
[→ struktury systemowe]
[→ powi zanie]
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
LM(K)
adres fizyczny bloku (1)
reguły dost pu
(rozmiar bloku)
…
…
…
adres fizyczny bloku (n)
reguły dost pu
(rozmiar bloku)
PPC–5
Architektura Pentium
Segment TSS
I/O permissions
0000
0000
0000
0000
0000
0000
0000
0000
LDT
GS
FS
DS
SS
CS
ES
EDI
ESI
EBP
ESP
EBX
EDX
ECX
EAX
EFLAGS
EIP
CR3
0000
SS (2)
ESP (2)
0000
SS (1)
ESP (1)
0000
SS (0)
ESP (0)
0000
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
LINK
PPC–6
Architektura Pentium
Ochrona danych
P
Rozmiar seg. (L19...16)
Adres bazowy segmentu (A31...24)
G
D/B
0
AVL
DPL DPL
S
t
t
t
t/a
Adres bazowy segmentu (A23...16)
Adres bazowy segmentu (A15...0)
Rozmiar segmentu (L15...0)
t t t t – segment systemowy (S = 0)
0h, 8h – nieokreślony
2h – tablica LDT
9h – segment TSS dostępny (IA-32)
0Bh – segment TSS zajęty (IA-32)
9h (1h) – segment TSS dostępny (80286)
0Bh (3h) – segment TSS zajęty (80286)
4h...7h – furtka 80286*
0Ch...0Fh – furtka IA-32 (80386+)*
t t t a – segment zwykły (S = 1)
0h/8h – segment danych, RWX = (r – –)
1h/9h – segment danych, RWX = (r w –)
2h/Ah – segment danych (stos), RWX = (r – –)
3h/Bh – segment danych (stos), RWX = (r w –)
4h/Ch – segment kodu, RWX = (– – x)
5h/Dh – segment kodu, RWX = (r – x)
6h/Eh – segment kodu zgodny, RWX = (– – x)
7h/Fh – segment kodu zgodny, RWX = (r – x)
Struktura deskryptora pami ci i deskryptora systemowego: P – bit obecno ci, DPL – poziom uprzywilejowania deskryptora, S – typ
deskryptora, G – ziarnisto adresu (1 – rozmiar segmentu L23...0 podany w stronach 4 kB, 0 – rozmiar L15...0 podany w bajtach), AVL –
dost pny, a – bit u ywalno ci,
D/B – domniemany rozmiar adresu i operandu (1 – 32b, 0 – 16b) (format furtki pokazuje rys. A.7)
selektor
Nr deskryptora (13b)
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
S
RPL
PPC–7
Architektura Pentium
Ochrona danych
Przemieszczenie (d31...16)
P
DPL DPL
S
t
1
t
a
0
0
0
Liczba słów przekazywanych
Selektor (wirtualny)
Przemieszczenie (d15...0)
t 1 t a – deskryptor furtki (S = 0)
5h – furtka zadania (task gate)
0Ch (4h)– furtka wywołania (cal gate)
0Eh (6h) – furtka przerwania (interrupt gate)
0Fh (7h) – furtka potrzasku (trap gate)
t 0 t a – segment danych kontekstowych
0h, 8h – nieokreślony
2h – tablica LDT
9h (1h) – segment TSS dostępny
0Bh (3h) – segment TSS zajęty
Struktura systemowego deskryptora furtki
(w nawiasach kod dla trybu wirtualnego 80286)
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–8
Architektura Pentium
Ochrona danych
pamięć główna
przełączenie zadania
wywołanie zewn.
LDT
GDT (LDT)
CALL FAR …
JMP FAR …
deskryptor furtki
adres
atrybuty
selektor CS
...x0bb
CALL FAR …
adres
selektor
...x1bb
wywołanie wewn.
CALL FAR …
JMP FAR …
selektorCS
segment
kodu
deskryptor pamięci
atrybuty
adres bazowy
JMP FAR …
TSS
deskryptor pamięci
atrybuty
adres bazowy
segment
pamięci
adres
Rys. A.1. U ycie furtki i deskryptora
LDT – deskryptory pami ci, furtki wywołania
GDT – furtki zadania, deskryptory TSS
IDT – furtki przerwania
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–9
Architektura Pentium
Ochrona danych – poziomy ochrony
Każdy rozkaz programu jest wykonywany na określonym poziomie ochrony, zwanym bieżącym poziomem uprawnień CPL
(Current Privilege Level). Poziom ten może być zmieniony tylko przez zmianę selektora CS, co jest możliwe wyłącznie przez
wykonanie skoku lub wywołania międzysegmentowego. Kod wymaganego poziomu uprawnień (Requested Privilege Level, RPL) jest
zapisany na dwóch bitach selektora CS.
Informacja o bieżącym poziomie uprzywilejowania jest porównywana z poziomem uprzywilejowania deskryptora zapisanym w
polu DPL (Descriptor Privilege Level). Jeśli wskazywany jest segment pamięci, wtedy pole DPL określa minimalny poziom
uprzywilejowania, uprawniający do dostępu do tego segmentu. Jeśli wskazywana jest furtka, to pole DPL wskazuje najwyższy
dozwolony poziom uprzywilejowania, uprawniający do użycia tej furtki (aby zadania bardziej uprzywilejowane nie mogły
korzystać z usług niższego poziomu). W takim przypadku zostają zignorowane bity RPL selektora docelowego, a procedura może
być wykonana, jeśli poziom ochrony zapisany w polu DPL deskryptora segmentu kodu tej procedury nie jest niższy niż bieżący
poziom uprzywilejowania.
Dostęp do pamięci jest zawsze realizowany:
przez deskryptor pamięci – do danych lub kodu własnego
przez furtkę (zadanie, podprogram, przerwanie, pułapka) – do kodu innego zadania lub jego udostępnionej części (procedury).
Podczas dostępu do pamięci należy porównać poziom DPL ze wskaźnikami CPL oraz RPL. Zasady zmiany poziomów ochrony
są następujące:
1. Można wykonać procedurę o wyższym poziomie uprzywilejowania – nie można wykonać procedury mniej uprzywilejowanej
(na niższym poziomie ochrony). Jeśli zadanie wykonywane na poziomie RPL korzysta z usługi na poziomie CPL to pole rpl
selektora segmentu danych powinno zostać osłabione – istotny jest słabszy poziom.
2. Można uzyskać dostęp do danych na niższym poziomie ochrony – nie można uzyskać dostępu do danych bardziej
uprzywilejowanych.
Instrukcje we i wy mogą być wykonane tylko przez program, którego CPL jest nie niższy od wskazanego w polu IOPL (może
być inne dla każdego zadania) lub tablicy zezwoleń we/wy (część opisu w segmencie TSS).
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–10
Architektura Pentium
Stronicowanie 1
W architekturze IA-32 stronicowanie jest wtórnym mechanizmem adresowania wirtualnego. Segmentacja może być wyłączona
tylko pozornie przez ustalenie dla każdego segmentu zerowego adresu bazowego i maksymalnego rozmiaru. Metoda ta jest
określana jako płaski model pamięci (flat memory).
Stronicowanie zostaje włączone po ustawieniu bitu 31 (PG) w rejestrze sterującym CR0. Rozmiar strony może być standardowy
(4kB) lub rozszerzony (4MB). Dodatkowo ustawienie bitu rozszerzenia adresu fizycznego w rejestrze CR4 (b5=PAE – Physical Address
Extension) umożliwia użycie stron o rozmiarze 2MB.
W podstawowym trybie 10 najwyższych bitów adresu liniowego identyfikuje opis w katalogu, wskazujący aktywną tablicę
stron, a 10 kolejnych aktualny opis strony w tablicy stron, a pozostałe 12 adres na stronie. W trybie rozszerzonym najwyższych 10
bitów adresu liniowego wskazuje opis strony w katalogu, który pełni teraz rolę tablicy stron, a pozostałe adres na stronie. Każdy
opis strony jest 32-bitowy i zawiera 20- lub 10-bitowy numer strony fizycznej.
Lokalizacja katalogu stron jest zapisana w rejestrze sterującym CR3. Deskryptor tablicy stron w katalogu oraz strony w tablicy
mają taką samą strukturę. Najniższe 8 bitów deskryptora zawiera informacje o sposobie dostępu do strony (rys A.9), wyższe bity
(12...31/35) są numerem (adresem) strony fizycznej. Dla strony można określić poziom uprzywilejowania (U/S=1 – poziom
użytkownika, odpowiadający najniższemu poziomowi uprzywilejowania w segmentacji, lub systemowy – wszystkie pozostałe).
63
…
…
31
…
…
…
…
36
35
4
3
numer strony
11
...
33
32
numer strony
(zarezerwowane)
12
34
7
6
5
2
1
0
0 ... 0 D A PCD PWT U/S R/W P
Rys. A.2. Struktura 32/64-bitowego deskryptora strony
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–11
Architektura Pentium
Stronicowanie
W obszarze strony można lokalnie wyłączyć (PCD=1) użycie wewnętrznej pamięci podręcznej oraz ustalić tryb współpracy z
zewnętrzną pamięcią podręczną (PWT). Bit D równy 1 wskazuje, że w obszarze strony dokonano zapisu, P jest bitem obecności
strony w pamięci głównej.
W opcji z rozszerzonym 36-bitowym adresem fizycznym 2 najwyższe bity adresu logicznego służą do wyboru jednego z 4
katalogów. Lokalizacja opisu tych katalogów jest wskazana w rejestrze sterującym CR3. W trybie podstawowym kolejnych 9 bitów
wskazuje deskryptor w katalogu stron lokalizujący aktywną tablicę stron, następnych 9 identyfikuje w tej tablicy 64-bitowy
deskryptor, który zawiera 24-bitowy numer strony standardowej. W trybie rozszerzonym 2 bity adresu wskazują katalog, zaś
9 kolejnych – 64-bitowy deskryptor strony w tablicy stron. Strona ma tu rozmiar 2MB.
wsk
katalog
tablica
strona
2
(strona 4kB)
9
9
deskryptor
12L (21L)
deskryptor
dana
deskryptor
32L
24H
CR3 (32b)
strona 4kB
24H
24H
strona 4kB
(15H)
wsk
katalog
strona
2
(strona 2MB)
deskryptor
21L
9
deskryptor
dana
deskryptor
32L
CR3 (32b)
24H
strona 4kB
15H
strona 4kB
Rys. A.3. Stronicowanie w trybie rozszerzonych adresów fizycznych
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–12
Architektura PowerPC
Jednostka
zmiennoprzecinkowa
FPU
dane
Pamięć
podręczna
kodu
Jednostka
stałoprzecinkowa
IU
Pamięć
podręczna
danych
adres
Jednostka
rozgałęzień
BPU
adres
Architektura podstawowa
Bufor
DMA
Układ sprzęgu z magistralą
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–a
Architektura PowerPC
Architektura – cechy
PowerPC zdefiniowano jako otwartą architekturę 64-bitową – wszelkie adresy są 64-bitowe, argumenty obliczeń
stałoprzecinkowych są także 64-bitowe. Procesor może jednak działać także w trybie 32-bitowym, a procesor 64-bitowy jest w stanie
wykonać bezpośrednio kod wytworzony dla architektury 32-bitowej (przełączanie trybów jest dynamiczne). Otwartość architektury
zapewnia przenośność programów i przejrzyste, spójne rozszerzenia 32-bitowej listy rozkazów dla wersji 64-bitowych.
Jednym z założeń projektu PowerPC była optymalizacja architektury ze względu na łatwość tworzenia kodu wynikowego przez
kompilatory. Cechami ułatwiającymi proces kompilacji i jego optymalizację są w szczególności:
powiązania typu zmiennej z postacią kodu wynikowego
stały rozmiaru kodu rozkazu,
duża liczba rejestrów ułatwiająca tworzenie lokalnych powiązań zmiennych
bezpieczne przechowywanie warunków dla rozkazów warunkowych.
Zgodnie z postulatami koncepcji RISC, wszystkie rozkazy procesora o architekturze PowerPC, oprócz komunikacji z pamięcią
(load i store), używają jako argumentów rejestrów procesora. Swobodny dostęp do rejestrów oraz trójoperandowe działania
(wskazanie argumentów i wyniku w osobnych rejestrach) pozwalają wyeliminować kopiowanie rejestrów, a ich duża liczba (32 w
jednostce stałoprzecinkowej oraz 32 zmiennoprzecinkowe) umożliwia ograniczenie komunikacji z pamięcią.
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–b
Architektura PowerPC
Spójno
pami ci
W architekturze POWER procesor nie testuje spójności danych w buforze pamięci podręcznej w części związanej z dostępem
we/wy lub zawierającej kod (procesory POWER komunikują się z pamięcią główną tylko przez pamięć podręczną z jednym
wyjątkiem, którym jest osobna przestrzeń, sygnalizowana przez ustawienie bitu T=1, interpretowana jako programowane we/wy).
Testowanie musi być więc tam realizowane programowo. W PowerPC usunięto polecenia realizujące blokadę i śledzenie dostępu
do danych, ponieważ mogłyby one utrudniać zarządzanie pamięcią.
Model pamięci PowerPC jest też bardziej elastyczny niż w architekturze POWER. Atrybuty są kojarzone z każdą stroną
przestrzeni wirtualnej, co umożliwia programową kontrolę rodzaju dostępu. Pozwala to na realizację spekulacyjnego trybu dostępu
do każdej strony, chyba że ma ona przypisane cechy, które uniemożliwiają taka obsługę, na przykład przypisany atrybut we/wy.
Pozostałe atrybuty wskazują, czy strona może być buforowana w cache i jaki jest tryb aktualizacji stron buforowanych. Pozwala to
na jednolite odwzorowanie przestrzeni adresowej we/wy oraz przestrzeni pamięci (bez logicznej separacji tych przestrzeni).
Ponieważ specyfikacja architektury nie przewiduje sprzętowego wspomagania protokołu MESI, ani żadnego innego, więc
spójność pamięci podręcznej musi być kontrolowana programowo. Służą do tego nowe polecenia zarządzania buforami cache (sync,
icbi, dcbt/dcbtst, dcbf, dcba, dcbi, dcbz). Instrukcja sync gwarantuje, że zanim zostanie podjęty następny rozkaz, wszystkie
zainicjowane przez program dostępy do pamięci zostaną wykonane z zachowaniem wymagań spójności, uwzględniających
działania innych procesorów w lokacjach docelowych. Instrukcji sync można też użyć w programie, aby przed zdjęciem blokady
obszaru współdzielonych struktur danych upewnić się, że aktualizacja danych jest widziana przez inne procesory. Wykonanie
instrukcji sync gwarantuje, że zakończyły działanie instrukcje zarządzające buforami cache (icbi, dcbz, dcbst, dcbf, dcba, dcbi) oraz
instrukcja unieważniania bufora TLB.
W celu wspomagania kontroli dostępu do współdzielonych bloków pamięci i ułatwienia implementacji mechanizmu semafora,
w architekturze PowerPC zaprojektowano parę instrukcji komunikacji z pamięcią: „czytaj i modyfikuj” pamięć (lwarx/ldarx – load
word/ double word and reserve indexed), kopiuje zmienną kluczującą z pamięci do rejestru, zapisując adres tej zmiennej w specjalnym
rejestrze rezerwacji. Wykonując warunkowy rozkaz zapisu stwcx/stdcx (store word/ double word conditional indexed procesor
sprawdza, czy rezerwacja jest aktualna (zgodny adres). Jeśli tak, to zapis jest wykonany, a na pozycji EQ w polu CR0 jest wpisane 1.
Jeśli rezerwację anulowano zostaje wpisane EQ = 0. Ponieważ instrukcje lwarx i stwcx nie naruszają bitowej kompatybilności
aplikacji POWER (można je nadal wykonywać bez użycia tych instrukcji), specyfikacja wymaga ich wpasowania na granicy słowa
(word-aligned). Wynik niewpasowanego dostępu jest nieokreślony, więc kontrola wpasowania musi być programowa.
Przyjęty słabo spójny model pamięci ułatwia niekolejne wykonanie rozkazów. Jeżeli dostęp do kolejnych lokacji musi być
uporządkowany, na przykład dostęp do urządzeń we/wy, należy go wymusić instrukcją eieio (enforce in-order execution of I/O).
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–c
Architektura PowerPC
Lista rozkazów
Wykonanie rozkazów arytmetycznych jest kontrolowane programowo. Stosownie do ustalonego typu argumentów zostaje
dobrany wariant rozkazu stałoprzecinkowego a zapis cech wyniku w rejestrze warunków może być zablokowany. Syndromy
wyniku działania arytmetycznego mogą być zapisane w rejestrach wyjątków, jeśli nie jest to zablokowane. Działanie
stałoprzecinkowe może spowodować aktualizację w rejestrze XER bitu przeniesienia CA lub bitu nadmiaru OV. Bit nadmiaru
skumulowanego SO po ustawieniu może być skasowany tylko w wyniku wykonania rozkazu sterującego.
Wyjątki dla działań zmiennoprzecinkowych są notowane przez ustawienie bitów w rejestrze FPSCR, który jednocześnie jest
rejestrem stanu jednostki FPU. Notowane są takie wyjątki jak: OX (nadmiar), UX (niedomiar), ZX (dzielenie przez zero), XX (błąd
zaokrąglenia) oraz VX (błąd działania). Wyjątki te mogą być blokowane bitami masek (OE, UE, ZE, XE, VE). Bit VX jest sumą
logiczną bitów wskazujących jedno z błędnych działań: VXSNAN (SNaN), VXISI (∞ – ∞),VXIDI (∞ / ∞),VXZDZ (0 / 0), VXIMZ (∞ ⋅ 0),
VXVC (porównanie z NaN), VXCVI (błąd konwersji) oraz niedostępne w PowerPC 601 VXSOFT (inne błędne działanie) i VXSQRT
(błąd liczenia pierwiastka kwadratowego).
Porównanie
Podstawowym sposobem wytwarzania warunku dla rozkazów warunkowych (rozgałęzień, pułapek) jest porównanie. Wariant
rozkazu porównania jest dobierany odpowiednio do typu porównywanych argumentów. Porównanie arytmetyczne cmp odnosi się
do liczb całkowitych, porównanie logiczne cmpl dotyczy liczb naturalnych (unsigned). Porównanie liczb zmiennoprzecinkowych
może być standardowe fcmp lub rozszerzone fcmpu z wymuszaną sygnalizacją niedozwolonego działania. Wynik porównania jest
zapisywany w polu rejestru kodów warunkowych CR w postaci bitów wskazujących wystąpienie relacji „>”, „=” lub „<”. Czwarty
bit pola w porównaniu stałoprzecinkowym oznacza wystąpienie nadmiaru sumarycznego, a w porównaniu zmiennoprzecinkowym
wskazuje niewykonalność operacji (jeden z argumentów jest nie-liczbą). Warunek może być też wytworzony automatycznie w polu
CR0 jako efekt porównania wyniku stałoprzecinkowego działania arytmetycznego do zera. Działanie zmiennoprzecinkowe, inne niż
porównanie, wytwarza w polu CR1 kody wyjątków.
A.1.1. Działania stałoprzecinkowe
Argumenty działań stałoprzecinkowych i zmienne składowe adresu efektywnego są umieszczane w rejestrach ogólnego
przeznaczenia GPR0–GPR31. Jedna składowa adresu lub jeden z argumentów działania może być stałą natychmiastową.
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–d
Architektura PowerPC
Ponieważ wszystkie stałe są kodowane w formie skróconej, więc potrzebne są też rozkazy rozszerzania kodu na pełny rozmiar
słowa. Są dwa sposoby rozszerzania: znakowe (odpowiada interpretacji kodu stałej jako dwójkowego uzupełnieniowego) oraz
zerami (odpowiada naturalnej interpretacji kodu).
W architekturze pomostowej PowerPC 601, oprócz rozkazów realizujących cztery podstawowe działania arytmetyczne, lista
zawiera też usunięte ze specyfikacji rozkazy obliczania wartości bezwzględnej i odejmowania z nasycaniem (difference or zero).
Dodawanie i odejmowanie
W architekturze PowerPC jest wiele sposobów wykonania podstawowych działań arytmetycznych. Wariant wykonania jest
zapisany w polu rozszerzenia kodu (rys. 3.5) i znajduje wyraz w mnemonice rozkazu. Podstawowy mnemonik rozkazu dodaj (add)
lub odejmij (subf) jest uzupełniony symbolami wskazującymi sposób wykonania:
…• – (aktualizuj CR0 – najniższy bit kodu b31(=Rc)=1, Rc – record),
…o – (aktualizuj bitów OV, SO w rejestrze XER),
…c – (aktualizuj bitu CA rejestrze XER),
…co – (aktualizuj bitów CA, OV, SO w rejestrze XER),
…i – (użyj stałej natychmiastowej immediate),
…is – (dodaj stałą i sumę wpisz do górnej części rejestru (×216) immediate and shift),
…e – (uwzględnij jako argument bit CA z rejestru XER i ustaw CA),
…me – (użyj jako argumenty „−1” oraz CA z rejestru XER i ustaw CA),
…ze – (użyj jako argumenty „0” oraz CA z rejestru XER i ustaw CA).
Wariant rozkazu jest dobierany stosownie do typu danych. Jeśli argumenty są liczbami dodatnimi, to odpowiednie są rozkazy
aktualizujące bit CA (…c), jeśli są liczbami ze znakiem, to odpowiednie są rozkazy aktualizujące bity OV i SO (…o). Jeśli
realizowana jest arytmetyka rozszerzonej precyzji, właściwe są rozkazy używające jako dodatkowy argument zapamietany bit
przeniesienia CA (…e).
Rozkazy odejmowania od zera subfze umożliwiają zmianę znaku (uzupełnianie) argumentów całkowitych dowolnego
rozmiaru, a rozkazy dodawania do zera addze ułatwiają korektę wyniku częściowego przeniesieniem z poprzedniej pozycji.
Rozkazy używające argumentu „–1” są użyteczne w realizacji arytmetyki resztowej.
Mno enie i dzielenie
Dostępne są dwa sposoby tworzenia iloczynu: mullw – zapis do rejestru dolnej części iloczynu i mulhw – zapis do rejestru
górnej części iloczynu. Jakkolwiek wynik dolnego mnożenia argumentów całkowitych (signed) i naturalnych (unsigned) jest taki sam,
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–e
Architektura PowerPC
to sygnalizowany jest nadmiar, jeśli ignorowane górne bity pełnego iloczynu nie są bitami rozszerzenia arytmetycznego. Typ
mnożenia górnego musi być dostosowany do typu argumentów (odpowiada mnożeniu ułamków). Standardowe dzielenie jest
dzieleniem krótkim (divs), gdzie rozmiary dzielnej, dzielnika i ilorazu są jednakowe (wszystkie argumenty są w rejestrach
stałoprzecinkowych GPR#).
W architekturze pomostowej PPC 601 (tak jak w POWER) w mnożeniu całkowitym pełnym (liczby znakowane) górna część
iloczynu jest wpisana do specjalnego rejestru MQ. Jeśli rejestr MQ nie zawiera tylko bitów rozszerzenia znakowego, następuje
sygnalizacja przekroczenia zakresu (ustawienie bitu OV w rejestrze XER). Dzielenie może być też wykonane z użyciem MQ –
zawiera on wtedy górne bity dzielnej.
A.1.2. Działania zmiennoprzecinkowe
Podstawowym formatem zmiennoprzecinkowym w architekturze PowerPC jest format podwójnej precyzji (double – IEEE 754).
Implementowane są proste działania arytmetyczne, w wersji podstawowej (dodawanie, odejmowanie, mnożenie, mnożenie
akumulacyjne z dodawaniem/odejmowaniem, porównanie, dzielenie) lub rozszerzonej (obliczanie odwrotności liczby, obliczanie
pierwiastka kwadratowego, oszacowanie odwrotności pierwiastka) z użyciem sprzętowej wersji metody Newtona-Raphsona. Inne
działania są emulowane programowo. Ograniczenie zakresu argumentów do pojedynczej precyzji nie daje przyśpieszenia
wykonania, bo argumenty są rozszerzane do podwójnej precyzji (rys. 3.12).
Sposób zaokrąglania wyniku zmiennoprzecinkowego jest zgodny ze standardem IEEE 754 i może być wybrany przez wpisanie
kodu w polu RN rejestru FPSCR. Tryb domniemany to zaokrąglanie do najbliższej (kod 00). Kod 01 wymusza obcinanie, zaś kody
1X są używane w realizacji arytmetyki przedziałowej.
Jednostki zmiennoprzecinkowe mogą też wykonywać działania w innym trybie niż ustalony w standardzie IEEE 754, jeśli
zostanie ustawiony bit NI w rejestrze FPSCR.
A.1.3. Rozgałęzienia i pułapki
Podstawą decyzji o rozgałęzieniu jest warunek zapisany we wskazanym polu rejestru CR. Ponieważ użycie warunku może być
w ten sposób odsunięte w czasie od jego wytworzenia, więc dzięki temu znacznie spada ryzyko przestoju potoku wskutek błędnej
prognozy rozgałęzień. Prognozy wymagają tylko rozgałęzienia odnoszące się do pól aktualizowanych bezpośrednio przed ich
użyciem. Rozgałęzienie warunkowe może też być odniesione do rejestru licznikowego CTR.
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–f
Architektura PowerPC
Dostępne są też rozkazy rozgałęzień bezwarunkowych, zwykłych oraz ze śladem (odpowiadające wywołaniu procedury).
Śladem jest adres powrotu umieszczany w rejestrze powiązań (LR, link register). Jego zawartość jest argumentem specjalnego
rozkazu rozgałęzienia (odpowiadającego powrotowi z procedury).
Specyficzną formą rozgałęzień są pułapki programowe. Jeśli podany warunek nie jest spełniony, to rozkaz taki jest ignorowany
(„nic nie wykonuj”), w przeciwnym razie następuje rozgałęzienie ze śladem. Procedura obsługi powinna dokładnie opisywać
rozpoznane przyczyny wystąpienia sytuacji nadzwyczajnej, która w przetestowanych programach jest traktowana jako błąd
wykonania.
A.1.4. Działania logiczne i transformacje kodu
Repertuar działań logicznych, oprócz zwykle implementowanych funkcji AND, OR i XOR, obejmuje też funkcje NAND, NOR i
EQV oraz iloczyn i sumę logiczną z drugim argumentem zanegowanym ANDC oraz ORC.
Bardzo rozbudowany jest zbiór rozkazów przesunięć. Przesunięcia cykliczne mogą być powiązane z maskowaniem bitów –
maska jest uporządkowanym (0…01…1) lub bitonicznym (0…01…10…0) ciągiem bitów, a jej ustawienie jest argumentem rozkazu.
Przesunięcia zwykłe, arytmetyczne (liczby ze znakiem) i logiczne (liczby bez znaku), odpowiadają skalowaniu przez potęgę dwójki.
W architekturze pomostowej PowerPC 601 są implementowane także, usunięte ze standardowej specyfikacji PowerPC, tzw.
przesunięcia długie (long), których argument jest złożeniem rejestru MQ i dowolnego rejestru stałoprzecinkowego GPR#.
A.1.5. Kopiowanie do i z pamięci
Repertuar rozkazów kopiowania do pamięci (store) oraz kopiowania z pamięci do rejestru (load) jest bardzo rozbudowany i
obejmuje nie tylko transfery danych pełnego rozmiaru (32 lub 64 bity), lecz także kopiowanie argumentów skróconych.
Podczas kopiowania argumentu niepełnego rozmiaru (bajtu, dwubajtu/ półsłowa) do pamięci zawartość wyższych bitów rejestru
jest pomijana. Podczas kopiowania do rejestru, po skopiowaniu każdy bit rejestru musi mieć ustaloną wartość. Jest więc konieczne
rozszerzanie argumentu: znakowe (odpowiadające liczbom całkowitym) lub zerami (odpowiadające liczbom dodatnie). Dostępne są
także rozkazy kopiowania łańcucha słów z pamięci do bloku rejestrów (zestaw rejestrów o kolejnych numerach) lub z bloku
rejestrów do pamięci oraz rozkazy kopiowania słów ze zmianą konwencji kolejności bajtów w słowie (BE na LE).
Podczas kopiowania zmiennoprzecinkowego do rejestru argumenty pojedynczej precyzji są rozszerzane do podwójnej precyzji.
Podczas kopiowania z rejestru, jeśli ma być wykonana konwersja na format pojedynczej precyzji, może wystąpić nadmiar lub
niedomiar niesygnalizowany.
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–g
Architektura PowerPC
AltiVec
Lista rozkazów nowszych generacji architektury PowerPC została rozbudowana o działania wektorowe, analogiczne do
rozszerzeń MMX/SSE w architekturze Pentium. Działania te wykonuje jednostka AltiVec. Aby nie blokować potoku, jednostka ta
nie generuje wyjątków, a obsługa problemów zmiennoprzecinkowych jest domniemana.
Struktura kodu rozkazów jednostki AltiVec jest taka sama jak w architekturze podstawowej, a argumenty rozkazów, oprócz
komunikacji z pamięcią, są umieszczone w rejestrach 128-bitowych v0...v31. Łańcuch 128 bitów umieszczonych w rejestrze, zależnie
od potrzeb, jest interpretowany jako:
• argument 128-bitowy nieokre lonego typu (działania logiczne, kopiowanie)
• 4 argumenty zmiennoprzecinkowe pojedynczej precyzji (32-bitowe)
• zestaw niezale nych argumentów stałoprzecinkowych: 2 dwusłowa 64bitowe, 4 słowa 32-bitowe, 8 półsłów 16-bitowych lub 16 bajtów.
Repertuar podstawowych arytmetycznych działań stałoprzecinkowych jest nieco bogatszy niż w MMX/SSE (Pentium) i
obejmuje:
•
•
•
•
dodawanie i odejmowanie
mno enie górne i dolne
mno enie rekordów (pól) o numerach nieparzystych albo parzystych
mno enie akumulacyjne górne i dolne
Wyniki powyższych działań, z małymi wyjątkami, mogą być tworzone
• z odcinaniem wy szych bitów (modulo 2k, k=8,16,32)
• z nasycaniem bez znaku (jednokierunkowym) (obci cie do (0,28–1))
• z nasycaniem ze znakiem (dwukierunkowym) (obci cie do (–2k–1,2k–1–1)).
Oprócz wymienionych wyżej, dostępne są też działania specyficzne, takie jak:
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–h
Architektura PowerPC
•
•
•
•
wyznaczanie przeniesie z sum lub ró nic
wyznaczanie warto ci minimalnych i maksymalnych
obliczanie redniej z zaokr gleniem w gór .
akumulowana suma iloczynów.
Dostępne są też rozkazy porównania, testujące relację większości dla argumentów bez znaku i ze znakiem oraz relację równości.
Lista AltiVec obejmuje też taki sam zestaw działań logicznych jak architektura podstawowa oraz rozkazy rotacji i przesunięć.
Dostępne są też instrukcje specyficzne wewnątrzelementowe (interelement), takie jak splatanie i permutacja rekordów oraz
spakowanie i rozpakowanie argumentu.
Działania zmiennoprzecinkowe obejmują dodawanie, odejmowanie i mnożenie i szacowanie pierwszych przybliżeń dla
iteracyjnych algorytmów dzielenia, obliczania pierwiastka kwadratowego i obliczania wartości funkcji elementarnych. Oszacowania
odwrotności dzielnika i odwrotności pierwiastka są wystarczające, aby w jednym kroku iteracji metodą Newtona-Raphsona uzyskać
przybliżenie faktycznej wartości z dokładnością do najniższego bitu reprezentacji zmiennoprzecinkowej.
Wspomaganie współbie no ci
obejmuje rozkazy synchronizacji potoku, dostępu do współdzielonego obszaru pamięci i wywołanie systemowe
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–i
Architektura PowerPC
Adresowanie pami ci
Adresowanie danych w pamięci może nastąpić tylko podczas wykonania rozkazów load lub store. Adres logiczny określa jeden
lub dwa wskaźniki. Jeden z nich powinien być zawartością rejestru ogólnego przeznaczenia (GPR0 … GPR31), drugi może być albo
stałą (zapisaną w formie skróconej) albo zawartością rejestru GPR# (z ewentualną automatyczną modyfikacją). Jeśli jako pierwszy
argument jest specyfikowany rejestr GPR0, jego zawartość jest ignorowana (traktowana jak 0). Jeśli oba argumenty są w rejestrach,
to obliczony adres wynikowy (suma zawartości rejestrów) jest zapisany w pierwszym rejestrze (adresowanie z automatyczną
aktualizacją).
Adresowanie kodu jest względne, z użyciem stałej przemieszczenia, określającej odległość lokalizacji kodu docelowego od
bieżącej wartości licznika rozkazów. Można też wymusić interpretację przemieszczenia jako adresu bezwzględnego ze znakiem
(przemieszczenie ujemne jest traktowane jako adres w górnym obszarze przestrzeni adresowej). Rozmiar i zakres stałej zależy od
typu rozgałęzienia.
Tryby adresowania
We wszystkich rozkazach, oprócz rozkazów komunikacji z pamięcią (ld… – load oraz st… – store), występuje adresowanie
rejestrowe bezpośrednie, gdzie numery rejestrów argumentów są specyfikowane w kodzie rozkazu, lub adresowanie zwarte, w
którym argument jest domniemany (rozkazy sterujące).
W rozkazach load i store adres logiczny danej jest wytwarzany przy użyciu najwyżej dwóch argumentów. W najprostszym trybie
adres logiczny argumentu jest pobierany z rejestru ogólnego przeznaczenia GPR#.
W adresowaniu dwuelementowym adres może być obliczany przez zsumowanie zawartości wskazanego rejestru adresującego i
przemieszczenia, zapisanego w kodzie rozkazu jako liczba całkowita (rozszerzana znakowo podczas obliczania adresu) lub przez
dodanie zawartości dwóch rejestrów adresujących GPR# (adresowanie bazowo-indeksowe). Jeśli jako pierwszy wskazany jest rejestr
numer zero, jego zawartość jest traktowana jako wartość 0. Adresowanie dwuelementowe może być zrealizowane z aktualizacją i
wtedy obliczony wynikowy adres logiczny jest zapisywany w rejestrze bazowym (pierwszy wyspecyfikowany na liście
wskaźników). W jednostce AltiVec do adresowania należy zawsze wskazać dwa rejestry ogólnego przeznaczenia.
Podstawowym trybem adresowania kodu jest adresowanie względem bieżącej zawartości licznika rozkazów. W niewielkim
zakresie adresowanie kodu może być też bezwzględne – zakres jest wyznaczony rozmiarem stałej. W 32-bitowej wersji PowerPC w
rozgałęzieniach bezwarunkowych stała jest liczbą całkowitą 26-bitową (odpowiada to adresom z zakresu 0…225–1 albo 232–225…232–
1), w rozgałęzieniach warunkowych stała jest 16-bitowa (adresy 0…215–1 albo 232–215…232–1). W wersji 64-bitowej zakres adresów
jest taki sam, z uwagi na ustalony 32-bitowy rozmiar kodu rozkazu.
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–j
Architektura PowerPC
Adresowanie wirtualne
W trybie 64-bitowym najwyższe 32+4 bity adresu stanowią efektywny identyfikator segmentu (ESID). Pięć najniższych bitów
identyfikatora a w razie chybienia negacja tych bitów, wskazuje 8-elementową grupę segmentów STEG# (rys. B.2) w tablicy opisów
segmentów (ST). Element każdej grupy (STE#) jest deskryptorem, którego pierwsze dwusłowo (8B) zawiera 36-bitowy wzorzec
identyfikatora segmentu (ESID), bit 56 (V) jest wskaźnikiem ważności odwzorowania, bit 57 (T) wskazuje typ transferu (pamięć lub
we/wy), bity 58 (ks – system) i 59 (ku – użytkownik) kodują uprawnienia dostępu. Drugie podwójne słowo zawiera 52-bitowy
wirtualny identyfikator segmentu (VSID), który złożony z 28 niższymi bitami adresu logicznego (PI|BO) tworzy 80-bitowy adres
wirtualny. Jeśli we wskazanej grupie brak potrzebnego odwzorowania, poszukiwane jest odwzorowanie pod adresem
zanegowanym. Najniższe 12 bitów (BO) jest adresem wewnętrznym na stronie (logicznej, wirtualnej i rzeczywistej)(rys. B.2).
Tablica segmentów ST
STEG00
STE0 STE1 STE2
STEG01
STE0 STE1 STE2
STEG02
STE0 STE1
STEG30
STE0 STE1 STE2
STE7
STEG31
STE0 STE1 STE2
STE7
0
35 36
ESID
STE7
00...00
55 56
63
V T ks ku 000
VSID
00...00
0
5
51 52
0
35 36
ESID
63
51 52
PI
63
BO
chybienie
16
Bufor TLB
segmentów
0
trafienie
51 52
VSID
12
67 68
PI
79
BO
wirtualny adres strony
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–k
Architektura PowerPC
Adresowanie wirtualne 32b
W trybie 32-bitowym najwyższe 4 bity adresu logicznego wskazują jeden spośród 16 rejestrów segmentów (analog tablicy
segmentów w trybie 64-bitowym). Rejestr segmentu zawiera 32-bitowy deskryptor, którego najniższe 24 bity stanowią wirtualny
numer segmentu VSID. Najwyższe bity to T, ks, ku, których znaczenie jest takie jak w trybie 64-bitowym. Wirtualny 24-bitowy
numer segmentu po złożeniu z 28 niższymi bitami adresu logicznego (PI|BO) tworzy 52-bitowy adres wirtualny.
Najniższe 12 bitów adresu logicznego (i wirtualnego) jest adresem wewnętrznym na stronie (wirtualnej i rzeczywistej).
Pozostałe, po przekształceniu funkcją haszującą, stanowią wskaźnik deskryptora strony w tablicy stron. Sposób przekształcenia jest
podobny w obu trybach. Funkcją skrótu (haszującą) jest bitowa suma wykluczająca (XOR) rozszerzonego lewostronnie zerami
numeru strony wirtualnej (PI) i niższych (19 lub 40) bitów wirtualnego numeru segmentu (VSID). Tak wyznaczone n niższych bitów
kodu (10 ≤ n ≤ 19 w trybie 32-bitowym, 11 ≤ n ≤ 39 w trybie 64-bitowym) jest wskaźnikiem do tablicy stron zawierającej 2n+3
deskryptorów stron PTE# (rys. B.3).
Tablica stron PT
VSID
51 52 56 57
61 63
API
00..00 H V
RPN
000 RC WMIG 00 PP
0
PTEG..00
PTE0
PTE1 PTE2
PTEG..01
PTE0
PTE1 PTE2
PTEG..02
PTE0
PTE1
PTEG.2n–2
PTE0
PTE1 PTE2
PTE7
PTEG.2n–1
PTE0
PTE1 PTE2
PTE7
PTE7
0
51
55
1
chybienie
trafienie
Bufor TLB
stron
RPN
n
24
V
VSID
RPN
n
API
0
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
0...0
VSIDL
26 31
H API
000 RC WMIG 00 PP
19
#ID
VSIDH
63
23
31
PI
PI
BO
PPC–l
Architektura PowerPC
Stronicowanie cd
W trybie 32-bitowym wynikiem funkcji skrótu jest kod 19-bitowy (VSID5:23⊕000|PI) zaś n = 10…19. W trybie 64-bitowym kod
wynikowy jest 39-bitowy (VSID13:51⊕0..00|PI) zaś n = 11…39. Z uwagi na rozmiar deskryptora (64 lub 128-bitowy) adres w tablicy
stron jest tworzony przez prawostronne rozszerzenie p zerami liczby n a tablica stron musi być umieszczona począwszy od adresu
2n+p (w trybie 32-bitowym p=6, w trybie 64-bitowym p=7). Zaleca się, aby liczba grup wejść w tablicy PT była nie mniejsza od
połowy liczby stron rzeczywistych (4 razy więcej stron wirtualnych niż rzeczywistych).
Do identyfikacji deskryptora PTE# w grupie PTEG# (adresem grupy w tablicy jest n2p) wystarczy kilka najwyższych bitów (API)
wirtualnego numeru strony (6 w trybie 32-bitowym lub 5 w 64-bitowym), bo kody identyfikatorów w jednym segmencie mogą się
różnić najwyżej na 16–n pozycjach (16–n ≤ rozmiar API).
Przeszukiwane są jednocześnie dwie grupy deskryptorów, odpowiadające prostej i inwersyjnej wartości funkcji haszującej. Bit H
w deskryptorze wskazuje, czy opis jest związany z funkcją prostą (H=0 i wtedy następuje porównanie z bitami API), czy też
inwersyjną (H=1 i wtedy następuje porównanie z zanegowanymi bitami API). Dzięki temu opis strony może być umieszczony w
jednej z dwóch lokacji w tablicy stron.
A.1.6. Translacja blokowa
Adresowanie w trybie translacji blokowej umożliwia spójne odwzorowanie dużych bloków pamięci bez stronicowania. Blok
musi zawierać 2B bajtów (17 ≤ B ≤ 28) a jego rozmiar określa monotoniczna maska bitowa (0…01…1) w deskryptorze bloku.
Fizyczny adres bajtu w bloku jest złożeniem 17+p niższych bitów adresu logicznego z bitami numeru bloku rzeczywistego
oprócz p niższych (które są zerami, bo blok musi być wpasowany od adresu m⋅217+p), gdzie p jest liczbą jedynek w masce.
Opis translacji blokowej jest zapisany w deskryptorach umieszczonych w zestawie rejestrów specjalnego przeznaczenia.
Deskryptor translacji zawiera numer bloku logicznego (BEPI), numer bloku rzeczywistego (BRPN), 11-bitową maskę rozmiaru
(BLS), bity poziomu uprzywilejowania vu i vs, oraz analogiczne jak w stronicowaniu: bity ochrony PP i sterowania buforem cache
(WIMG). Opis obejmuje 4 bloki (rys. B.4).
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–m
Architektura PowerPC
adres wirtualny
VSID
PI
BO
BEPI
#ID
+32
0
15
BEPI
0..0
BRPN
3
vs vu
0..0 0…00 WIMG 0 PP
BEPI
0..0
BRPN
11
BLS
BLS
vs vu
TLB
chybienie
0..0 0…00 WIMG 0 PP
maska
0..00
PI
BRPN
0..0
BO
OR
BRPN
adres rzeczywisty
PI
BO
RPN
BO
Rys. B.1. Translacja adresu wirtualnego w rzeczywisty
Deskryptor dla trybu 64-bitowego różni się od deskryptora trybu 32-bitowego tylko rozmiarem pól BEPI i BRPN (dłuższe o 32 bity).
Translacja blokowa jest priorytetowa wobec stronicowania. Przekształcony przez funkcję skrótu adres logiczny (bez 17
najniższych bitów) jest porównany z 4 opisami translacji blokowej. W razie trafienia translacji blokowej (rys. B.4) zostaje zaniechane
stronicowanie.
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–n
Architektura PowerPC
A.1.7. Ochrona danych
Ochrona danych jest opisana na poziomie segmentu i bloku albo strony. Obejmuje prawa zapisu i odczytu. Poziom ochrony jest
określany na podstawie bitu generalnego uprzywilejowania PR (0 – system, 1 – użytkownik) w rejestrze stanu procesora MSR,
kluczy ochrony ks i ku zapisanych w rejestrze lub deskryptorze segmentu oraz dwóch bitów ochrony bloku lub strony PP.
Jeśli bity PP mają wartość 11, to możliwy jest tylko odczyt strony albo bloku. Jeśli PP=00, to w razie gdy kuPR+ks(1–PR)=1 dostęp
jest zakazany, w przeciwnym razie możliwy jest tylko odczyt. Gdy PP=10, to dozwolony jest odczyt i zapis, zaś przy PP=01 zapis
jest dozwolony tylko wtedy, gdy kuPR+ks(1–PR)=0.
Podczas translacji blokowej sprawdzana jest dodatkowo ważność opisu bloku dla pracy (vs i vu) w trybie użytkownika lub
nadzoru. Jeśli zachodzi zgodność, czyli wtedy, gdy vuPR+vs(1–PR)=1, opis translacji blokowej jest ważny i następuje adresowanie
blokowe. W przeciwnym razie jest realizowane stronicowanie.
Dodatkowym elementem ochrony jest niespecyfikowany w podstawowej definicji architektury PowerPC bit N w rejestrze lub
deskryptorze segmentu. Jego domniemaną wartością jest 0; wartość 1 uniemożliwia wykonanie kodu z danego segmentu.
A.1.8. Przestrzeń we/wy
Zalecanym sposobem komunikacji z urządzeniami we/wy jest komunikacja przez pamięć (odwzorowanie przestrzeni we/wy
jako części przestrzeni pamięci). Takie odwzorowanie musi być jednak odpowiednio opisane w deskryptorze bloku lub strony za
pomocą bitów WMIG. Należy zablokować kopiowanie do bufora pamięci podręcznej (I=1) i nakazać kontrolę transferu (G=1). Stan
bitów WM nie jest krytyczny przy blokadzie bufora cache, lecz zaleca się ustalić zapis skrośny (W=1) oraz pomijanie testu spójności
pamięci (M=0).
W celu utrzymania kompatybilności z architekturą POWER możliwe jest jednak bezpośrednie odwzorowanie przestrzeni
we/wy. Jest ono ustalone przez ustawienie bitu T=1 w rejestrze (lub deskryptorze) segmentu. W takim przypadku 9 bitów rejestru
segmentu BUID (w trybie 32-bitowym) lub 7 bitów deskryptora segmentu (zgodne z BUID2:8) jest identyfikatorem urządzenia, zaś
inne 20 bitów rejestru lub deskryptora segmentu zawiera informacje dla sterownika urządzenia we/wy.
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–o
Architektura PowerPC
Przerwania
W architekturze PowerPC każda sytuacja wymagająca specjalnej obsługi, w tym także żądania obsługi urządzeń peryferyjnych
nazywa się wyjątkiem (exception). Wyjątki sygnalizowane są przez przerwania (interrupt). W konsekwencji pojęcia te są używane
zamiennie – w specyfikacji architektury jest zwykle mowa o przerwaniach a w podręcznikach programistów o wyjątkach.
Ze względu na moment zgłoszenia wyróżnia się przerwania synchroniczne, związane z jakąś fazą wykonania instrukcji oraz
asynchroniczne, których zgłoszenie jest skutkiem zdarzenia zewnętrznego. Ze względu na sposób obsługi wyróżnia się dwa rodzaje
przerwań: precyzyjne (żądanie obsługi zdarzeń z otoczenia procesora lub błędów przetwarzania) i nieprecyzyjne, które są żądaniem
obsługi zdarzeń grożących utratą spójności systemu.
Spośród przerwań asynchronicznych dwa są nieprecyzyjne: błąd kontroli maszyny (machine check error) i żądanie wznowienia
(reset). Pozostałe przerwania asynchroniczne są precyzyjne. Są to żądania obsługi urządzeń peryferyjnych lub sygnalizacja upływu
czasu (decrementer). Przerwania wewnętrzne są synchroniczne. Niektóre z nich (błędy jednostki zmiennoprzecinkowej) można
blokować programowo. Blokada polega na zerowaniu bitów w rejestrze stanu procesora MSR.
Obsługa wszystkich przerwań jest realizowana w trybie nadzoru (supervisor mode). Wszystkie przerwania są wektoryzowane.
Przekazany do procesora numer przerwania jest zamieniany na adres w tablicy przerwań. Istnieje możliwość obsługi 212 przerwań,
na obsługę każdego przeznacza się nominalnie 256 bajtów pamięci (64 rozkazy), co wymaga zarezerwowania na ten cel 1MB
pamięci. Faktyczne procedury obsługi mogą być oczywiście dłuższe niż 64 rozkazy. Lokalizacja tablicy przerwań zależy od stanu
bitu IP w rejestrze MSR – jeśli IP=0, to adresem bazowym jest 0x0, jeśli zaś IP=1, to adresem bazowym jest 0xFFF00000. Zwykle
podczas inicjalizacji systemu IP=1, później następuje przełączenie.
Pierwsze 32 numery przerwań są zarezerwowane w specyfikacji architektury. W tej grupie mieszczą się oba przerwania
nieprecyzyjne (żądanie wznowienia i błąd kontroli procesora), wewnętrzne przerwania precyzyjne takie jak: błąd dostępu do
danych, błąd dostępu do kodu, błąd wpasowania kodu, wywołanie systemowe i przerwania zewnętrzne: sygnalizacja upływu czasu
i błąd sprzęgu we/wy.
Po rozpoznaniu przerwania następuje zapamiętanie stanu procesora i zależnie od przyczyny zapamiętanie adresu następnej
instrukcji (przerwanie zewnętrzne) lub instrukcji, która spowodowała przerwanie (przerwanie wewnętrzne).
Podczas obsługi przerwań adresy logiczne nie podlegają translacji i są traktowane jak adresy fizyczne. Pozwala to uniezależnić
obsługę przerwań od struktury zadań w systemie.
© Janusz Biernat, AKII-Pentium-PowerPC (red), 16 czerwca 2010
PPC–p