debreceni egyetem informatikai rendszerek és hálózatok tanszék
TRANSCRIPT
HARDVERKÖZELI PROGRAMOZÁS 1
Dr. Varga Imre
Debreceni Egyetem
Informatikai Rendszerek és Hálózatok Tanszék
2017. február 14.
Követelmények
� Gyakorlat (aláírás)
�Óralátogatás (maximum hiányzás: 3)
�2 gyakorlati ZH
• A két ZH átlaga legalább 60%
• Mindegyik legalább 50%
�1 javítási lehetőség (teljes féléves anyag)
� Elmélet (kollokvium)
�C programozási „szintfelmérő” (plusz pontért)
� Írásbeli vizsga (gyakorlati aláírás esetén)
� Jegy: 75% elméleti vizsga + 25% gyakorlati eredmény
Hardverközeli programozás 1 2
Mérnökinformatikus képzés
Döntéstámogató rendszerek
Mesterséges intelligencia alapjai
Bevezetés a LabView programozásba
Magas szintű programozási nyelvek 1-2
Hardverközeli programozás 1-2
Digitális technika
Elektronika 1-2
Fizika 1-2
Hardverközeli programozás 1 3
absz
takc
ió, l
ogi
kai s
zin
t
Tematika
� Számábrázolás, adattípus implementáció
� Digitális elektronika alapjai
� CPU felépítése és működése
� Assembly programozás�Magas szint leképezése alacsonyra
� Modern processzorok
� A programozás operációsrendszerhez kapcsolódó aspektusai
� Konkrét processzor architektúrák�Utasításkészletük, programozásuk
Hardverközeli programozás 1 4
A tárgy célja
� Összeköttetés teremtése
�Az ‚absztrakt’ és az ‚alapozó’ ismeretek között
�A ‚program’ és az ‚elektronika’ között
� Hardver ismeretek átadása
� Magas szintű programozás mélyebb megértése
�Hatékonyabb programozás
� Az assembly programozás bemutatása
� Szemléletformálás
�Átfogó kép kialakítása a számítógép rendszerekről
Hardverközeli programozás 1 5
Számábrázolás, adattípusok
Fixpontos számábrázolás
Lebegőpontos számábrázolás
A C nyelv típusainak reprezentációja
Mi az outputja a programnak?
Hardverközeli programozás 1 7
Adatszervezés
Adategységek
� Bit: két állapot (0, 1)
� Nibble (fél byte): 4 bit
� Byte: 8 bit
� Félszó: 16 bit
� Szó: (többnyire) 32 bit
� Dupla szó: 64 bit
Hardverközeli programozás 1 8
21625665.5364.294.967.29618.446.744.073.709.551.616
Adattípus
Megadás
� Reprezentáció
� Tartomány
� Műveletek
A C nyelv aritmetikai (egyszerű) típusai
� [unsigned|signed] char
� [unsigned|signed] [short|long|long long*] int
� float
� [long*] double
Hardverközeli programozás 1 9
*ISO C99
Fixpontos számábrázolás
� Egész értékek reprezentálása
� Előjel nélküli eset
�ábrázolandó szám kettes számrendszerben
�adott számú biten
� Példa (1 byte esetén)4110 � 1010012 �
� N biten ábrázolható
� legkisebb szám: 0
� Legnagyobb szám: 2N-1
Hardverközeli programozás 1 10
0 0 1 0 1 0 0 1
Fixpontos számábrázolás
� Előjeles eset
�Nem negatív érték esetén: előjel nélküli logika
�Negatív érték esetén: kettes komplemens
• Abszolút érték bitjeinek invertálása (egyes komplemens)
• A kapott érték növelése 1-gyel
� Példa (1 byte esetén)-4110 � -1010012 �
� N biten ábrázolható
� legkisebb szám: -(2N-1)
� Legnagyobb szám: 2N-1-1Hardverközeli programozás 1 11
1 0 1 0 1 1 11
meghatározza az előjelet
Aritmetikai túlcsordulás
Két féle hibalehetőség
� Előjel nélkül: több bit lenne szükséges (carry)01011010 90
+11110001 +241101001011 75 ≠331 >255
� Előjeles: nem várt előjelváltás (overflow)01011010 90
+01110001 +11311001011 -53 ≠203
Hardverközeli programozás 1 12
Kiterjesztés
Néha szükség van egy adatot a korábbinál több biten ábrázolni úgy, hogy az értéke ne változzon
� Nulla kiterjesztés
�Rövid előjel nélküli értékből hosszú előjelnélküli8 bit: 01101001 � 16 bit: 00000000011010018 bit: 11010010 � 16 bit: 0000000011010010
� Előjel tartó kiterjesztés
�Rövid előjeles értékből hosszú előjeles8 bit: 01101001 � 16 bit: 00000000011010018 bit: 11010010 � 16 bit: 1111111111010010
Hardverközeli programozás 1 13
BCD ábrázolás
Binárisan kódolt decimális
� Minden számjegy 4 biten ábrázolva
� Vannak kihasználatlan bitkombinációk
Pakolatlan BCD
� 1 számjegy - 1 byte: 0000 vagy (0011*) bevezető1395 � 00000001 00000011 00001001 00000101
Pakolt BCD
� 2 számjegy – 1 byte: nibble alapú1395 � 00010011 10010101
Hardverközeli programozás 1 14
*ASCII miatt
Egész típus
Ábrázolás
� Fixpontos számábrázolás�Előjeles vagy előjel nélküli
� BCD
Bájtsorrend
� Little-endian: LSB elől (gazdagép bájtsorrend)
� Big-endian: MSB elől (hálózati bájtsorrend)
Megadás különböző módokon
� Pl. C nyelven: 30=30u=30l=036=0x1E=0b11110*
Hardverközeli programozás 1 15
*ISO C99
Karakter típus
� Értékei karakter kódok
� Fixpontos számábrázolás
� C: ASCII (1 byte, előjeles/előjel nélküli, egészként használható)
� Java: Unicode (2byte, előjel nélküli)
� ASCII ⊂ ISO-8859-1 (Latin 1) ⊂ Unicode
� ASCII kódtábla
� 0x00-0x1F: vezérlő karakter
� 0x30-0x39: számjegy
� 0x41-0x5A: angol nagy betű
� 0x61-0x7A: angol kis betű
Hardverközeli programozás 1 16
Felsorolásos típus
� Alacsony szinten int-ként reprezentált
� C nyelven a két kód assembly szinten azonos
Hardverközeli programozás 1 17
A C egész típusai
Hardverközeli programozás 1 18
típus méret tartomány
[signed] char1 byte
-128 127
unsigned char 0 255
[signed] short2 byte
-32.768 32.767
unsigned short 0 65.535
[signed] int4 byte
-2.147.483.648 2.147.483.647
unsigned int 0 4.294.967.295
[signed] long8 byte(4 byte)
-9.223.372.036.854.775.808 9.223.372.036.854.775.807
unsigned long 0 18.446.744.073.709.551.615
[signed] long long8 byte
-9.223.372.036.854.775.808 9.223.372.036.854.775.807
unsigned long long 0 18.446.744.073.709.551.615
Lebegő pontos számábrázolás
� Valós számok ábrázolása
� Alapja a normalizálás: 123,45 = 1,2345 · 102
� Minden (2 számrendszerbeli) szám felírható így:
(-1)S · M · AK
�ahol a mantissza (M) „1.H” alakú, azaz 12 ≤ M < 102
� karakterisztika (K) pozitív és negatív is lehet
� Nem tároljuk: alap (A=2), rejtett bit, K előjele
�E=K+B adott számú biten nem negatív (B: nulla pont)
� Tárolandó: S, H, E
Hardverközeli programozás 1 19
Lebegő pontos szabvány
IEEE 754/1985 szabvány (ISO/IEC/IEEE 60559:2011)
� Előjel
�Pozitív: 0; Negatív: 1
� Formátumok
Hardverközeli programozás 1 20
méretS
hosszE
hosszH
hosszB
Egyszerespontosság
32 bit 1 bit 8 bit 23 bit 127
Duplapontosság
64 bit 1 bit 11 bit 52 bit 1023
Kiterjesztettpontosság
80 bit 1 bit 15 bit 63(+1) bit 16383
Lebegő pontos számábrázolás
Példa: -13.8125 egyszeres pontossággal
-13.812510 = -1101.11012 = -11 · 1.1011101 · 23
Előjel: S = 1
Karakterisztika: K = 310 = 112
Mantissza: M = 1.1011101
Hasznos bitek: H = 10111010000000000000000…
Eltolt karakterisztika: E = 310+12710 = 100000102
Hardverközeli programozás 1 21
1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S E H
Kerekítési hiba
� Ok: hasznos bitek tárolás véges számú biten
� Túl sok hasznos bit esetén kerekítés szükséges
�Ha az utolsó tárolható hasznos bit után ’0’ áll,akkor a további biteket levágjuk
�Különben felfelé kerekítünk
� Kerekítési hiba: nem pontos ábrázolás
� Példa: 0.3 ábrázolása egyszeres pontossággalhasznos bitek: 00110011001100110011001100110…tárolt bitek: 00110011001100110011010 0.3 � 0.300000011920929
Hardverközeli programozás 1 22
Speciális lebegőpontos értékek
� +0 és -0előjel bit ’0’ (+) vagy ’1’ (-), minden más bit ’0’Pl.: 0.0/-1.0, -1.0*0.0
� ±végtelen (Inf)karakterisztika csupa ’1’, mantissza csupa ’0’Pl.: 1.0/0.0, inf+1.0
� „nem szám” (NaN)karakterisztika csupa ’1’, mantissza nem csupa ’0’Pl.: 0.0/0.0, inf-inf, NaN+1.0
� denormalizált szám (subnormal)karakterisztika csupa ’0’, mantissza nem csupa ’0’
Hardverközeli programozás 1 23
A C nyelv valós típusai
Valós típusú konstansok formátuma
� 0.751
� +.75100
Valós típusok paraméterei
Hardverközeli programozás 1 24
méret minimum maximum pontosság
float 4 byte 1.18 · 10-38 3.40 · 10+38 ≈7 számjegy
double 8 byte 2.23 · 10-308 1.80 · 10+308 ≈15 számjegy
longdouble*
10 byte 3.36 · 10-4932 1.19 · 10+4932 ≈19 számjegy
� .751f
� 75.1e-2
� 0.751L
� 0.0751E+1
Mutató típus
� Indirekt hivatkozásra szolgálnak
� Tartományának elemei tárcímek
� A mutató típusú változónak is van saját címe
� A C nyelvben
�Előjel nélküli egész reprezentáció (32 vagy 64 bit)
�NULL: csupa nulla bit
�Értéke adatcím és kódcím (!) is lehet
�Aritmetikai műveletek is végezhetőek velük
Hardverközeli programozás 1 25
Rekord típus
� Különböző típusú területek együtt
� Mindegyik mező a saját reprezentációjával
� Nem biztos, hogy folytonos memóriaterületen
Hardverközeli programozás 1 26
nem használt byte
A.a A.b A.c A.d
sizeof(A)==16
B.a B.bB.cB.d
sizeof(B)==24
Tömb típus
� Azonos típusú elemek folytonosan tárolva
� Minden elem az adott reprezentációval
� A tömb neve
�C nyelven: az első elemre mutató nevesített konstans
�Egyes nyelveken: az összes elemre hivatkozás
� Egydimenziós tömb i. elemének a címe (Ai)�� � �� � � � 1
ahol E egy adatelem mérete és A1 a tömb kezdőcíme
Hardverközeli programozás 1 27
Több dimenziós tömbök
� Sorfolytonos tárolás
� Az i. sor j. elemének címe (Ai,j) egy NxM-esmátrixban
��,� � ��,� � � � 1 � j � 1 E
ahol E egy adatelem mérete és A1,1 a mátrix első elemének címe
Hardverközeli programozás 1 28
�,� �
��,� ��,�
��,� ��,�
��,� ��,�
→ � � ��,���,���,���,���,���,�
Sztring típus
� Karakterek sorozata
� Elemei a megfelelő belső reprezentációban(pl. C: 1byte, ASCII; Java: 2 byte, Unicode)
� Hossza
�Fix hosszúságú
�Változó hosszúságú
• A sztring elején hossz tárolás (pl. Pascal)
• A sztring végén speciális lezárójel (pl. C)
• Kombinált (pl. Delphi)
Hardverközeli programozás 1 29
A C nyelv tömbje
� Tömb index 0-tól (db-1)-ig
� Csak egydimenziós tömb van, viszont van tömbök tömbje
� Sztring: karaktertömb
� Lezáró karakter ’\0’ (ASCII kód: 0)
� A tömb neve az első elemre mutató nevesített konstans (mutatóorientáltság erős)
Hardverközeli programozás 1 30
egyenértékű utasítások
Digitális elektronikai alapok
Félvezető
Dióda, tranzisztor
Logikai kapu
Flip-flop
Multiplexer, címdekódoló
Összeadó áramkör
Félvezetők
� „Rossz vezető, rossz szigetelő”
� Ok: szilárdtestek sávszerkezete
�4 vegyérték elektron (Si, Ge)
�Kvantumfizika
�Bohr-féle atommodell
Hardverközeli programozás 1 32
vezetési sáv
vegyérték sáv
tiltott sáv
elek
tro
n e
ner
gia
vezető
elek
tro
n e
ner
gia
félvezető
elek
tro
n e
ner
gia
szigetelő
szilárdtestben
elek
tro
n e
ner
gia
atomban
Szennyezett félvezető
� n-szennyező (elektron)
�5 vegyérték elektron (As, Sb)
� p-szennyező (’lyuk’)
�3 vegyérték elektron (Ga, In)
� Új energiaszint a tiltott sávban
Hardverközeli programozás 1 33
elek
tro
n e
ner
gia
Si Si Si
Si Ga Si
Si Si Si
Si Si Si
Si As Si
Si Si Si
n-típus p-típus
+-
+-
+-
-+
-+
-+
p-n átmenet
� Félvezető egykristály eltérően szennyezett részei között található
� Szabad töltéshordozók átáramlanak a másik rétegbe, rekombinálódhatnak.
Hardverközeli programozás 1 34
+-
-+-
-+
+-
-+
+ -+
+ -
+ -+-
-+-
-+
+-
-+
+ -+
+-
-+-
-+
+-
-+
+ -+
+ -
+ -+-
-+-
-+
+-
-+
+ -+
+-töltéssűrűség
elektrosztatikus potenciál potenciálgát
n p
kiürített réteg
Hardverközeli programozás 1 35
Dióda
Záró irányú előfeszítés Nyitó irányú előfeszítés+ -
+-
-+-
-+
+-
-+
+ -+
+ -
+ -+-
-+-
-+
+-
-+
+ -+
+-
-+-
-+
+-
-+
+ -+
+ -
+ -+-
-+-
-+
+-
-+
+ -+
- -- ++ +
+-
+-
-+-
-+
+-
-+
+ -+
+ -
+ -+-
-+-
-+
+-
-+
+ -+
+-
-+-
-+
+-
-+
+ -+
+ -
+ -+-
-+-
-+
+-
-+
+ -+
-
-
-
-
-
-
+
+
+
+
+
+
�Dióda: egyenirányításra képes
�Jele:
�Speciális: LED
Tranzisztor
� 2 darab p-n átmenet („összefordított diódák”)
� Kapcsoló, erősítő
Hardverközeli programozás 1 36
Bipoláris tranzisztor
p n pn
Unipoláris tranzisztorBE C
p n p
G
D
S
GD S
p n p
B
E
C
n-csatornás JFET
A logikai NAND kapu
� 2 bemenetű logikai kapu („nem és”)
� Jele:
� Felépítése, működése:
Hardverközeli programozás 1 37
A B Q
0 0 1
0 1 1
1 0 1
1 1 0
A
B
Vcc
Q
GNDTTL NAND kapu
További logikai kapuk
� Felépíthetőek NAND kapukból
Hardverközeli programozás 1 38
A B Q
0 0 0
0 1 1
1 0 1
1 1 0
A B Q
0 0 0
0 1 1
1 0 1
1 1 1
A B Q
0 0 0
0 1 0
1 0 0
1 1 1
A Q
0 1
1 0
NOT AND OR XOR
Flip-flopok
� Szekvenciális digitális elektronikai áramkör
� 1 bit információ tárolására képes
� Alkalmazás: regiszter, számláló, frekvenciaosztó
Hardverközeli programozás 1 39
D
CLK
Q
_Q
D flip-flop
CLK
adat bemenet
adat kimenet
4 bites regiszter
Multiplexer
� Kombinációs hálózat
� N jelből 1-et kiválaszt a vezérlőjelek alapján
� K darab vezérlőjel2K darab bemenő jelet tud azonosítani
Hardverközeli programozás 1 40
D
C
B
A
Z
S0 S14:1 multiplexer
S0 S1 Z
0 0 A
0 1 B
1 0 C
1 1 D
Címdekódoló
� Kombinációs hálózat
� A címbemenetre adott jel alapján kiválasztja a kimenő jelek egyikét
� N bites címbemenetre adottérték a 2N darab kimeneti vonal közül 1-et aktivál
Hardverközeli programozás 1 41
A0 A1
D0
D1
D2
D3
2 bites címdekódoló
A0 A1 D0 D1 D2 D3
0 0 0 0 0 1
0 1 0 0 1 0
1 0 0 1 0 0
1 1 1 0 0 0
Összeadó áramkör
� Félösszeadó: 2 bit összeadására képes
� Teljes összeadó: 3 bit összeadásáraképes (2 félösszeadó)
Hardverközeli programozás 1 42
A B
SC A B
S
Cout Cin
A B C S
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
A B Ci Co S
0 0 0 0 0
0 1 0 0 1
1 0 0 0 1
1 1 0 1 0
0 0 1 0 1
0 1 1 1 0
1 0 1 1 0
1 1 1 1 1
Ripple-carry összeadó
� Több bites adatok összeadására képes
� Láncba fűzött teljes összeadók
Hardverközeli programozás 1 43
++++
A3 B3 A2 B2 A1 B1 A0 B0
S3 S2 S3 S2
C 0
++++
A3 A2 A1 A0 B3 B2 B1 B0
S3 S2 S1 S0
c
„primitív 4 bites ALU kezdemény”
teljes összeadó
A processzorok felépítése
Számítógép architektúra
CPU
Regiszterek
Fetch-execute ciklus
RISC / CISC processzorok
Számítógép rétegmodell
� 0. szint: digitális logikai áramkörök (logikai kapu, flip-flop)
� 1. szint: mikro-architektúra (konkrét ALU, buszok)
� 2. szint: utasításkészlet architektúra (ISA)
� 3. szint: operációs rendszer (ütemezés, tárkezelés)
� 4. szint: programozási nyelvek (alkalmazások)
Hardverközeli programozás 1 45
Neumann architektúra
Princeton architektúra (Neumann János)
Neumann elvek (1945):
� Elektronikus működés
� Kettes számrendszer használata
� Tárolt program elve
�Adat és program tárolás ugyanott/ugyanúgy
� Soros programvégrehajtás
� Univerzális felhasználhatóság
Hardverközeli programozás 1 46
Harvard architektúra
� Külön adat és program memória
�Eltérő felépítés, címtartomány, típus is lehet
� Párhuzamos adat és utasítás elérés miatt nagyobb teljesítmény
� Főként mikrokontrollerekben használt
� Első alkalmazás: Mark I (1944)
Módosított Harvard architektúra
� Külön adat/utasítás gyorsítótár, közös memória
� Modern CPU-k esetén elterjedtHardverközeli programozás 1 47
A számítógép alapvető felépítése
� Processzor
� Memória
� Input-Output interfész
� Buszrendszer
� Perifériák
Hardverközeli programozás 1 48
Processzor Memória I/O interfész
Buszrendszer
Perifériák
Buszrendszer
� Busz (sín): vezetékek egy csoportja, amelyeken digitális jelet lehet továbbítani
� Buszrendszer logikai részei
�Címbusz: a címek bitsorozatának átvitelét biztosítja
�Adatbusz: adatok átviteléért felelős
�Vezérlő busz: részegységek működésének összehangolását segítő vezérlő jelek továbbítása
Hardverközeli programozás 1 49
Processzor Memória I/O interfész
címbusz
adatbusz
vezérlő busz
Processzor
� Központi feldolgozó egység (CPU)
� A számítógép „agya”
�Vezérlés, utasítás végrehajtás
� Részei:
�Vezérlő egység (CU)
�Aritmetikai és logikai egység (ALU)
�Címző egység (AU) és Busz illesztő egység (BIU)
�Regiszterek
�Belső gyorsítótár
Hardverközeli programozás 1 50
Végrehajtó egység (EU)
Regiszterek
� Kis méretű (flip-flop-szerű) tároló áramkör
�Mérete általában az adatbusz szélességével egyenlő
�Általában 8-512 bit
� Gyors hozzáférésű (elérési idő < 1ns)
� Darabszámát a processzor határozza meg (10-100)
� Gyakran regisztertömböket alkot
� Néha átnevezhetőek
� 3 kategória:
�Rendszer- , általános célú- és speciális célú regiszter
Hardverközeli programozás 1 51
Regiszterek
Programszámláló regiszter (PC vagy IP)
� A következő utasítás memóriacímét tartalmazza
� Az utasítás végrehajtása során (általában) átáll a következő utasítás címére, azaz az aktuális utasítás méretével növekszik
� Szekvenciális végrehajtás eszköze
� Értékét egyes utasítások is állíthatják (vezérlés átadás)
� Vezérlőegységhez (CU) kapcsolódik
Hardverközeli programozás 1 52
Regiszterek
Utasítás regiszter (IR)
� A memóriából beolvasott utasítás műveleti kódját tartalmazza
� A vezérlőegységhez kapcsolódik
� A CU ez alapján dönti el
�milyen műveletet kell végeztetni
�milyen adaton kell dolgozni (és az hol van)
� A programozó által nem hozzáférhető
Hardverközeli programozás 1 53
Regiszterek
Akkumulátor (ACC, W, AX)
� Általános munka regiszter az ALU-ban
� Aritmetikai és logikai műveletek operandusait tartalmazza legtöbbször
� Általában az ilyen műveletek eredménye is itt tárolódik
� Újabb processzorokban több hasonló regiszter ugyanerre a célra (kevesebb memória művelet)
� Általában egész típusú adatokat tartalmaznak
Hardverközeli programozás 1 54
Regiszterek
Állapot regiszter (SR, FLAGS)
� Processzor állapottal, művelet eredményével kapcsolatos jelző/vezérlő biteket tartalmaz
� Feltételes vezérlésátadásnál (is) nagyon fontos
Hardverközeli programozás 1 55
�Átvitel (CF)
�Nibble átvitel (AF)
�Túlcsordulás (OF)
�Előjel (SF)
�Megszakítási maszk (IF)
�Nulla (ZF)
�Paritás (PF)
�…
Regiszterek
Verem mutató regiszter (SP)
� A hardveres rendszerverem használatához
� A verem tetejének memóriacímét tartalmazza
�Általában a verem előrefelé nő
�Általában SP a legutóbb betett elemet címzi (Intel)
� Speciális célú regiszter
� A „push” és „pop” művelet automatikusan változtatja az SP értékét
Hardverközeli programozás 1 56
Regiszterek
Címzéssel kapcsolatos speciális regiszterek
� Operandusok címének meghatározásánál egy alap címhez képesti relatív cím (eltolás) megadásához használható
� Az AU-hoz kapcsolódnak
� Tömbök, sztringek és lokális változók esetén hasznos
� Például: BP, X, SI, DI, CS, DS, SS, ES
Hardverközeli programozás 1 57
Regiszterek
Memória cím regiszter (MAR)
� Összeköti a külső és belső címbuszt
� Azt a címet tartalmazza, amelyhez legközelebb hozzá kell férni (írásra vagy olvasásra)
� A címző egység hajtja meg
� Címbusz szélességű
Hardverközeli programozás 1 58
Regiszterek
Memória adat regiszter (MDR)
� Összeköti a külső és belső adatbuszt
� Azt az adatot tartalmazza
�amelyet legközelebb ki kell írni a memóriába vagy
�amely legutóbb be lett olvasva a memóriából
� Kétirányú regiszter
� Adatbusz szélességű
Hardverközeli programozás 1 59
Aritmetikai és logikai egység
� Számítási műveleteket végez
� Tartalmaz: fixpontos összeadót, komplemensképzőt, léptető regisztereket, bitenkénti logikai művelet végző, stb. áramköröket
Hardverközeli programozás 1 60
A operandus B operandus
eredmény
utasítás állapotALU
Vezérlő egység
� Az IR-ben lévő érték alapján irányítja, szabályozza a többi egység (pl. ALU) működését
� Fontos regiszterei: IR, PC, SR
� A vezérlés történhet
�Huzalozott logikával (közvetlenül)Minden utasításhoz létrehozott bonyolult digitális elektronika segítségével
�Mikroprogramozott (közvetett) módonMinden műveleti kód elindít egy apró (ROM-bantárolt) mikroprogramot
Hardverközeli programozás 1 61
Címző egység
Addressing Unit (AU), Address Generation Unit (AGU)
� Az utasítások sokféle címzési mód segítségével határozhatják meg hol található az operandus
� Az AU az operandus címét állítja elő és helyezi el az MAR-ban
� Az utasításban található címet képezi le fizikai memóriacímre
� Tárolóvédelmi hibák felismerése
� Kapcsolat: BIU
Hardverközeli programozás 1 62
Órajel
� Periodikus négyszög hullám
� Órajel generátor (oszcillátor) állítja elő
� Szinkronizálja az egységek működését
� Arányos a CPU által disszipált hővel
� Periódusidő nagyobb, mint a jelterjedési idő
� 1 MHz – 3 GHz
� Gyakran változtatható (turbo, powersave)
� Egyéb sebesség jellemzők: MIPS, FLOPS
Hardverközeli programozás 1 63
CISC processzor
Komplex utasításkészletű számítógép
� Sok, összetett utasítás
� Sokféle címzési mód
� Változó hosszúságú utasítások
� Utasítás több gépi ciklust igényel
� Mikroprogramotott
� Kevés regiszter
� Utasítások elérhetik közvetlenül a RAM-ot
Hardverközeli programozás 1 64
RISC processzor
Csökkentett utasításkészletű számítógép
� Kevés, egyszerű utasítás
� Kevés címzési mód
� Állandó hosszúságú utasítások
� Utasítás egy gépi ciklust igényel
� Huzalozott vagy mikroprogramotott
� Sok regiszter
� Csak a Load/Store utasítás éri el a RAM-ot
Hardverközeli programozás 1 65
Fetch-Execute ciklus
1. Utasítás beolvasásaA PC-ben található érték megmondja, hol található a memóriában a következő utasítás. Ezt be kell olvasni az IR-be.
2. DekódolásA beolvasott műveleti kódot értelmezni kell. Milyen művelet? Milyen adatokon? Eredmény hová kerül?Utasításkészlet architektúra (ISA) definiáljaLehet huzalozott vagy mikroprogramozott
Hardverközeli programozás 1 66
Fetch-Execute ciklus
3. Operandus beolvasásaAz operandus címének meghatározása és onnan beolvasása a megfelelő regiszterbe
4. Művelet végrehajtásapéldául az ALU által, az eredmény egy átmenti regiszterbe kerül
5. Eredmény tárolásregiszterbe vagy memóriacímre
6. Következő utasítás címének meghatározása
Hardverközeli programozás 1 67
Olvasási ciklus
� DIY Calculator esetén
Hardverközeli programozás 1 68
C. Maxfield, A. Brown: The Official DIY Calculator Data Book
Írási ciklus
� DIY Calculator esetén
Hardverközeli programozás 1 69
C. Maxfield, A. Brown: The Official DIY Calculator Data Book
Assembly programozás
Assembly nyelv
Utasítás készlet
Címzési módok
Fordítás-szerkesztés-betöltés
Gépi kód
Assembly programozás
� Alacsony absztrakciós szint
� Programozói szabadság
� Feladatra optimalizálható kód
� Nagyobb program teljesítmény
� Hardverismeret szükség
� Nehezebben átlátható kód
� PC, mikrokontroller
Hardverközeli programozás 1 71
Magasszintűprogramnyelvek
Assembly programozás
Gépi kód
Utasítás szerkezet
� 4 címes utasítás
� 3 címes utasítás
� 2 címes utasítás
� 1 címes utasítás
Hardverközeli programozás 1 72
Műveleti kód1. Operandus
cím2. Operandus
címEredmény cím
Következő utasítás cím
Műveleti kód1. Operandus
cím2. Operandus
címEredmény cím
Műveleti kód1. Operandus
cím2. Operandus + eredmény cím
Műveleti kód1. Operandus
cím
Program és utasítás felépítés
Hardverközeli programozás 1 73
utasítás_1
utasítás_2
utasítás_3
utasítás_4
utasítás_5
…
Forrás fájl
Címke Művelet Operandus(ok) Megjegyzés
.L1: mov ax, 0 # zero into ax
Címke Azonosító, általában kettősponttal zárul
Művelet Az elvégzendő művelet mnemonic-ja
Operandus(ok) Adat(ok) vagy adat(ok)ra hivatkozás(ok)
Megjegyzés Sor végéig a fordító figyelmen kívül hagyja
Utasításkészlet architektúra
ISA (Instruction Set Architecture)
A számítógép programozáshoz kötődő részletei
� Bitszélesség (buszok és regiszterek)
� Regiszter készlet
� Gépi utasítások
� Címzési módok
� Memória architektúra
� Megszakítás kezelés
Hardverközeli programozás 1 74
Utasítás típusok
� Adatmozgató utasítások
� (Egész) aritmetikai utasítások
� Bitenkénti logikai utasítások
� Bitléptető utasítások
� Vezérlésátadó utasítások
� Sztringkezelő utasítások
� BCD és valós aritmetikai utasítások
� Fordítási direktívák
� Egyéb utasítások
Hardverközeli programozás 1 75
Utasítás típusok
Adatmozgató utasítások
� Regiszter-regiszter (mov, xchg)
� Regiszter-memória (mov)
� Regiszter-I/O port (in, out)
� Regiszter-verem (push, pop)
� Kiterjesztés (bitszélesség fontos) (cbw, cwd)
� Státusz bit állítás (sti, cli)
Hardverközeli programozás 1 76
Utasítás típusok
Aritmetikai utasítások
� Összeadás (átvitel nélkül/átvitellel) (add, adc)
� Kivonás (átvitel nélkül/átvitellel) (sub, sbb)
� Inkrementálás, dekrementálás (inc, dec)
� Kettes komplemens (neg)
� Előjeltelen/előjeles szorzás (mul, imul)
� Előjeltelen/előjeles osztás (div, idiv)
� Összehasonlítás (cmp)
Hardverközeli programozás 1 77
Utasítás típusok
Bitenkénti logikai utasítások
� ÉS művelet (and)
� VAGY művelet (or)
� KIZÁRÓ VAGY művelet (xor)
� Egyes komplemens (not)
� Bit tesztelés (test)
Hardverközeli programozás 1 78
Utasítás típusok
Bitléptető utasítások
� Logikai/előjeltelen balra léptetés (shl)
� Logikai/előjeltelen jobbra léptetés (shr)
� Aritmetikai/előjeles balra léptetés (sal=shl)
� Aritmetikai/előjeles jobbra léptetés (sar)
� Jobbra/balra forgatás (ror, rol)
� Jobbra/balra forgatás carry-n keresztül (rcr, rcl)
Hardverközeli programozás 1 79
Utasítás típusok
Vezérlésátadó utasítások
� Feltétel nélküli ugrás (jmp)
� Feltételes ugrás (ja, jae, jb, jbe, je, jne, jc, jo, …)
� Ciklusszervező (loop, loopz, loopnz, …)
� Hívó utasítás (call)
� Szubrutinból visszatérés (ret)
� Szoftveres megszakítás kérés (int)
� Megszakítás-kezelőből visszatérés (iret)
Hardverközeli programozás 1 80
Utasítás típusok
Stringkezelő (byte-sorozat kezelő) utasítások
� Sztring mozgató (movs, movsb, movsw)
� Sztring összehasonlító (cmps)
� Keresés sztringben (scas)
Egyéb utasítások
� Koprocesszor vezérlő (wait, esc)
� Rendszervezérlő (hlt)
� Üres utasítás (nop)
Hardverközeli programozás 1 81
Utasítás típusok
Fordítási direktívák: gépi kód nincs mögöttük, a fordítás menetét befolyásolják
� Forrásfájl lezárása (end)
� Szegmens definiálás (segment, ends)
� Egyszerűsített szegmensdefiníció (stack, .data)
� Helyfoglalás (db, dw, dd)
� Helyettesítő szimbólum létrehozás (equ)
� …
Hardverközeli programozás 1 82
Címzési módok
Adat vagy utasítás hogyan érhető el.� Rejtett (implicit, implied)� Közvetlen adat megadás (immediate)� Közvetlen cím (direct, absolute)� Regiszteres cím (register direct)� Közvetett cím (indirekt)� Regiszter indirekt� Indexelt cím� Bázis relatív cím� …
Hardverközeli programozás 1 83
Címzési módok
Rejtett címzés
� Nincs igazi cím megadás
� Pl. ha nincs operandus
Hardverközeli programozás 1 84
Op.kód1
Op-kód2
500
501
502
503
Címzési módok
Közvetlen adat megadás
� Műveleti kód után közvetlenül található adat
� Ez lesz az operandus
Hardverközeli programozás 1 85
Op.kód
Adat
500
501
502
503
Címzési módok
Regiszteres címzés
� A műveleti kód hivatkozik egy regiszterre
� A regiszterben található az operandus értéke
Hardverközeli programozás 1 86
Op.kód
Adat500
501
502
503
regiszter
Címzési módok
Közvetlen cím
� Műveleti kód után található egy memóriacím
� Itt helyezkedik el az operandus
Hardverközeli programozás 1 87
Op.kód
731
500
501
502
503
Adat
730
732
733
731
Címzési módok
Közvetett cím
� A műveleti kód után található egy cím
� Ezen a címen található az operandus igazi címe
Hardverközeli programozás 1 88
Op.kód
731
500
501
502
503
945
730
732
733
731
Adat
943
944
946
945
Címzési módok
Regiszter indirekt
� A műveleti kód hivatkozik egy regiszterre
� A regiszterben található címen helyezkedik el az operandus memóriacíme
Hardverközeli programozás 1 89
Op.kód
500
501
502
503
Adat
730
732
733
731
regiszter
731
Címzési módok
Indexelt
� A műveleti kód után található egy cím, ehhez hozzáadva az index regiszterben található értéket megkapjuk az operandus memóriacímét
Hardverközeli programozás 1 90
Op.kód
700
500
501
502
503
Adat
730
732
733
31
index reg.
731
Címzési módok
Bázis relatív
� A műveleti kód után található egy eltolási érték, ehhez hozzáadva a bázis regiszterben található kezdőcímet megkapjuk az operandus címét
Hardverközeli programozás 1 91
Op.kód
11
500
501
502
503
Adat
730
732
733
720
bázis reg.
731
Gépi kód
� Az egyetlen nyelv, amit a processzor megért
� Bináris formátum
� Processzoronként változó lehet
� Példa:assembly: SUB EAX, EBX # eax = eax-ebxgépi kód: 0x29 0xD8
Hardverközeli programozás 1 92
0 0 1 0 1 0 0 1 1 1 0 1 1 0 0 0
SUB művelet
Regiszter a forrás
Regiszteres címzés
32 bites regiszter
d s MOD REG R/MOpKód
Forrás:EBX
Cél:EAX
Programozás
Editor
� Szövegszerkesztőben forráskód létrehozása
� Forrás kód: háttértárolón tárolt szöveges file
� Esetleg nyelv érzékeny eszközrendszer
Fordító (compiler, assembler)
� Előfeldolgozás, lexikai/szintaktikai/szemantikai elemzés, optimalizálás, kódgenerálás
� Eredmény: tárgykód (ojbect file)
� Nem interpreter!Hardverközeli programozás 1 93
Programozás
Kapcsolatszerkesztő (linker)
� A tárgykódban nem igazi címek, csak hivatkozások vannak (több fájl, könyvtári függv.)
� Linker feloldja a hivatkozásokat: futtatható fájl
Betöltő (loader)
� Az op. rendszer része: létrehozza a folyamatot
� RAM-ba tölti a gépi kódot
� Inicializál: regiszterek, verem
� Átadja a vezérléstHardverközeli programozás 1 94
Magasszintű programozásleképezése assembly-re 1.
Programozás alapjai
Kifejezéskiértékelés
Elágaztatás
Ciklusszervezés
Gondolatébresztő kérdések
� Melyik értékadás fut le rövidebb idő alatt?int a, b=2, c=3, d=4, e=1, f=2;a=(b+c)*( d-e)%f ;a=(2+3)*(4 -1)%2 ;a=5;
� Mi az alábbi kifejezés értéke?(!3+8==2*4)+ -1
� Mi az alábbi kifejezés típusa?5/( short )2==.5+’2’
Hardverközeli programozás 1 96
Gondolatébresztő kérdések
� Ki/mikor/hogyan végzi a kifejezés kiértékelést?
� Van címe a konstansnak?
� Van-e különbség a #define és a constközött?
� Kétirányú elágaztatásnak minősül-e azif (a==0) b=0; utasítás?
� Hányszor fut le az alábbi ciklus magja?for (a<1,b=1;c++;d=1) e=1 ;
Hardverközeli programozás 1 97
A forráskód alkotórészei
� Karakterkészlet
� Lexikális egység
� Szintaktikai egység
� Utasítás
� Programegység
� Fordítási egység
� Program
Hardverközeli programozás 1 98
Kom
ple
xitá
s n
ő
Konstans (literál)
� Közvetlen adat megadás (immediate)
� Kódba épített adat
� 8, 16, 32, 64 bit szélességű
� Fix vagy lebegőpontos ábrázolás
� Magas szinten: 123, 1.25f, ’a’
� Alacsony szinten: 0x0000007b, 0x3fa00000, 0x61
Hardverközeli programozás 1 99
Nevesített konstans
Komponensei: név, típus, érték
� #define abc 123
Előfordító kicseréli a nevet az értékre
Kódba épített adat
Assembly szinten egyszerű konstans
� const int abc=123;
Assembly szinten egyszerű változó
A fordító nem engedi a változtatást
Hardverközeli programozás 1 100
Változó
� Komponensei: név, attribútum, cím, érték
� Hatáskör: statikus, dinamikus
� Deklaráció: explicit, implicit, automatikus
� Élettartam: statikus, dinamikus, programozó által vezérelt
� Értékadás: kezdőértékadás (automatikus, explicit), értékadó utasítás, paraméterátadás, input utasítás
Hardverközeli programozás 1 101
Változó
Alacsony szinten
� Adott méretű lefoglalt memóriaterület
� Ha van cím komponens mindig van érték is
� Érték: bitsorozat (tetszőleges értelmezéssel)
� Értékadás: memóriacímre adat mozgatás
� Statikus változó adat szegmensben
� Dinamikus változó verem szegmensben
� Programozó által vezérelt a heap-ben
� Mutató: előjel nélküli egész változó C-benHardverközeli programozás 1 102
Kifejezés
� Komponensei: típus, érték
� Formálisan: operátor, operandus és zárójel
� Operátor: uniáris, bináris, ternáris
� Alak: infix (2+3)*4perfix * + 2 3 4postfix (RPN) 2 3 + 4 *
� Infix alak esetén nem egyértelmű kiértékelés:precendencia és kötésirány kell
� Típusegyenértékűség vagy típuskényszerítés
Hardverközeli programozás 1 103
Kifejezés kiértékelés
� A kifejezés értékének, típusának meghatározása
� Konstans kifejezést a fordító értékel ki
� Nem konstans infix kifejezést a fordító postfixalakra hozza (figyelembe véve a zárójeleket,
precedenciát és a kötésirányt) és az alapján állítja elő a gépi kódot
imul ebx , ecxeax + ebx * ecx & edx add eax , ebx
and eax , edx
Hardverközeli programozás 1 104
Utasítások
Deklarációs utasítás
� Nem (biztos, hogy) áll mögötte gépi kód
� A fordítóprogramnak szól
Végrehajtható utasítás
� Egy magas szintű utasításból több gépi kódú utasítást is előállíthat a fordító
� Csoportjai: üres, értékadó, ugró, elágaztató, ciklusszervező, hívó, egyéb
Hardverközeli programozás 1 105
Elágaztató utasítás
Kétirányú elágaztató utasítás C nyelven:if (kifejezés)utasítás1;[elseutatsítás2;]
Többirányú elágaztató utasítás C nyelven:switch(kifejezés){case egész_konstans_kif_1: [utasítás1;] [case egész_konstans_kif_2: [utasítás2;]][default: utasítás3;]}
Hardverközeli programozás 1 106
A feltételes utasítás alacsony szinten
Hardverközeli programozás 1 107
cmp eax, ebxjne .L0mov ecx, 1
.L0: add edx, 1
if (feltétel)utasítás1;
utasítás2;
cmp eax, ebxjne .L2mov ecx, 1jmp .L3
.L2: mov ecx, 2
.L3: add edx, 1
if (feltétel)utasítás1;
elseutasítás2;
utasítás3;
A switch utasítás alacsony szinten
Hardverközeli programozás 1 108
switch (kifejezés){case kifejezes1:
utasítás1;case kifejezes2:
utasítás2;default:
utasítás3;}utasítás4;
cmp eax, 1je .L3cmp eax, 2je .L4jmp .L2
.L3: mov ebx, 1
.L4: mov ebx, 2
.L2: mov ebx, 3add edx, 1
A break hatása alacsony szinten
Hardverközeli programozás 1 109
switch (kifejezés){case 1:
utasítás1;break;
case 2: utasítás2;break;
default: utasítás3;}
utasítás4;
cmp eax, 1je .L3cmp eax, 2je .L4jmp .L2
.L3: mov ebx, 1jmp .L5
.L4: mov ebx, 2jmp .L5
.L2: mov ebx, 3
.L5: add edx, 1
Ciklusszervező utasítások
Felépítés: fej + mag + vég
Működés szempontjából: üres, ‘normál’, végtelen
Fajtái:� Feltételes
�Kezdőfeltételes�Végfeltételes
� Előírt lépésszámú�Előltesztelő�Hátultesztelő
� Felsorolásos� Végtelen
Hardverközeli programozás 1 110
A C nyelv ciklusai
� Kezdőfeltételes (nem 0 feltétel esetén ismétel)
� Végfeltételes (nem 0 feltétel esetén ismétel)
Hardverközeli programozás 1 111
while (feltétel)utasítás;
for ([kif1 ]; [kif2]; [kif3])utasítás;
doutasítás ;
while (feltétel);
A while és for ciklus alacsony szinten
Hardverközeli programozás 1 112
utasítás0;while (feltétel)
utasítás1;utasítás2;
mov eax, 10jmp .L2
.L3: sub eax, 1
.L2: cmp eax, 0jne .L3add ebx, 1
A for és a while ciklus assembly szinten egyenértékű.
A do-while ciklus alacsony szinten
Hardverközeli programozás 1 113
utasítás0;do
utasítás1;while (feltétel);utasítás2;
mov eax, 10
.L3: sub eax, 1cmp eax, 0jne .L3add ebx, 1
A do-while ciklus nem lehet üres ciklus.
Magasszintű programozásleképezése assembly-re 2.
Eljárás, függvény
Lokális változó
Paraméterátadás
Gondolatébresztő kérdések
� Hol vannak az hívott eljárás utasítási?Mi a kezdő memória címük?Hova kell átadni a vezérlést?
� Melyik utasítással kell folytatni a végrehajtást ha végeztünk az eljárással?Mi a címe a következő utasításnak?Hova kell átadni a vezérlést?
� Hol tárolódik a visszatérési cím?
� Hol van eltárolva a hívási lánc?
115
Gondolatébresztő kérdések
� Hogyan kerülnek át a paraméterek az alprogramba?
� Hogyan kerül vissza a hívóhoz a visszatérési érték?
� Ismersz-e változó paraméterszámú függvényt?
� Hol van tárolva a lokális változó?A memória melyik részén helyezkedik el?
� Miért dinamikus az ‚alap’ változó élettartama?
� Miben különbözik a static változótól?
116
Gondolatébresztő kérdések
� Melyik program a gyorsabb? Miért?#include <math.h >int main(){
int a,b= -23;a=abs (b);return 0;}
#define abs (x) (( x)<0)?( -1*(x)):( x)int main(){
int a,b= -23;a=abs (b);return 0;}
117
Gondolatébresztő kérdések
� Mit ír az alábbi program a képernyőre?#include <stdio.h >int b=2;void one (int a){
a=a+1;}int main(){
one(b);printf (” %d %d\n”,a,b);return 0;}
118
Gondolatébresztő kérdések
� Hányszor fut le az eljárás?#include <stdio.h >void one (int a){
if (a>0) one (a -1);}
int main(){one(1000000);return 0;}
119
Gondolatébresztő kérdések
� Mit csinál a program?#include <stdio.h >void one (){
int T[10000000];T[12345]=67;printf (” %d”,T[12345]);}
int main(){one();return 0;}
120
Gondolatébresztő kérdések
� Mit ír az alábbi program a képernyőre?#include <stdio.h >void one (){
int a= -43;}void two (){
int b;printf (” %d\n”,b);}
int main(){one();two ();return 0;}
121
Alprogram
Az újra felhasználhatóság és a procedurális absztrakció eszköze
Komponensei:
� Név
� Formális paraméterlista
� Törzs
� Környezet
Fajtái:
� Eljárás
� Függvény122
Eljárás
� Tevékenységet hajt végre
� Aktivizálás utasításszerűen lehet
� Befejezés a törzs végére érve vagy befejeztető utasítással
� Folytatás a hívás utáni utasítással
void procedure(int a, char b){printf(”%d %c”,a,b);} // C nyelven nincs eljárás
…
procedure(3,’A’);…
123
Függvény
� Értéket határoz meg
� Aktivizálás kifejezésben
� Befejezés általában befejeztető utasítás révén visszatérési érték megadásával
� Folytatás a kifejezés kiértékelésnél
int function(int a, char b){return a+b;}
…
x=2*function(3,’A’)+1;…
124
A verem
� Last In First Out tároló
� Tetejének a memóriacímét a verem mutató regiszter (SP) tárolja
� Push és Pop művelet
� A verem mérete korlátos
� Veremhez gyakran hozzá kell férni
� Általában gyorsítótárazott (cache)
� Adat kivétele nem fizikai törlés
� Külön memóriaszegmensben van125
Eljárás hívás alacsony szinten…
hívó_utasítása_1
hívó_utasítása_2
eljárás_hívás
hívó_utasítása_3
…
hívott_utasítása_1
hívott_utasítása_2
befejeztetés
…
PC
SP
1
2
3
12
7
8
9
50
11
RAM:
old_PC
4
10
126
6
Hívási lánc
� Az alprogramok hívhatnak újabb alprogramokat, azok továbbiakat, …
� A visszatérési címek folyamatosan a verem tetejére kerülnek (A verem mérete nő.)
� A hívási lánc dinamikusan épül fel, bomlik le
� A lánc miden tagja aktív, de csak a legutóbbi működik
� Rekurzió: egy aktív alprogram meghívása
127
Lokális változók
Az programegységben deklarált nevek (változók) a programegység lokális nevei (változói).
C nyelvnél (alapesetben):
� Statikus hatáskörkezelés
� Dinamikus élettartam kezelés
� Nincs automatikus kezdőérték
128
Lokális változó alacsony szinten
� Az alprogramba lépéskor a verem tetején a visszatérési cím található
� A verembe mentjük a bázis regiszter értékét
� A veremmutató (SP) értékét átmásoljuk a bázis regiszterbe (BP)
� Átállítva a veremmutató értékét hagyunk helyet a lokális változók számára a verembenA verem nem csak LIFO módon kezelhető
� A lokális változók ‚bázis relatív’ címzéssel elérhetőek
129
Lokális változó alacsony szinten
void eljar (){
int a=1;
int b=2;
int c=3;
… *
}
Hardverközeli programozás 1 130
a=1
b=2
c=3
730
734
738
742
???
régi ebp
746
750
ret. cím754
esp=734
ebp=750
[ebp-8]
[ebp-4]
[ebp-12]
* A RAM tartalma:
Lokális változó alacsony szinten
eljar : push ebpmov ebp , espsub esp , 16mov DWORD PTR [ebp-12], 1mov DWORD PTR [ebp -8], 2mov DWORD PTR [ebp -4], 3…mov esp , ebppop ebpret
Hardverközeli programozás 1 131
Paraméter kiértékelés
Formális- és aktuális paraméter összerendelés
� Sorrendi kötés
� Név szerinti kötés
Számbeli egyeztetés
� Azonos paraméterszám
� Eltérő paraméterszám
Típusegyeztetés
� Típusegyezés
� Típus konverzió
132
Paraméterátadás
� Érték szerinti
� Cím szerinti
� Eredmény szerinti
� Érték-eredmény szerinti
� Név szerinti
� Szöveg szerinti
Az adatmozgás iránya fontos
C nyelvben: csak érték szerinti paraméterátadás133
Érték szerinti paraméterátadás
� Formális paraméternek van címkomponense ahívott területén.
� Aktuális paraméternek van érték komponense.
� Az aktuális paraméter értéke átkerül a hívottalprogram területén lefoglalt címkomponensre.
� Az információátadás egy irányú.
� Az alprogram a saját területén dolgozik.
� A hívott alprogram nem tudja hol van a hívó.
134
Függvényhívás alacsony szinten
1. A hívó a verembe teszi az aktuális paramétereket fordított (!) sorrendben. (sorrendi kötés, számbeli egyeztetés)
2. A verembe bekerül a visszatérési cím (PC aktuális értéke).
3. PC megkapja a hívott alprogram kezdőcímét.
4. Szekvenciálisan lefutnak a hívott utasításai. Hívott alprogram felhasználja a veremben lévő paramétereket (bázis relatív, lokális változó).Meghatározódik a visszatérési érték.
135
Függvényhívás alacsony szinten
5. Visszatérési érték betétele a verembe (a visszatérési cím alá).
6. Veremből visszatérési cím (hívást követő utasítás
címe) kivétele.
7. Vezérlés visszaadása a megadott címre (lásd 6. pont).
8. Visszatérési érték kivétele a veremből.
9. Paraméterek kitakarítása a veremből.
10. Végrehajtás folytatása a következő utasítással.
136
Függvényhívás alacsony szinten
Egyes esetekben…
� … a paraméterek meghatározott sorrendben regiszterekbe kerülnek, itt adódnak át. (El kell
menteni a korábbi tartalmat)
� … a visszatérési értéket az egyik regiszteren keresztül adjuk vissza
� A paraméterek kitakarítása a veremből lehet a hívó vagy a hívott feladata is
Hardverközeli programozás 1 137
Példa C nyelven
int fuggv(int c){int a;a=c+1; *
return a;}
int main(int argc,char *argv[]){
int a, b;a=argc;b=fuggv(a);return b;}
Hardverközeli programozás 1 138
730
734
738
742
746
750
754
esp=726
ebp=734
[ebp-8]
[ebp-4]fuggv: a
régi ebp
fuggv: c
param.
visszatér.cím
main: a
ősi ebp
main: b
758
762
[ebp+4]
[ebp+8]
[ebp+12]
[ebp+16]
726
766
770
[ebp+20]
* A RAM tartalma:
Példa assembly-ben #1fuggv: push rbp
mov rbp, rspsub rsp, 8mov eax, DWORD PTR [rbp+16]mov DWORD PTR [rbp-8], eaxmov eax, DWORD PTR [rbp-8]add eax, 1mov DWORD PTR [rbp-4], eaxmov eax, DWORD PTR [rbp-4]mov DWORD PTR [rbp+16], eaxmov rsp, rbppop rbpret
Hardverközeli programozás 1 139
Példa assembly-ben #2main: push rbp
mov rbp, rspsub rsp, 8mov DWORD PTR [rbp-8], edimov eax, DWORD PTR [rbp-8]push raxcall fuggvpop raxmov DWORD PTR [rbp-4], eaxmov eax, DWORD PTR [rbp-4]mov rsp, rbppop rbpret
Hardverközeli programozás 1 140
Cím szerinti paraméterátadás
� Formális paraméternek nincs címkomponense ahívott területén.
� Aktuális paraméternek van cím komponense ahívó területén.
� Az aktuális paraméter címe átkerül a hívottalprogramhoz, aki itt dolgozik.
� Az információátadás két irányú.
� Az alprogram a hívó területén dolgozik.
� Gyorsabb, de veszélyesebb.
141
Megszakítási rendszer és input/output
Megszakítás, kivétel
Megszakításkezelés
Input/output
Buszrendszerek, perifériák
Szükségesség
� Az általános célú számítógépek fontosképessége, hogy kölcsön hat az I/O eszközökkel(billentyűzet, egér, hálózati interfész, monitor).
� Ezek ez eszközök azonnali választ várnak aprocesszortól, függetlenül attól mivelfoglalkozik éppen.
� Váratlanul bekövetkező eseményekre a CPU-nakreagálnia kell.
� A megszakítás szolgál a CPU figyelménekfelhívására.
Hardverközeli programozás 1 143
Megszakítás
� Speciális jelzés a CPU számára
� Egy esemény bekövetkeztét jelzi
� Azonnal reagálni kell rá
� A „normál” végrehajtást meg kell szakítani
�Később tudni kell folytatni
� Forrás
�Hardver
�Processzor
�Szoftver
Hardverközeli programozás 1 144
Megszakítás típusok
Aszinkron
� Külső forrásból (például I/O eszköz) származik
� Független az aktuálisan végrehajtott utasítástól
Szinkron (másként „kivétel”)
� Processzor által kiváltott kivétel
�Hiba: „kijavítható” probléma, újra próbálkozás
�Csapda: pl. nyomkövetésnél
�Elvetés: jelentős, „javíthatatlan” (hardver) hiba
� Programozott kivétel (rendszerhívás)
Hardverközeli programozás 1 145
Fogalmak
Megszakítási vonal
� Egy (vagy több) CPU vezérlő busz vezeték
Megszakítási kérelem (IRQ)
� A megszakítások egész számokkal (0-255) azonosíthatók
� Lehet prioritásuk
Programozható megszakítás vezérlő (PIC, APIC)
� Azonosítja a megszakítás forrását, aktiválja a megszakítási vonalat, kezeli prioritásokat
Hardverközeli programozás 1 146
Fogalmak
Megszakítási rutin (ISR)
� Az a programrész, amely megszakítási kérelem esetén aktiválódik, kezeli a speciális helyzetet
� „Hívás nélküli” alprogramhoz hasonlít
Kontextus
� Ahhoz, hogy folytatni tudjuk a „normál” végrehajtást a kivételkezelés után először el kell menteni, majd vissza kell állítani az eredeti környezetet, regisztertartalmakat
Hardverközeli programozás 1 147
Fogalmak
Maszkolás
� Egyes megszakítási kérelmek figyelése kikapcsolható
�Egyszerre, globálisan, processzorban
�Külön-külön, a PIC-ben lévő IMR segítségével
� Vannak nem maszkolható megszakítások (NMI)
Nested interrupt („fészkelt megszakítás”)
� Megszakítási rutint megszakító újabb IRQ
� Megszakítás megszakítása
Hardverközeli programozás 1 148
Megszakításkezelés
Hardverközeli programozás 1 149
Utasítás beolvasás
Utasítás dekódolás
Utasítás végrehajtás
Kontextus mentés
Eszköz azonosítás
Rutin (ISR) keresés
Rutin (ISR) végrehajtás
Kontextus visszaállítás
NMI?igen
nem
igen
nem
igen
nem
Maszk tilt?
Megszakítás?
Megszakításkezelési technikák
Vektoros megszakításkezelés
� Megszakítási vonal aktiválás
� A megszakítás kérő azonosítja magát
�Buszrendszeren egyedi kódot/címet küld
Lekérdezéses (polling) megszakításkezelés
� Megszakítási vonal aktiválás
� A CPU sorozatos lekérdezésekkel kideríti kinek van megszakítási igénye
Hardverközeli programozás 1 150
Megszakításkezelési technikák
Hardverközeli programozás 1 151
ISR 1 címe
vekt
or…
ISR n címe
…
…
ISR 1 programkódja
…
ISR n programkódja
…
megszakítás lekérdező
eljárásprogramkódja
…
ISR 1 programkódja
…
ISR n programkódja
…
IRQ n IRQ
Vektoros megszakításkezelés Lekérdezéses megszakításkezelés
Input/Output
� Kapcsolat a külvilággal
�Hardveres I/O interfészek
�Szoftver interfész (device driver)
�Perifériás eszközök
Hardverközeli programozás 1 152
Periféria 1 Periféria 2
Külső buszok
Processzor Memória
Rendszer busz
I/O interfészek
buffer buffer
Input/output interfészek
� Kapcsolat a CPU és a perifériák között
� Címezhető eszközök
�Memóriára leképezett I/O (MMIO)
�Portra leképezett I/O (PMIO)
� Különböző adatsebesség
� Különböző fizikai jelek
�Soros átvitel
�Párhuzamos átvitel
� Az eszközvezérlés nem a CPU feladata
Hardverközeli programozás 1 153
I/O technikák
Programozott I/O (PIO)
� Speciális I/O utasításokkal (in, out)
� A program írja le mikor kell a perifériához fordulni (függetlenül annak állapotától)
� Utasításonként csak egy szó átvitele az I/O buffer és a CPU regiszterei között
� I/O adat és címregiszterek a CPU-ban
� Sok CPU időt felemészt az eszközök állapotának sorozatos elkérdezése
Hardverközeli programozás 1 154
I/O technikák
Megszakítás vezérelt I/O
� A periféria megszakításokkal jelez a CPU-nak
�Ha van új input vagy
�Ha kész van az outputtal
� A CPU nem figyel folyamatosan
�Közben tud mással foglalkozni
� Az adatmozgás a CPU és az I/O modul között történik
Hardverközeli programozás 1 155
I/O technikák
Direkt memória hozzáférés (DMA)
� Külön vezérlő révén közvetlen RAM-I/O kapcsolat (RAM-RAM, RAM-I/O)
� A CPU kéri fel a DMA vezérlőt a műveletre
� Ha a DMA vezérlő kész van megszakítást kér
� CPU nem vesz részt az adatmozgatásban
� Blokkos átviteli mód
I/O processzor (IOP)
� DMA kiterjesztése nagyobb önállósággalHardverközeli programozás 1 156
Hardverközeli programozás 1 157
Buszrendszerek
Párhuzamos
�ISA
�PCI
�ATA (ATAPI, UATA, IDE)
�VESA Local Bus (VLB)
�SCSI
�AGP
�…
Soros
�I2C
�PCI Express
�Serial ATA
�USB
�Serial Attached SCSI
�FireWire
�…
PCI busz
� Peripheral Component Interconnect
� Párhuzamos belső busz
� Sínszélesség: 32 vagy 64 bit
� Átviteli sebesség: 133-533 MB/s
� Fejlesztés: 1992-2002
� Külön vezérlőáramkör szükséges
Hardverközeli programozás 1 158
Forrás: en.wikipedia.org/wiki/Conventional_PCI
PCIe busz
� Peripheral Component Interconnect Express
� Soros belső busz
� 1 link 1, 2, 4, 8, 16 vagy 32 sávból áll
� Átviteli sebesség: 4000-31500 MB/s (v4.0)
� Fejlesztés: 2003-
� Minden eszköznek külön link (nem osztoznak)
Hardverközeli programozás 1 159
Forrás: en.wikipedia.org/wiki/PCI_Express
(Parallel) ATA busz
� (Parallel) AT Attachment
� Párhuzamos belső busz
� „Szinonimák”: PATA, ATAPI, UATA, IDE, EIDE
� Átviteli sebesség: 3,3-166 MB/s
� Fejlesztés: 1986-2003
� HDD, FDD, CD és DVD meghajtó csatlakoztatás
Hardverközeli programozás 1 160
Forrás: en.wikipedia.org/wiki/Parallel_ATA
SATA busz
� Serial ATA
� Soros belső busz
� Pont-pont kapcsolat
� Átviteli sebesség: 150-1969 MB/s (v3.2)
� Fejlesztés: 2003-
� HDD, SSD, CD és DVD meghajtó csatlakoztatás
Hardverközeli programozás 1 161
Forrás: hu.wikipedia.org/wiki/Serial_ATA
USB busz
� Universal Serial Bus
� Soros külső busz
� Plug-and-Play, elosztható (hub)
� Átviteli sebesség: 0,18-1250 MB/s (v3.1)
� Fejlesztés: 1996-
� Csatlakozók: standard-A, standard-B, mini-A, mini-B, micro-A, micro-B
Hardverközeli programozás 1 162
Forrás: en.wikipedia.org/wiki/USB
Vezérlő hub-ok
Az alaplap fontos chip-jei
� Northbridge (memóriavezérlő hub)
� Southbridge (I/O vezérlő hub)
Hardverközeli programozás 1 163
CPU
North-bridge
South-bridge
AGP RAM
BIOS PCI IDE USB LAN I/O
Eszközmeghajtó
� Device Driver
� Eszköztípusok
�Karakteres, blokkos, hálózati, egyéb
� A programok hardvertől független rendszerhívásokat alkalmaznak
�open, read, write, close, …
� Az eszközmeghajtók „töltik meg” ezt konkrét hardver specifikus tartalommal
Hardverközeli programozás 1 164
Perifériák
Hardverközeli programozás 1 165
Input� Billentyűzet
� Egér
� Szkenner
� Kamera
Output� Monitor
� Nyomtató
� Projektor
� Audio rendszer
Tároló� Háttértár (HDD, SSD)
� CD/DVD/Blu-ray
� USB tároló
� Memória kártya
Hálózat� Ethernet kártya
� Wi-Fi kártya
Adattárolás
Operatív memória
Cache
Háttértárak
Tárolók osztályzása
� Írhatóság szempontjából�Csak olvasható, olvasható-írható
� Hierarchiabeli helye szerint�Elsődleges, másodlagos, harmadlagos
� Tárolási közeg szerint �Félvezető, mágneses, optikai
� Adatmegőrzés szerint�Megmaradó, nem megmaradó
� Elérés szerint�Soros elérésű, tetszőleges elérésű
Hardverközeli programozás 1 167
Elsődleges memória
� A processzor és a futó programok által aktívan használt tároló
� Gyors elérésű
� Nem maradandó memória
� Méret erősen korlátos
� Ide tartoznak
�Regiszterek
�Gyorsítótárak
�Operatív memória
Hardverközeli programozás 1 168
Másodlagos memória
� Háttértároló
� Az elsődleges memória „kiterjesztése”
� Nagy tároló kapacitás
� Kisebb elérési sebesség
� Maradandó tárolás
� Ide tartoznak
�HDD, SDD
�CD-, DVD-meghajtó
�Memóriakártya
Hardverközeli programozás 1 169
Harmadlagos memória
� Többnyire eltávolítható adathordozókra épít
� Robotikus eszközök csatlakoztatják a kívánt tároló médiumot („wurlitzer”)
� Ritka hozzáférés
� Óriási tároló kapacitás
� Cél hosszú távú archiválás
� Ide tartoznak
�Mágnesszalagos tárolók
�Optikai tárolók
Hardverközeli programozás 1 170
Félvezető memóriák
Read-Only Memory (ROM)
� Gyártás során kerül bele a tartalom, ami később nem változtatható
� Tartalmat sokáig megőrzi, tápfeszültség hiányában is
Programable Read-Only Memory (PROM)
� Gyártás után „üres”. Speciális eszközzel egyszer „beégethető” a tartalom
� Az írás folyamata lassú (a RAM-hoz képest)
Hardverközeli programozás 1 171
Félvezető memóriák
Erasable Programable ROM (EPROM)
� Erős UV fénnyel (lassan) törölhető a tartalom
� Majd ismét újraírható
Electrically Erasable Programable ROM (EEPROM)
� Elektronikusan, bájtonként törölhető tartalom
Flash memória
� Speciális továbbfejlesztett EEPROM
� Blokkonként (gyorsabban) törölhető
Hardverközeli programozás 1 172
Félvezető memóriák
Random Access Memory (RAM)
� Véletlen elérés
�Elérési idő nem függ az elhelyezkedéstől
� Írható/olvasható tetszőleges számban
� Elveszti a tartalmát tápfeszültség hiányában
� Nagy írási/olvasási sebesség
Static Random Access Memory (SRAM)
� Frissítés nélkül is megtartja a flip-flipokban a tartalmat a tápellátás megszűnéséig (pl. cache)
Hardverközeli programozás 1 173
Félvezető memóriák
Dynamic Random Access Memory (DRAM)
� Rendszeresen frissíteni kell, hogy a kondenzátor révén tárolt információ megmaradjon
� SRAM-nál lassabb (pl. operatív tár)
� Olyan gyorsan válaszol ahogy tud
Syncronous Dynamic RAM (SDRAM)
� Órajellel szinkronizált válasz
� Gyorsabb az aszinkron DRAM-nál (pipelineműködés)
Hardverközeli programozás 1 174
Félvezető memóriák
Double Data Rate (DDR)
� Gyorsított SDRAM
� Az órajel fel és leszálló élére is szinkronizál
� DDR2, DDR3, DDR4
�Egyre nagyobb sebesség
�Egyre nagyobb adatsűrűség
�Egyre kisebb feszültség
� Nem kompatibilis DIMM (SDRAM, DDR, DDR2, DDR3, DDR4)
Hardverközeli programozás 1 175
Gyorsítótár
� Egyes eszközök rendszeresen adatot cserélnek
� Az eszközök adatátviteli sebessége nagyon eltér
� A lassú eszköz miatt a gyors is „lelassul”
� Pl. a CPU kb. 10-szer gyorsabb a RAM-nál
� Megoldási ötlet
�Köztes tároló beiktatása (cache)
�Gyorsabb, mint a lassú eszköz (SRAM, közeli)
�Magas ára miatt teljesen nem helyettesíti a lassút
� Létjogosultság: lokalitási elvek
Hardverközeli programozás 1 176
Gyorsítótár
Térbeli lokalitás elve
� Ha egy program hivatkozik egy memóriacímre (adat vagy utasítás), akkor nagy valószínűséggel hamarosan hivatkozik a szomszédos címekre is�Szekvenciális végrehajtás, tömbök
Időbeli lokalitás elve
� Ha egy program hivatkozik egy memóriacímre, akkor nagy valószínűséggel hamarosan ismét hivatkozik rá�Ciklusok
Hardverközeli programozás 1 177
Gyorsítótár
� Leggyakrabban használt adatok tárolása
� Kisebb tárolókapacitás, gyorsabb elérés (SRAM), mint az operatív memória esetén
� Átlátszóak a felhasználó számára
� Asszociatív (CAM) memóriát tartalmaz
� CPU cache, GPU cache, Web cache, DNS cache
� CPU cache
�Többszintű: L1, L2, L3 cache
�On-chip vagy off-chip
Hardverközeli programozás 1 178
Gyorsítótár felépítése
� A tárolás egysége a „Sor”
� A Sor részei a „Tag” (toldalék) és a „Blokk”
� A Tag tartalmazza a Blokk főtárbeli címét és egyéb vezérlő információkat
� A Blokk a főtár egy részének a másolata
Hardverközeli programozás 1 179
Cache
Tag Blokk
128 … DEF
131 … MNO
129 … GHI
RAM
ABC 127
DEF 128
GHI 129
JKL 130
MNO 131
…
CPU
A cache működése
� A processzor a szükséges adatot a cache-ben keresi (átadja a tárcímet a cache vezérlőnek)
� Ha az adott cím el van tárolva a Tag-ben (cache hit), akkor válaszol a Blokk tartalma alapján
� Ha a cím nincs eltárolva (cache miss), akkor beolvassa a megfelelő területet a főtárból, dönt arról, melyik sorba mentse és elmenti (felülírva valamelyik cache sort), majd válaszol a Blokk tartalma alapján
Hardverközeli programozás 1 180
A cache működése
� Az írás művelete során figyelni kell a főtár és a gyorsítótár tartalmának konzisztenciájára
� Megoldások
�Közvetlen írás
�Visszaírás
Közvetlen írás
� Gyorsítótár írásával egyidejűleg a főtár is íródik
� Az írást a cache nem gyorsírja
Hardverközeli programozás 1 181
A cache működése
Visszaírás (write back)
� Gyorsítótár minden írás esetén módosul
� A Tag vezérlő részében ezt jelezzük („dirty”)
� Ha a cache adott sorát felül kell írni újabb olvasási művelet miatt, és a sor „dirty” visszaírjuk a tartalmát a főtárbaMajd megtörténik a sor felülírása az újjal
� Többprocesszoros rendszerekben probléma a külön cache-ek miatt. Probléma DMA esetén is.
Hardverközeli programozás 1 182
A cache működése
Hardverközeli programozás 1 183
igen
nem
Igény?
Felülírandó sor keresés
Válasz az adattal
nem
igen
igenigen
nem nem
Cache hit? Cache hit?
„Dirty”? „Dirty”?
Alsóbb memória olvasás a
választott sorbaStátusz:
nem „dirty”
Felülírandósor visszaírása
Alsóbb memória olvasás a
választott sorba
Felülírandó sor keresés
Felülírandósor visszaírása
olvasás írás
Új adat írása a választott blokkba
Státusz: „dirty”
A cache jellemzői
� A gyorsítótár mérete
� A Blokk mérete
� Egy Blokk kikeresésének ideje
� Aktualizálási idő (visszaírásnál)
� Helyettesítési stratégia (sor felülírásnál)
� Találati arány (hit rate)
�Általában 90% feletti
�Méretfüggő
Hardverközeli programozás 1 184
Cache hierarchia
Hardverközeli programozás 1 185
processzor
core
L1utasítás
L1adat
L2
core
L1utasítás
L1adat
L2
L3
processzor
core
L1utasítás
L1adat
L2
core
L1utasítás
L1adat
L2
L3
Fő memória
>10kB
>100kB
>1MB
>1GB
Cache hatása a programokra...
ARRAY = (double*)malloc(SIZE*sizeof(double));
N_Rep = 1000000000/SIZE;
for(j=0; j<N_Rep; j++)
for(i=0; i<SIZE; i++)
sum += ARRAY[i];
...
Hardverközeli programozás 1 186
Ha az adat elfér a cache-ben,akkor a program gyorsabb!
Háttértár
Problémák
� Az operatív tár nem elég nagy
� Kikapcsoláskor a RAM tartalma elvész
Megoldás
� Háttértár: lassabb elérés, de nagyobb kapacitás
Tárolási elv
� Mágneses: merevlemez (HDD)
� Elektronikus: szilárdtest-meghajtó (SSD)
� Optikai: CD, DVD, Blu-ray
Hardverközeli programozás 1 187
Merevlemez
� Winchester, Hard Disc Drive (HDD)
� Mágnesezhető, forgó lemezeken tárolt adat
� Lemezenként 2 író/olvasó fej
� Tulajdonságai
�Tárolókapacitás: <2TB
� Írási/olvasási sebesség: 100MB/s - 1GB/s
�Fordulatszám: 5400 - 15000 rpm
�Csatoló felület: ATA, SATA, SCSI, USB
� Lemez gyorsítótár mérete: 1MB – 64MB
Hardverközeli programozás 1 188
Adattárolás merevlemezen
� A HDD több tároló lemezt tartalmazhat
� A lemezek felülete koncentrikus sávokra osztott
� Az egymás alatti lemezeken lévő azonos sugarú sávok alkotják a cilindert
� A sávok szektorokra vannak osztva
�Ez az adattárolás legkisebb egysége
� Klaszter a szektorokból álló folytonos terület
� Minden író/olvasó fej egyszerre mozog
�egy adott pillanatban egy cilinderen helyezkednek el
Hardverközeli programozás 1 189
Szektor
Hagyományos szerkezet512 bájtos szektor
Advanced Format (AF)4K native
Hardverközeli programozás 1 190
512 bájt adat
szektorszektor szektor szektor szektor szektor szektor szektor
rés szinkron cím hibajavító
sáv
4096 bájt adat
Szektor hatása programokra...
#define SIZE 2048
char BUFFER[SIZE];
out=open("output.txt",O_WRONLY);
write(out, BUFFER, SIZE);
close(out);
...
Hardverközeli programozás 1 191
Szektor méretnél kevesebbet fájlba írni nem hatékony!
Bufferelt adatfolyam
� Az output adatfolyamokat gyakran a rendszer buffereli és csak később blokkosan írja ki.
� Kevesebb rendszerhívás, kevesebb lemez művelet, gyorsabb program
…while(i<100000){
fprintf(f,”x”);sleep(t); i++;}
…
Hardverközeli programozás 1 192
Adatelérés merevlemezen
Hogyan hivatkozható egy terület a HDD-n?
� CHScilinder-fej-szektor hármassal (régi)
� LBAlogikai blokk címzéssel (lineáris, új)
� Konverzió (egyszerű esetben):LBA = (C*Nfej+H)*Nszektor+(S-1)
� Lemezvezérlő foglalkozik a logikai és fizikai cím leképezéssel
Hardverközeli programozás 1 193
Sávok szektorszáma
Régi HDD esetén
� Minden sávban azonos számú szektor
� Külső szektorok adatsűrűsége sokkal kisebb, mint a belsőké (kihasználatlanság)
Modern HDD esetén
� Zone Bit Recording (ZBR)
� Szektorok adatsűrűsége közel azonos
� Külső sávokban több szektor, mint a belsőkben
� Címzés bonyolultabb Hardverközeli programozás 1 194
SSD
� Szilárdtest-meghajtó (Solid State Drive)
� Mozgó alkatrész nélküli félvezető memória
� Blokkos adatelérés
� SATA, SCSI, USB csatlakozás
� Előnyei a HDD-vel szemben
�Gyorsabb adatelérés
�Egyenletes adathozzáférés
�Kisebb zaj, fogyasztás és hőtermelés
�Mechanikai megbízhatóság
Hardverközeli programozás 1 195
Háttértár magasabb szinten
� Formázás
�Alacsony szintű (szektor szerkezet kialakítás)
�Magas szintű (fájlrendszer)
� Particionálás
�HDD kisebb logikai egységre bontása
�MBR, GPT kialakítás
� Fájlrendszerek
�FAT32, NTFS
�ext2, ext3, ext4
Hardverközeli programozás 1 196
MBR
Master Boot Record
� LBA 0
�Boot kód (pl. GRUB) + Partíciós tábla
� Max 4 partíció és egyenként max 2 TB
�4 elsődleges partíció
�3 elsődleges partíció + 1 kiterjesztett partíció (utóbbin további logikai partíciók lehetnek)
� BIOS indítja a betöltőt
�a Power On Self Test után
Hardverközeli programozás 1 197
GPT
GUID Partition Table
� LBA 0: MBR megőrzés;
� LBA 1: elsődleges GPT fejrész
� LBA 2-33: elsődleges GPT partíciós tábla
� Utolsó szektorok: biztonsági tartalék
�Másodlagos GPT fejrész és partíciós tábla
� UEFI szabvány (BIOS lecserélés)
� Akár 128 partíció, max lemezméret 9,4 ZB
Hardverközeli programozás 1 198
FAT file rendszer
Hardverközeli programozás 1 199
Fájlnév Attribútumok Kezdő klaszter
Alma.txt Bla-bla 6
Kutya.txt Bla-bla 10
0 1 2 3 4 5 6 7 8 9 10
8 EOF 7 4 EOF 50 MBR
1 FAT 1
2 FAT 2
3 Gyökér
4 „gyümölcs ”
5 „állat.”
6 „Az alma ”
7 „finom ”
8 „szerintem.”
9
10 „Emlős ”
Gyökérkönyvtár bejegyzései
File Allocation TableMerevelemez
Linux file rendszerek
� Pl.: Ext2, Ext3, Ext4
� Fájl tárolása
� Könyvtár tárolás
Hardverközeli programozás 1 200
attribútumok mutató filetartalom
a lemezen
file név inode ID
könyvtári bejegyzés inode adat blokk
attribútumok mutatókönyvtár név inode ID
könyvtári bejegyzés inode adat blokk
file1 inode ID 1
file2 inode ID 2
file3 inode ID 3
file4 inode ID 4
Linux file rendszerek
Könyvtár hierarchia
Hardverközeli programozás 1 201
könyvtáribejegyzés
inode file adat
inode tábla
sys
MBR cilinder csop. cilinder csop. cilinder csop. cilinder csop. cilinder csop. cilinder csop.
partíció
adat szektorok
inode
Hardverközeli programozás 1 202
attr
ibú
tum
ok
méret
eszköz
felhasználó
csoport
fájl mód
időbélyegek
linkszám
adat
blo
kk m
uta
tók
direkt mutatók(12 db)
simpla indirekt
dupla indirekt
tripla indirekt
inode adat blokkok
RAID
� Redundant Array of Independent Disks
� Adatelosztás vagy replikálás több lemezen
� A technológia célja
�Adatbiztonság növelés
�Adatátviteli sebesség növelés
� Több „szint” (RAID 0-6)
�Akár hierarchikusan is (RAID 1+0)
� Szoftveres vagy hardverrel támogatott megvalósítás
Hardverközeli programozás 1 203
RAID példák
Hardverközeli programozás 1 204
A1
A3
A5
A7
A2
A4
A6
A8
RAID 0 (összefűzés)
A1
A2
A3
A4
RAID 1 (tükrözés)
AP
BP
CP
DP
RAID 5 (forgó paritás)
A1
B1
C1
D1
A2
B2
C2
D2
RAID 4 (paritás lemez)
Lemez 1 Lemez 2 Lemez 1 Lemez 2
Lemez 1 Lemez 2
A1
A2
A3
A4
Lemez 3
AP
B2
C2
DP
A1
B1
CP
D1
A2
BP
C1
D2
Lemez 1 Lemez 2 Lemez 3
Memória hierarchia
Regiszter
L1 cache
L2 cache
L3 cache
Memória
Lemez
Harmadlagos tár
Hardverközeli programozás 1 205
ns
µs
ms
s
Elérési idő
Memória hierarchia
Regiszter
L1 cache
L2 cache
L3 cache
Memória
Lemez
Harmadlagos tár
Hardverközeli programozás 1 206
kB
MB
GB
TB
EB
B
Tároló kapacitás
A programozás és az operációs rendszer
Rendszerhívás
Folyamatok
Szignál
Ütemezés
Virtuális memória
Duál-módú működés
Kernel mód
� Magas CPU jogosultság
� A processzor minden utasítást végre tud hajtani
� Minden memóriarekesz megcímezhető
User mód
� Alacsony CPU jogosultság
� Processzor korlátozott utasításkészletet használ
� Nem minden memóriarekesz hozzáférhető
Hardverközeli programozás 1 208
Rendszerhívás
� Interfész a felhasználói program és az operációs rendszer kernel között
� A program egy szolgáltatást igényelhet az operációs rendszer kerneltől
� Tipikus megvalósítás szoftver interrupt-tal
� Kernel módú működés
� Például�Folyamatok kezelése
�Fájlok kezelése
�Eszközök kezelése
Hardverközeli programozás 1 209
Rendszerhívás
Példa:
Egy USB meghajtón lévő file írása
� Saját C program
� fprintf() standard könyvtári függvény
� write rendszerhívás
� USB driver
� USB drive
Hardverközeli programozás 1 210
Szoftver
Felhasználói program
Kernel
Hardver
Könyvtári függvény
Rendszerhívás
Eszköz meghajtó
Hardver eszköz
Folyamat
� Process, processzus
� Végrehajtás alatt álló program
� Erőforrásokkal rendelkezik
�CPU-idő, memória, állományok, I/O eszközök
� A folyamatokhoz kapcsolódó információkat a folyamatvezérlő blokk (PCB) tartalmazza
� Kommunikálhatnak egymással
� Inter-process communication (IPC)
Hardverközeli programozás 1 211
Folyamat
� Egyedi azonosítóval rendelkezik (PID)
� Minden folyamatnak egy szülő- és több gyermek folyamata lehet
� Multi-programozott környezetben egynél több folyamat is lehet egyszerre
� Egy vagy több szálból állhat a folyamat
� Különböző állapotokban lehetnek
�Az állapotok között különböző állapotátmenetek
Hardverközeli programozás 1 212
Folyamat ütemezés
� Multi-programozott környezet (több folyamat)
� Ütemező: választ a futásra kész folyamatok közül, ki kapja meg a CPU-t
�Algoritmusok: FCFS, RR, SJF, EDF
� Preemptív ütemezés
�Pl. hardveres időzítő lejár és megszakítást kér
�Aktuális folyamat megszakad, majd aktiválódik az ütemező kódja
�Választ egy folyamatot, beállítja az időzítőt és átadja a vezérlést a választott folyamatnak (PCB-t módosít).
Hardverközeli programozás 1 213
Folyamat állapotátmenetek
Hardverközeli programozás 1 214
Futásra készfelfüggesztett
Várakozófelfüggesztett
Futásra kész
Futó
Új Befejezett
Várakozó
kilapozás belapozás kilapozás belapozás
ütemezés
időtúlfutás
eseményrevárás
esemény bekövetkezés
op
eratív mem
ória
lapo
zó file
befogadás
leállás
Folyamatok közötti kommunikáció
Néha a folyamatoknak szükségük van információcserére egymás között
� Fájl: több folyamat által közösen használt fájl
� Pipe: pl. input/output átirányítás
� Szignál: értesítés eseményről bekövetkeztéről
� Szemafor: osztott erőforrás szinkronizációjához
� Shared memory: közösen használt RAM terület
� Socket: hálózati protokollokon keresztül
� …Hardverközeli programozás 1 215
Szignál
� Egy folyamatnak küldött jelzés
� Esemény bekövetkeztét jelzi, aszinkron módon
� Üzenet/adat csere nincs
� Ha egy folyamat kap egy szignált a normál működés megszakad végrehajtódik a definiált szignálkezelő kód, majd a folyamat folytatódik
� Gyakori szignálok:SIGINT (2), SIGKILL (9), SIGALRM (14), SIGTERM (15), SIGCHLD (18), SIGSTOP (23), SIGCONT (25)
Hardverközeli programozás 1 216
Virtuális memória
� A fizikai memória korlátainak transzparens átlépését teszi lehetővé a háttértár segítségével
� Fizikai memória keretekre osztva
� Logikai memória lapokra osztva (fix méret: 4kB)
� Külön virtuális- és fizikai címzés
� Virtuális cím leképezése fizikai címre: laptábla
� A nem használt lapok kilapozhatóak a HDD-re
� A Memory Management Unit (MMU) irányít
Hardverközeli programozás 1 217
Virtuális memória
� Hivatkozás RAM-ban nem lévő lapra (lap hiba)
� Lapcsere szükséges
� Lapcserélési stratégia fontos (FIFO, LRU, …)
� HDD elérés ideje kb. 100 000-szerese a RAM elérési időnek
�Gyakori lapozás lassítja a programot
� Megvalósítás
� Linux: swap partíció
�Windows: C:\pagefile.sys fájl
Hardverközeli programozás 1 218
Virtuális memória kezelése
1. CPU logikai memória igény (lap# + offset).
2. Laptábla ellenőrzés: ha a lap a RAM-ban folytasd a 9. lépésnél, különben 3. lépésnél!
3. Válassz a RAM-ban egy keretet a beolvasáshoz!
4. Szükség esetén indítsd el a keretben lévő lap kiírását a HDD-re, majd indítsd el a szükséges lap beolvasását a keretbe!
5. Közben a folyamat várakozó állapotba kerül, az ütemező indítson egy futásra kész folyamatot!
Hardverközeli programozás 1 219
Virtuális memória kezelése
6. A háttérben a DMA vezérlő (kiírja) beolvassa a RAM-ba a HDD-ről a lapot és ha kész küld egy „I/O kész” megszakítást.
7. A folyamat futásra kész állapotba kerül.
8. Amint az ütemező újra futóvá teszi a folyamatot ismételd meg a memória igényt!
9. A laptábla alapján fizikai cím (keret# + offset) előáll. A RAM válaszol a keresett adattal.
Hardverközeli programozás 1 220
Hardverközeli programozás 1 221
0 1 41 1 22 0 -3 0 -4 1 15 0 -6 1 57 0 -8 0 -9 0 -
virtuális címtér (folyamat A)
laptábla(folyamat A)
0 A0
1 A1
2 A2
3 A3
4 A4
5 A5
6 A6
7 A7
8 A8
9 A9
0 B1
1 A4
2 A1
3 B9
4 A0
5 A6
fizikai címtér (RAM)
háttértár
2 157 ? ?Logikai cím Fizikai cím ?Adat
67
lap# keret#offset offset
szabaddátehető
Virtuális memória kezelése
Hardverközeli programozás 1 222
0 0 -1 1 22 0 -3 0 -4 1 15 0 -6 1 57 0 -8 0 -9 0 -
virtuális címtér (folyamat A)
laptábla(folyamat A)
0 A0
1 A1
2 A2
3 A3
4 A4
5 A5
6 A6
7 A7
8 A8
9 A9
0 B1
1 A4
2 A1
3 B9
4
5 A6
fizikai címtér (RAM)
háttértár
2 157 ? ?Logikai cím Fizikai cím ?Adat
67
lap# keret#offset offset
szabaddátehető
Virtuális memória kezelése
Hardverközeli programozás 1 223
0 0 -1 1 22 1 43 0 -4 1 15 0 -6 1 57 0 -8 0 -9 0 -
virtuális címtér (folyamat A)
laptábla(folyamat A)
0 A0
1 A1
2 A2
3 A3
4 A4
5 A5
6 A6
7 A7
8 A8
9 A9
0 B1
1 A4
2 A1
3 B9
4 A2
5 A6
fizikai címtér (RAM)
háttértár
2 157 4 157
67
67
Logikai cím Fizikai cím 67Adatlap# keret#offset offset
Virtuális memória kezelése
Modern architektúrák
Futószalag végrehajtás
Párhuzamos végrehajtás
Szuperskalár és vektor processzorok
Flynn-féle osztályozás
Osztályzás párhuzamosság szempontjából
� SISD (Single Instruction Single Data)
�pl. klasszikus korai egyprocesszoros PC-k
� SIMD (Single Instruction Multiple Data)
�pl. vektroprocesszorok, GPU
� MISD (Multiple Instruction Single Data)
�pl. hibatűrő rendszerek (űrrepülőgép)
� MIMD (Multiple Instruction Multiple Data)
�pl. többmagos- és szuperskalár processzorok
Hardverközeli programozás 1 225
„Klasszikus” architektúrák
In-order (soros) végrehajtás (Neumann)
A hagyományos SISD architektúrán alapuló rendszerek teljesítmény növelésének lehetőségei
� CPU órajel frekvencia növelés
� Közvetlen memória hozzáférés (DMA)
� Gyorsítótár (cache) használat
� Gyorsabb buszrendszer
� Társprocesszor alkalmazás (FPU)
� …Hardverközeli programozás 1 226
�
�
�
Dinamikus órajel szabályozás
Az órajel frekvencia növelés több hő termelését és magasabb fogyasztást jelent (korlátozó tényező)
� Intel Turbo Boost és AMD Turbo CoreEgy mag kaphat gyorsabb órajelet ha a többi mag nem terhelt (azaz határon belüli a hőtermelés)
� Intel SpeedStep és AMD PowerNow!Ha a mag „üresjáratban” van az órajele és a mag feszültsége csökken (energiatakarékosság)
Hardverközeli programozás 1 227
Lebegő pontos egység
� Floating-Point Unit (FPU), matematikai társproc.
�Pl. Intel x87
� Az egész és a lebegőpontos műveletek architekturálisan eltérnek
� Régen társprocesszor, ma CPU-ba integrált
� Külön verem struktúrájú regiszter készlet
�ST0-ST7
� Külön utasításkészlet
�Pl. FADD, FMUL, FDIV, FSQRT, FSIN, …
Hardverközeli programozás 1 228
Utasítás-szintű párhuzamosság
Utasítás-szintű párhuzamosság (ILP) technikái
� Futószalag-elvű végrehajtás (pipeline)
� Sorrenden kívüli végrehajtás (OoOE)
�Regiszter átnevezés
� Spekulatív végrehajtás
�Elágazás becslés
� Szuperskalár végrehajtás
� Nagyon hosszú utasításszó (VLIW) használat
Hardverközeli programozás 1 229
Egy utasítás végrehajtás
� Fetch-execute ciklus
� Minden egyes utasítás végrehajtása több fázisra bontható:
�Utasítás beolvasás (IF)
�Utasítás dekódolás (ID)
�Operandus beolvasás (OF)
�Végrehajtás (EX)
�Eredmény visszaírás (WB)
� Egy utasítás több órajel alatt hajtódik végre
Hardverközeli programozás 1 230
Pipelining
� Futószalag-elvű utasítás végrehajtás
� Több utasítás végrehajtása is folyamatban lehet egyszerre, csak legyenek különböző fázisban
� Egyes processzoroknál akár 30 fázis/utasítás
� Egy utasítás végrehajtási ideje nem csökken
� Viszont az egységnyi idő alatt végrehajtott utasítások száma (áteresztőképesség, throughput) növekszik
� A program gyorsabban lefuthat
Hardverközeli programozás 1 231
Pipelining
Hardverközeli programozás 1 232
CPU idő[órajel]
pipeline fázis
IF ID OF EX WB
1. utasítás 1
2. utasítás 2 utasítás 1
3. utasítás 3 utasítás 2 utasítás 1
4. utasítás 4 utasítás 3 utasítás 2 utasítás 1
5. utasítás 5 utasítás 4 utasítás 3 utasítás 2 utasítás 1
6. utasítás 6 utasítás 5 utasítás 4 utasítás 3 utasítás 2
7. utasítás 7 utasítás 6 utasítás 5 utasítás 4 utasítás 3
8. utasítás 8 utasítás 7 utasítás 6 utasítás 5 utasítás 4
Elméleti utasítás végrehajtási idő: 5 órajel / utasításElméleti áteresztőképesség: 1 utasítás / órajel
Hazárd
� A Neumann-féle szekvenciális végrehajtási elv
� feltételezi, hogy minden utasítás végrehajtás befejeződik a következő megkezdése előtt
� Pipeline processzorokra ez nem igaz
� Hazárd: az a helyzet amikor ez problémát jelent
� Típusai
�Adat hazárd
�Strukturális hazárd
�Vezérlési hazárd
Hardverközeli programozás 1 233
Adat hazárd
� Végrehajtás alatt álló utasítások ugyanazt az adatot használják/módosítják
�RAW (Read After Write, adat függőség)• R3 � R1 + R2• R4 � R3 + R2
�WAR (Write After Read, név függőség)• R3 � R1 + R2• R2 � R1 + R4
�WAW (Write After Write, név függőség)• R3 � R1 + R2• R3 � R4 + R1
Hardverközeli programozás 1 234
Strukturális és vezérlési hazárd
Strukturális hazárd
� Ha a processzor hardvere nem képes az utasításokat egyszerre végrehajtani
� Pl. az egyik utasítás IF fázisban a másik OF fázisban egyszerre címezné a memóriát
Vezérlési hazárd
� Elágazásnál a processzor nem tudja előre hol kell folytatni a vezérlést, azaz melyik utasítást olvassa be a futószalagra
Hardverközeli programozás 1 235
Hazárdok kezelése
� Adat hazárd kezelése�Pipeline buborék
�Operandus/eredmény továbbítás (bypassing)
�Sorrenden kívüli végrehajtás (OoOE)
�Regiszter átnevezés
� Strukturális hazárd�Pipeline buborék
� Vezérlési hazárd�Pipeline buborék
�Elágazásbecslés
Hardverközeli programozás 1 236
Pipeline buborék
� Az IF fázis után ha a vezérlő egység hazárdot észlel beszúr egy NOP utasítást, azaz késlelteti a következő utasítás futószalagra helyezését
� Közben az utasítás előállítja az eredményt, amit a következő utasítás a késleltetés után már be tud olvasni
� Buborék („üresjárat”) a pipline-ban
� Nő a futásidő (de még mindig gyorsabb, mint
pipeline nélkül)
Hardverközeli programozás 1 237
Pipeline buborék
Hardverközeli programozás 1 238
CPU idő[órajel]
pipeline fázis
IF ID OF EX WB
1. ADD r1,r2,r3
2. SUB r4,r5,r1 ADD r1,r2,r3
3. SUB r4,r5,r1 ADD r1,r2,r3
4. SUB r4,r5,r1 ADD r1,r2,r3
5. SUB r4,r5,r1 (buborék) ADD r1,r2,r3
6. SUB r4,r5,r1 (buborék) (buborék)
7. SUB r4,r5,r1 (buborék)
8. SUB r4,r5,r1
Az adatfüggőség két órajelnyi késlekedést okozott
Eredmény továbbítás
� Ez egyik utasítás EX fázisának outputját közvetlenül (a visszaírással egy időben) kössük rá a másik utasítás EX fázisának inputjára
Hardverközeli programozás 1 239
CPU idő[órajel]
pipeline fázis
IF ID OF EX WB
1. ADD r1,r2,r3
2. SUB r4,r5,r1 ADD r1,r2,r3
3. SUB r4,r5,r1 ADD r1,r2,r3
4. SUB r4,r5,r1 ADD r1,r2,r3
5. SUB r4,r5,r1 (buborék) ADD r1,r2,r3
6. SUB r4,r5,r1 (buborék)
7. SUB r4,r5,r1
Sorrenden kívüli végrehajtás
� Out-of-Order Execution (OoOE)
� Az utasítások nem a programban szereplő felírás sorrendjében hajtódnak végre
� Az az utasítás hajtódik végre először amelyiknek hamarabb állnak elő a bemeneti adatai
� A processzor próbálja elkerülni az üresjáratot az utasítások átrendezésével
� Hardveresen gyorsított újrafordítás
� Viszonylag nagy utasítás ablak
Hardverközeli programozás 1 240
Sorrenden kívüli végrehajtás
� Utasítás beolvasása a memóriából
� Az utasítás beáll egy utasítás sorba és vár
� Az utasítássorból az távozik először, akinek elérhetőek az input operandusai
� A távozó utasítás végrehajtásra kerül
� Az eredmény bekerül egy eredmény sorba, vár
� Az adott utasítás eredménye csak akkor kerül ki a sorból (és íródik be a regiszterfájlba), ha minden idősebb utasítás eredménye már kikerült
Hardverközeli programozás 1 241
Regiszter átnevezés
� A név függőség (WAR és WAW hazárd) esetén egy utasítás eredménye felülírna egy még szükséges értéket, mivel nincs korlátlan számú „üres” regiszter
� A regiszter átnevezés révén ez elkerülhető
� Az utasításkészlet az architekturális regiszterfájl elemeire hivatkozik
� Ezt egy speciális áramkör leképezi egy nagyobb méretű hardveres regiszterfájlra
Hardverközeli programozás 1 242
Regiszter átnevezés
Hardverközeli programozás 1 243
r0r1r2r3r4r5r6r7
hw1hw2hw3hw4hw5hw6hw7hw8hw9hw10hw11hw12
átnevező logika
r3 hw8
ADD hw3, hw1, hw2LDR hw4, [hw3]SUB hw8, hw5, hw6STR [hw7], hw8
ADD hw3, hw1, hw2SUB hw8, hw5, hw6LDR hw4, [hw3]STR [hw7], hw8
Arc
hit
ektu
rális
regi
szte
rek
Hard
veres regiszterek
WAR hazárd
Eredeti kód: Átnevezés utáni kód: Átrendezés utáni kód:
WAR hazárd mentes Hazárd mentesRAW hazárd
ADD r3, r1, r2LDR r4, [r3]SUB r3, r5, r6STR [r7], r3
Spekulatív végrehajtás
� Olyan műveletek végrehajtása, amely lehet hogy nem is szükséges
� Ha később kiderül, hogy a művelet nem volt szükséges, akkor az eredményt eldobjuk
� Nincs üresjárat pipeline processzor esetén
� Változatok
�Mohó végrehajtás (pl. elágazásnál mindkét ág
végrehajtása, ha kiderül melyik szükséges azt megtartjuk)
� Jósló végrehajtás (pl. elágazás becslés)
Hardverközeli programozás 1 244
Elágazás becslés
� Feltételes ugró utasításnál melyik a következő utasítás amit be kell tenni a pipeline-ba?
� Külön áramkör próbálja megbecsülni melyik ágat kell majd végrehajtani
� Elkezdődik a jósolt ág végrehajtása
� Ha kiderül, hogy a jóslat hibás a műveletek eredménye visszavonódik, egyébként időt spóroltunk (nem kellett várakozni)
� A pipeline hosszával (akár 30 is lehet) nő az igény a jó elágazásbecslésre
Hardverközeli programozás 1 245
Szuperskalár processzorok
� Órajelenként több utasítás hajtódik végre
� Egy processzor magban több műveleti egység
� ILP és OoOE szekvenciális program esetén
Hardverközeli programozás 1 246
CPU idő[órajel]
pipeline fázisIF ID OF EX WB
1.utasítás 1utasítás 2
2.utasítás 3 utasítás 4
utasítás 1utasítás 2
3.utasítás 5utasítás 6
utasítás 3utasítás 4
utasítás 1utasítás 2
4.utasítás 7utasítás 8
utasítás 5utasítás 6
utasítás 3utasítás 4
utasítás 1utasítás 2
5.utasítás 9
utasítás 10utasítás 7utasítás 8
utasítás 5utasítás 6
utasítás 3utasítás 4
utasítás 1utasítás 2
Vektor processzorok
� A CPU egy utasítást hajt végre egyszerre adatok egydimenziós tömbjén (SIMD)
� Nagy méretű regiszterek használata (több önálló adatot is tárol egyszerre)
� Újabb utasítások bevezetése ezek kezelésére
� Példák�MMX (Intel)
�3DNow! (AMD)
�SSE
�AVX
Hardverközeli programozás 1 247
Vektor processzorok
� Skalár processzor logikaIsmételd 10-szer!
Olvasd be a következ ő utasítást!Olvasd be ezt és azt a számot!Add össze őket!Mentsd el az eredményt!
Ciklusvég
� Vektor processzor logikaOlvasd be az utasítást!Olvasd be ezt a 10 és azt a 10 számot!Add össze őket egyszerre!Mentsd el az eredményeket!
Hardverközeli programozás 1 248
Vektor processzorok
MultiMedia eXtension (MMX)
� 64 bites regiszter (int: 1x64, 2x32, 4x16, 8x8)
� 8 darab (MM0-MM7)
� Alias-ok FPU regiszterekre (konkurenciát okoz)
� 3DNow! (AMD továbbfejlesztés) float-ot is használ
Streaming SIMD Extensions (SSE)
� 128 bites regiszter (float: 4x32)
� 8 vagy 16 darab (XMM0-XMM15)
� 70 új utasítás
Hardverközeli programozás 1 249
Vektor processzorok
SSE2
� 128 bites regiszter (float: 2x64, 4x32; int: 2x64, 4x32, 8x16, 16x8)
SSE3, SSE4
� Újabb utasítások (+13, +47)
Advanced Vector eXtensions (AVX)
� 256 bites regiszter (float)
� 8 vagy 16 darab (YMM0-YMM15)
Hardverközeli programozás 1 250
Vektor processzorok
AVX2
� int és float adatokra is
� Új utasítások
AVX-512
� 512 bites regiszter (int, float)
� 32 darab (ZMM0-ZMM31)
Hardverközeli programozás 1 251
ZMM0 YMM0 XMM0 MM0
64 bit128 bit256 bit512 bitMMXSSEAVXAVX-512
VLIW processzorok
� Very Large Instruction Word
� Olyan speciálisan fordított programot igényel, amely explicit módon jelzi a párhuzamosan végrehajtható utasításokat
� Egy „utasítás” (ún. köteg) több kisebb, de egyszerre végrehajtható utasítást tartalmaz
� Szuperskalár ILP és OoOE
� Egyszerűbb hardver bonyolultabb fordító
� Utód: Explicitly Parallel Instruction Computing
Hardverközeli programozás 1 252
Többmagos processzorok
� Egy integrált áramköri lapon több önálló feldolgozó egység kap helyet
� N mag esetén jobb teljesítmény és kisebb fogyasztás mint N darab egymagos CPU esetén
� Általában saját L1 (esetleg L2) cache, de közös L3
�Cache koherencia probléma
� Párhuzamos szál/folyamat futtatás (MIMD)
�Taszk-szintű párhuzamosság (pl. Java Thread)
�Az operációs rendszernek támogatnia kell
Hardverközeli programozás 1 253
Hyper-threading
� Az Intel SMT (Simultaneous MultiThreading) megvalósítása
� Több szál kezelése magon belül
�Több „állapottároló” processzor elem
�Egy „végrehajtó” elem
� Ha egy szálnak várnia kell, addig fusson a másik
� Minden „fizikai” mag két „logikai” magként viselkedik
� Az operációs rendszer támogatás fontos
Hardverközeli programozás 1 254
Többprocesszoros rendszerek
� Számítógép rendszer több processzorral
� Megosztott (shared) vagy szétosztott (distributed) memória
� Többmagos processzor: speciális megosztott memóriás többprocesszoros rendszer
� Programozás
�OpenMP (shared memory model)
�Open MPI (message passing)
�OGE / SGE (cluster computing)
Hardverközeli programozás 1 255
OpenMP
Open Multi-Processing API
� Osztott memória modell
� Folyamatos fejlesztés 1997 óta
� Támogatott nyelvek: C, C++, Fortran
� Támogatott operációs rendszer: Windows, Linux
� Tartalmaz:
�Fordítási direktívákat
�Könyvtári függvényeket
�Környezeti változókat
Hardverközeli programozás 1 256
OpenMP
� Folyamaton belül párhuzamosan futó szálak
�Egyik szál kitüntetett: master
� Feladat- és adat párhuzamosság
Hardverközeli programozás 1 257
Feladat 1 A B
Feladat 3 A B
Feladat 4 x w
Feladat 5 x w
Feladat 2 A B
futásidőmaster
OpenMP direktívák
#pragma omp parallel
� A következő utasítás fusson több szálon is!
#pragma omp parallel num_threads (4)
� A következő utasítás fusson 4 szálon egyszerre!
#pragma omp parallel private( x,y ) shared( a,b )
� A következő blokkban szereplő változók közülx és y legyen minden szálon egyedia és b legyen minden szálon közös
Hardverközeli programozás 1 258
OpenMP direktívák
#pragma omp parallel for
� A következő for ciklus lépéseit oszd fel a szálak között egyenletesen!
#pragma omp parallel forschedule (guided )
� A következő for ciklus lépéseit oszd fel a szálak között terheléstől függően!
#pragma omp parallel forreduction (+:Sum)
� A következő for ciklus elosztott lefutása után az egyes privát Sum változó értékeket add össze!
Hardverközeli programozás 1 259
OpenMP direktívák
#pragma omp parallel sections
� Hozz létre párhuzamosan futó szakaszokat!#pragma omp section
� A következő blokk legyen az imént létrehozott egyik párhuzamosan futó szakasz!
#pragma omp master
� A következő utasítást csak a master futassa!#pragma omp single
� A következő utasítást csak az egyik szál futassa!
Hardverközeli programozás 1 260
OpenMP direktívák
#pragma omp barrier
� Hozz létre itt egy szinkronizációs pontot! Egyik szál sem mehet addig tovább amíg mindegyik el nem ért idáig.
#pragma omp critical
� A következő utasítás (blokk) alkosson kritikus szakaszt, azaz egyszerre csak egy szál futtathassa ezt a részt (a többiek csak azután hogy ez előző befelyezte). Kölcsönös kizárás.
Hardverközeli programozás 1 261
OpenMP könyvtári függvények
int omp_get _num_procs ()
� Visszaadja az elérhető processzormagok számátint omp_get _num_threads ()
� Visszaadja a szálak aktuális számátvoid omp_set _num_threads ()
� Beállítja hány szálon fussanak a párhuzamos szakaszok
int omp_get _thread _num()
� Visszaadja az adott szál azonosítóját
Hardverközeli programozás 1 262
OpenMP példa// gcc openmp.c -fopenmp#include<stdio.h>#include<omp.h>int IsSame(int *A, int N){
int i, Sum1=0, Sum2=0;#pragma omp parallel for
for(i=0;i<N;i++){// #pragma omp critical
Sum1=Sum1+A[i];}
#pragma omp parallel for reduction(+:Sum2)for(i=0;i<N;i++)
Sum2=Sum2+A[i];return Sum1==Sum2;}
Hardverközeli programozás 1 263
NUMA architektúra
� Non-Uniform Memory Access (nem egységes memória hozzáférés)
� Processzorokhoz saját memória tartozik, de elérheti másik processzor memóriáját is
� A memóriaelérés ideje függ a memória helyétől
� Egyszerre több memóriaművelet is végezhető
Hardverközeli programozás 1 264
CPU
RAM
busz
cso
mó
po
nt
1
CPU
RAM
busz
cso
mó
po
nt
2
összeköttetés
Amdahl törvénye
� N darab processzor (szál) használata nem eredményez N-szeres gyorsulást egy folyamat végrehajtásában
� � � ���
���
�
���
������
ahol S a gyorsulás, T a futásidő és A a futásidő soros végrehajtású hányada0 ≤ A ≤ 1
Hardverközeli programozás 1 265
processzor szám (N)
gyo
rsu
lás
(S)
A=0,1
A=0,2
A=0,5
Grafikus feldolgozó egység
� Graphics Processing Unit (GPU)
� Feladat: textúrák kezelés, képek renderelés, 3D grafika gyorsítás, videó kódolás, …
� Integrált vagy külön videokártya
� Gyártók: nVIDIA és ATI (AMD)
� Egyszerű, kis utasításkészlet
� Nagy számítási kapacitás (párhuzamos, SIMD)
� Saját memóriája lehet
� Csatlakozás: AGP, PCIe VGA, DVI, HDMIHardverközeli programozás 1 266
Általános célú GPU
� General-Purpose GPU (GPGPU)
� A GPU átvesz számításokat a CPU-tól
� Programozás
�OpenCL
�CUDA
�MATLAB
� Accelerated Processing Unit (APU)
�CPU és GPU elemekből felépülő processzor
Hardverközeli programozás 1 267
FPGA
� Field-Programmable Gate Array
� Programozható logikai áramkör
� Újrakonfigurálható rendszer
� Speciális nyelvek: VHDL, Verilog
� Természeténél fogva párhuzamos működés
� Létezik processzorba integrált FPGA
� Szoft-processzor
�FPGA-n implementált processzor architektúra
Hardverközeli programozás 1 268
Intel x86 architektúra
Processzor felépítés
Memóriakezelés
Assembly nyelv
Kezdetek
� Az Intel 1976-78 között fejlesztette ki az „új” Intel 8086 névre hallgató processzorát
� Később ezt fokozatosan tovább fejlesztették� Intel 80186 (1982)
� Intel 80286 (1982)
� Intel 80386 (1986)
� Intel 80486 (1989)
�…, a folyamat máig tart
�Az új processzorok visszafelé kompatibilisek
� Ma a processzorcsaládra x86 néven hivatkozunk
Hardverközeli programozás 1 270
Memória szegmentáció
� A memória részekre van osztva
�Kód szegmens
�Adat szegmens
�Verem szegmens
�Extra szegmens
� A címzést külön regiszterek segítik (CS, DS, SS, ES)
� Címzés: szegmens kezdőcím + eltolás
� Memóriakezelés
�Valós-, védett-, virtuális-, hosszú mód
Hardverközeli programozás 1 271
Memória szegmentáció
� Valós mód
�8086-ban csak ez van
�20 bites címbusz (1MB)
�Szegmens méret 64kB (16 bit)
�Minden memóriacím elérhető korlátozás nélkül
� Ilyen módban indul a processzor
� Lineáris cím = szegmenscím*16 + offset
� Lineáris cím = fizikai cím
Hardverközeli programozás 1 272
Szegmens kezdőcím (16 bit)
Eltolási cím (16 bit)
Lineáris kezdőcím (20 bit)
+
Memória szegmentáció
� Védett mód
�80386 vezeti be
�Korlátozott memóriahozzáférés
�Címtér 32 bites (<= 4GB)
�Virtuális memória támogatás
� Lineáris cím (32) = szegmenscím (32) + offset (16/32)
� Lineáris cím � lapozás � fizikai cím
� Virtuális mód (látszólagos valós mód 80386-tól)
� Hosszú mód (64 bites, nincs szegmentálás)
Hardverközeli programozás 1 273
x86 regiszterkészlet
Hardverközeli programozás 1 274
AH AL
EAX31 15 7 0
EBX
ECX
EDX
ESI SI
EDI DI
EBP BP
ESP SP
CS ESDS FSSS GS
EIP IP
EFLAGS FLAGS
AX
x86 regiszterkészlet
Fő regiszterek (általános célú regiszterek, GPR)
� EAX
�Elsődleges akkumulátor, szorzás, osztás
� EBX
�Akkumulátor, bázis mutató DS-ben
� ECX
�Akkumulátor, (ciklus)számláló
� EDX
�Akkumulátor, input/output, szorzás, osztás
Hardverközeli programozás 1 275
x86 regiszterkészlet
Index regiszterek (általános célú regiszterek, GPR)
� ESI
�Sztring műveletek forrás indexe, DS regiszterrel
� EDI
�Sztring műveletek cél indexe, ES regiszterrel
� ESP
�Verem tetején lévő elemet címzi, SS regiszterrel
� EBP
� Lokális változókhoz, paraméterekhez, SS regiszterrel
Hardverközeli programozás 1 276
x86 regiszterkészlet
Szegmens regiszterek
� CS
�Kód szegmens kezdőcíme, IP ebben címzi az utasítást
� DS
�Adat szegmens kezdőcíme (statikus változók)
� SS
�Verem szegmens kezdőcíme, ESP és EBP használja
� ES, FS, GS
�Extra adat szegmens, EDI alap szegmense az ES
Hardverközeli programozás 1 277
x86 regiszterkészlet
EFLAGS regiszter
� Állapot bitek
� Vezérlő bitek
� Rendszer bitek
Hardverközeli programozás 1 278
31 30 29 28 27 26 25 24
0 0 0 0 0 0 0 0
23 22 21 20 19 18 17 16
0 0 ID VIP VIF AC VM RF
15 14 13 12 11 10 9 8
0 NT IOPL OF DF IF TF
7 6 5 4 3 2 1 0
SF ZF 0 AF 0 PF 1 CF
x86 regiszterkészlet
Utasítás számláló
� IP (Instruction pointer)
�CS regiszter révén a kód szegmensben található utasításokat címzi
�Minden „fetch-execute” ciklus során inkrementálódik az adott utasítás hosszával (kivéve vezérlésátadás)
Egyéb regiszterek
� Vannak további működést segítő regiszterek
� Programozó elől rejtettek
Hardverközeli programozás 1 279
x87 regiszterkészlet
� Lebegőpontos egység (matematikai társprocesszor)
� 8 darab 64 (80) bites regiszter (ST(0)-ST(7))
� Veremszerű működés
� Dupla pontosságú lebegőpontos reprezentáció
� Regiszterenként 2 további bit
� 00 érvényes, 01 nulla, 10 speciális (Inf, NaN), 11 üres
� 16 bites állapot regiszter (pl. OE, UE, ZE, TOS, B, DE)
� 16 bites vezérlő regiszter (pl. RC, PC)
� 48 bites programszámláló és adat mutatóHardverközeli programozás 1 280
x86-64 architektúra
� Visszafelé kompatibilis az x86 (IA-32) architektúrával
� 64 bites általános célú regiszterek (RAX, RBX, RCX, RDX, RBP, RSP, RIP, RSI, RDI, R8-R15)
� 64 bites virtuális címek (implementációban 48)
� 48 bites fizikai címzés (256TB) (bővíthető 52 bitig)
� Nincs memória szegmentáció
� Működési módok
� Long mode, Legacy mode (real, protected, virtual)
Hardverközeli programozás 1 281
Input-Output
� Portra leképezett I/O (PMIO)
� 16 bites I/O címek (0h-FFFFh)
� Külön utasítások (in, ins, out, outs,stb.)
� Egy eszközhöz több port is tartozhat
� Adat, Utasítás, Állapot
� I/O porton elérhető fontosabb eszközök:
� DMA vezérlő, programozható megszakítás kezelő (8259A), időzítő (8254), billentyűzet (8042), valós idejű óra, matematikai társprocesszor, PATA vezérlő, stb.
� Linux: /proc/ioports
Hardverközeli programozás 1 282
Intel szintaxis.intel_syntax noprefix.globl mainmain: push ebp
mov ebp, espsub esp, 16mov DWORD PTR [ebp-16], 2mov DWORD PTR [ebp-12], 3cmp DWORD PTR [ebp-16], 4jne .L2mov eax, DWORD PTR [ebp-12]mov DWORD PTR [ebp-8], eaxjmp .L3
.L2: mov DWORD PTR [ebp-8], 4
.L3: mov eax, DWORD PTR [ebp-8]add esp, 16pop ebpret
Hardverközeli programozás 1 283
Assembly szintaxis
AT&T szintaxis.att_syntax noprefix.globl mainmain: pushl %ebp
movl %esp, %ebpsubl $16, %espmovl $2, -16(%ebp)movl $3, -12(%ebp)cmpl $4, -16(%ebp)jne .L2movl -12(%ebp), %eaxmovl %eax, -8(%ebp)jmp .L3
.L2: movl $4, -8(%ebp)
.L3: movl -8(%ebp), %eaxaddl $16, %esppopl %ebpret
Utasítások
� 8086: 114 utasítás
� 80186: +15 (új és bővített)
� 80286: +17
� 80386: +66
� 80486: +6
� 8087: +83
� 80287: +1
� 80387: +12
� +Pentium, +MMX, +SSE, +AVX, +egyéb (∞)
Hardverközeli programozás 1 284
Operandusok
� Operandusok
�Regiszter (8, 16, 32 bites)
�Konstans (8, 16, 32 bites)
�Memória tartalom
� Memória cím és méret kényszerítésmov al , BYTE PTR [ ebx ]
mov ax , WORD PTR [ ebx ]
mov eax , DWORD PTR [ ebx ]
Hardverközeli programozás 1 285
Címzési módok
� Regiszteres
� Közvetlen adat
� Közvetlen cím
� Közvetett regiszteres
� Regiszter relatív
� Bázisos indexelt
� Bázis+index relatív
� Skálázott
� Szegmens előtag
Hardverközeli programozás 1 286
mov ax, bx
mov ax, 7Fh
mov ax, [1234]
mov ax, [bx]
mov ax, [bx + 100h]
mov ax, [bx + si]
mov ax, [bp + di + 123]
mov ax, [si * 4 +10h]
mov ax, [es:bx]
Címzési módok
Effektív cím (EA) megadás alakjainak összegzése
Hardverközeli programozás 1 287
��:��:!�:
�:
"�:#�:
�$%�&'�(
�)*)�)
!)
�+!+*,
�,�$%�&'�(
�
�)*)�)
!)
�+!+
*,�$%�&'�(
∗
1
248
�$%�&'�(
��1231á'
'�((�
Szegmens szelektor
Bázis Index Skálázófaktor
Eltolás
Példa:mov EAX, [DS:EBP+EDI*4+10h]
vagy ugyanaz más írásmódban:mov EAX, DS:10h[EBP][EDI*4]
Alprogram hívási konvenció
Hívó szabályai
� Paraméterek fordított sorrendben verembe helyezése �Néha adott sorrendben regiszterekbe: edi, esi, edx, …
� Lebegő pontos paraméterek a SSE regiszterekbe(eax-be a float paraméterek száma)
� Alprogram hívás (visszatérési cím a verembe kerül, programszámláló átáll az alprogram kezdőcímére)
� Visszatérés után veremből paraméterek kivétele
� Visszatérési érték az eax regiszterben van
Hardverközeli programozás 1 288
Alprogram hívási konvenció
Hívott szabályai
� Bázis pointer verembe mentés
� Verem mutató mentése bázis pointerbe
� Helyfoglalás lokális változóknak a veremben
� Használandó regiszterek mentése a verembe
� Visszatérési érték az eax regiszterbe tétele
� Mentett regiszterek és verem visszaállítás
� Visszatérés (a veremben lévő címre)
Hardverközeli programozás 1 289
A C nyelv és az assembly
Inline assembly C-ben
� asm(” movl $10, %eax ”);
C forráskód fordítás assembly-re gcc-vel
� gcc -S -masm=intel prog.c
� Kimenet: prog.s
Assembly forráskód fordítás gcc-vel
� gcc prog.s
� Kimenet: a.out
Hardverközeli programozás 1 290
Képernyőre írás lehetőségei.TEXT:.string "This is a text.\n"...
# printf("This is a text.\n");mov eax, 0mov edi, OFFSET FLAT:.TEXTcall printf
# puts("This is a text.\n");mov edi, OFFSET FLAT:.TEXTcall puts
# write(1,"This is a text.\n",16);mov edi, 1mov esi, OFFSET FLAT:.TEXTmov edx, 16call write
# interruptmov eax, 4mov ecx, OFFSET FLAT:.TEXTmov edx, 16int 0x80
Hardverközeli programozás 1 291
Intel 8086
� Megjelenési év 1978
� 16 bites regiszterek
� 20 bites fizikai cím (1MB)
� 5-10 MHz órajel
� 3000nm technológia
� 29 000 tranzisztor
� 40 tűs DIP tokozás
� DMA támogatás
Hardverközeli programozás 1 292
Intel 80386
� Megjelenési év 1986
� 32 bites regiszterek
� 4GB-os címtér
� 12-40 MHz órajel
� 1500-1000nm technológia
� 275 000 – 855 000 tranzisztor
� 132 tűs PGA tokozás
� Cache, virtuális memória kezelés, pipeline
Hardverközeli programozás 1 293
Intel Pentium
� Megjelenési év 1993
� 32 bites regiszterek
� 4GB-os címtér
� 60-300 MHz órajel
� 800-250nm technológia
� 3 100 000 – 4 500 000 tranzisztor
� 273 tűs Socket 4; 321 tűs Socket 7 aljzat
� Szuperskalár, MMX, L2 cache, integrált FPU
Hardverközeli programozás 1 294
Intel Pentium 4
� Megjelenési év 2000
� 32 bites regiszterek
� Mikroarchitektúra: NetBurst
� 1300-3800 MHz órajel
� 180-65nm technológia
� 42 – 188 millió tranzisztor
� Socket 423 vagy Socket 478 aljzat
� SSE3, 20-31 szintű futószalag, elágazásbecslés, HyperThread
Hardverközeli programozás 1 295
Intel Core i7
� Megjelenési év 2008
� 64 bites regiszterek (x86-64)
� Mikroarchitektúra: Nehalem, Sandy Bridge, IvyBridge, Haswell, Broadwell, …
� 45-14nm technológia
� 2-6 mag
� LGA aljzat (1000-2000 kontaktus)
� L3 cache, integrált GPU, AVX-512, integrált NorthBridge
Hardverközeli programozás 1 296
Főbb architektúra családok
� Intel X86 �
� Motorola 68000
� MIPS
� Transmeta
� PowerPC
� ARM
� Microchip PIC
� AVR
Hardverközeli programozás 1 297
MCU
CPU
Motorola 68000
� Régi (1979), de élő� CISC� 16/32 bites� Memory-mapped I/O� 14 címzési mód, 5 adattípus, 56 utasítás� 7 szintű megszakítási rendszer � Alkalmazás: Apple Macintosh, Sega Mega Drive,
Comodore Amiga, SG és Sun munkaállomás, PLC
MOVE.W D1, (A1) ;move 2 bytes from D1 to theaddress stored in A1
Hardverközeli programozás 1 298
MIPS
� RISC� 32/64 bites� 5 fokozatú pipe-line végrehajtás� OoOE, SIMD, szuperskalár� több szintű cache� Alkalmazás: PlayStation 2 és Nintendo 64
játékkonzolok, CISCO routerek,
lw $t1, ($t0) #move 2 bytes from the addressstored in t0 to t1
Hardverközeli programozás 1 299
Transmeta Crusoe
� Alacsony fogyasztás� Szoftveres ISA
�X86 kompatibilitás�Akár Java bájtkód futtatás
� VLIW (128bit)� Megjelenés: 2000� Többszintű cache� Utód: Efficeon� Alkalmazás: tablet-ek, laptop-ok
Hardverközeli programozás 1 300
PowerPC
� Fejlesztő: Apple+IBM+Motorola
� RISC
� 32/64 bites
� Szuperskalár
� Futásidőben állítható little-endian/big-endianbájtsorrend
� Alkalmazás: Xbox 360, Nintendo Wiili 3, 0(5) ;move data from the address stored
in register 5 to register 3
Hardverközeli programozás 1 301
ARM
� RISC� 32/64 bites� Akár 13 fokozató pipeline, SIMD, szuperskalár� Prioritásos megszakításkezelés� Egységes 32 bites utasítások� Feltételes utasítás-végrehajtás� Alkalmazás: Raspberry Pi, iPhone 6 és egyéb
okostelefonok, (2013-ban 10 milliárd új CPU)LDR R8, [R0] ;move data from the address
stored in R0 to R8
Hardverközeli programozás 1 302
Microchip PIC
� Mikrokontroller� (Módosított) Harvard architektúra� RISC� 8/12/14/16 bites� 1 általános munkaregiszter (W)� Nincs különbség adatmemória és regiszter között
�Pl.: a PC és egyéb regiszterek memóriára vetítve
MOVLW d’29’ ;move decimal 29 into W
Hardverközeli programozás 1 303
Atmel AVR
� Mikrokontroller� (Módosított) Harvard architektúra� RISC� 8/32 bites� 32 általános 8 bites munkaregiszter (R0-R31)� Saját beépített memória (SRAM, Flash)
�Címtér: regiszterfájl + memória
� Alkalmazás: Arduino
ldi r16, 0xF1 ;load hexadecimal 0xF1 to r16
Hardverközeli programozás 1 304
High-Performance Computing
HPC - Top 1 Magyarországon (2015)
� Leo (Szilárd Leo után)
� Debrecen, DE Kassai úti campus
� 197,2 TFLOPS számítási kapacitás
� 462 Intel Xeon E5-2650 (2.6GHz)
� 3696 mag
� 10500 GB memória
� Kb 8000 TB háttértár
� 2 000 000 000 HUF
� Top500: 308. helyezés
Hardverközeli programozás 1 305
High-Performance Computing
HPC - TOP 1 (2015)
� Tienhe-2 (Tejút 2)
� Kína, Guangzhou
� 33,86 PFLOPS számítási kapacitás
� 32 000 Intel Xeon (2.2GHz) + 48 000 Xeon Phi
� 3 120 000 mag
� 1 375 000 GB memória
� 12 400 000 TB háttértár
� 390 000 000 USD
� 17,6 MW fogyasztás (+6,4MW a hűtőrendszer)
Hardverközeli programozás 1 306
Ajánlott irodalom
� Andrew S. Tanenbaum: Számítógép architektúrák, Panem, 2006
� Kovács György: Számítógép architektúrák, DE AMTC AVK, 2007
� Budai Attila: Mikroszámítógép-rendszerek, LSI Oktatóközpont, 2000
� Joseph Cavanagh: X86 Assembly Language and C Fundamentals, CRC Press, 2013
� Richard Blum: Professional Assemby Language, Wiley, 2005
� Nicholas Charter: Computer architecture, McGraw-Hill, 2001
� …
Hardverközeli programozás 1 307
Hardverközeli programozás 1 308
Köszönöm a figyelmet!
Sikeres felkészülést!