otodik generacios processzorok_pentium
TRANSCRIPT
Tartalomjegyzék
Tartalomjegyzék
Tartalomjegyzék...............................................................................3
1.fejezet: Kompatibilitás az x86-os architektúrákkal ...................10
1.1. Hardware kompatibilitás ........................................................10 1.1.1. Software kompatibilitás ..................................................10
1.2. Konkurens ötödik generációs x86-kompatibilis architektúrák ...........................................................................12
1.2.1. Az INTEL Pentium processzora .....................................12 1.2.1.1. INTEGER egység ...................................................13 1.2.1.2. Cache-ek, memória kezelés.....................................15 1.2.1.3. Programág előrejelzés .............................................17 1.2.1.4. Beépített lebegőpontos egység................................18 1.2.1.5. "Bogaras" a koprocesszor ?.....................................19 1.2.1.6. Sebességnövelő technikák a Pentium osztályú
számítógépeknél.....................................................19 1.2.1.7. Multiprocesszoros rendszerek.................................22 1.2.1.8. Adatvédelem ...........................................................23
1.2.2. A Cyrix M1-es processzor családja ............................24 1.2.2.1. Pipeline vagy szuperpipeline ?................................24 1.2.2.2. 32 regiszter jobb mint 8 ! .......................................26 1.2.2.3. Csökkentett függőség - nagyobb sebesség..............28 1.2.2.4. Kiegyénített terhelés -gyorsabb programfutás .......29 1.2.2.5. Kiugrás lehetősége a végrehajtási sorrendből.........29
1.2.3. A NexGen Nx 586-os processzor családja ....................31 1.2.3.1. Hogyan lehet RISC processzorból CISC avagy
fából vaskarika ? ....................................................31 1.2.3.2. x86 - RISC86 ..........................................................33 1.2.3.3. Szuperskalár végrehajtás-javuló hatásfok...............35 1.2.3.4. Az utasítás-előrejelzési CACHE (BPC)..................35 1.2.3.5. Cache hierarchia......................................................36
2. fejezet: Processzor erőforrások...................................................39
Landmark 2.00...............................................................................40 CHECKIT 3.0................................................................................43 MIPS 1.20: (MIPS)........................................................................46
3
Tartalomjegyzék
CPUTEST 1.1 (MIPS)...................................................................48
3. Fejezet: Általános CPU programozási információk .................62
3.1. A memória felépítése..............................................................62 3.1.1. Nemszegmentált vagy "lapos" modell ............................63 3.1.2. Szegmentált modell ........................................................64
3.2. Regiszterek .............................................................................65 3.2.1. Általános regiszterek ......................................................65 3.2.2. Szegmensregiszterek.......................................................67 3.2.3. Utasításmutató ................................................................69 3.2.4. A verem felépítése és használata ....................................69 3.2.5. Flagregiszter ...................................................................70
3.2.5.1. Állapotbitek.............................................................71 3.2.6 Rendszer-regiszterek........................................................73
3.2.6.1. Rendszer-flagek ......................................................74 3.2.6.2. Vezérlőregiszterek .................................................77 3.2.6.3. Nyomkövető regiszterek .........................................82
3.3. CPU üzemmódok....................................................................84 3.3.1. Valós üzemmód ("valós mód").......................................84 3.3.2. Védett üzemmód.............................................................84 3.3.3.Rendszermenedzselő üzemmód.......................................84
3.4. Inicializálás és az üzemmódok közötti átkapcsolás ...............86 3.4.1. A processzor inicializálása .............................................86
3.4.1.1. A processzor állapota reszetelés után .....................87 3.4.1.2. Az első végrehajtott utasítás ...................................90 3.4.1.3. A cache engedélyezése............................................91
3.4.2. Software inicializálás valós üzemmódban......................92 3.4.2.1. Rendszertáblázatok .................................................92 3.4.2.2. Az NMI megszakítás...............................................92
3.4.3. Software inicializálása védett üzemmódban...................93 3.4.3.1. Rendszertáblázatok .................................................93 3.4.3.2. Megszakítások.........................................................94 3.4.3.3. Lapozás ...................................................................94 3.4.3.4. Taszkok ...................................................................96 3.4.3.5. A TLB, BTB és cache tesztelése.............................97
3.4.4. Üzemmódváltás ..............................................................97 3.4.4.1. Átkapcsolás védett módba ......................................97 3.4.4.2. Visszakapcsolás valós üzemmódba ........................98
4
Tartalomjegyzék
3.4.5. Példa inicializálásra és üzemmód átkapcsolásra.............99 3.4.5.1. A példa célja............................................................99 2.4.5.2. A memória elrendezése a reset-elést követően .......100 3.4.5.3. Az algoritmus..........................................................100 3.4.5.4. Eszközök használata ...............................................102 3.4.5.5. A STARTUP.ASM listája.......................................104 3.4.5.6. A MAIN.ASM forráskódja .....................................113 3.4.5.7. Állományok támogatása..........................................116
3.5. A valós üzemmód felépítése, működése ................................119 3.5.1. Címek lefordítása............................................................119 3.5.2. Regiszterek és utasítások ................................................120 2.5.3. Megszakítás és kivétel kiszolgálás ................................121 3.5.4. Valós üzemmódú kivételek.............................................122
3.6. A Védett üzemmód felépítése, működése ..............................124 3.6.1. Memóriaszervező regiszterek. ........................................125 3.6.2. Rendszer utasítások ........................................................126 3.6.3. Védett üzemmódú memóriaszervezés ............................128
3.6.3.1 A szegmentálási modell kiválasztása.......................131 3.6.3.1.1. A sík modell ....................................................131 3.6.3.1.2. Védett sík modell ............................................133 3.6.3.1.3. Multiszegmens modell ....................................134
3.6.3.2. Szegmensfordítás ....................................................136 3.6.3.2.1. Szegmensregiszterek .......................................138 3.6.3.2.2. Szegmensszelektorok ......................................139 3.6.3.2.3. Szegmens deszkriptorok..................................141 3.6.3.2.4. Szegmensdeszkriptor-táblázatok.....................148 3.6.3.2.5. Deszkriptortáblázat bázisregiszterek...............149
3.6.3.3. Lapfordítás ..............................................................150 3.6.3.3.1. Lapozási opciók...............................................151 3.6.3.3.2. Lineáris cím.....................................................152 3.6.3.3.3. Laptáblázatok ..................................................152 3.6.3.3.4. Laptáblázat bejegyzések..................................153 3.6.3.3.5. Lapkeret cím....................................................154 3.6.3.3.6. A Present (betöltött, jelenlevő) bit ..................154 3.6.3.3.7 Hozzáfért (accessed) és "piszkos" (dirty)
bitek.................................................................156 3.6.3.3.8. Írás/olvasás illetve felhasználó/felügyelő
bitek.................................................................156
5
Tartalomjegyzék
3.6.3.3.9. Lapszintű cache-vezérlő bitek.........................157 3.6.3.3.10. Fordítási segédpufferek .................................157
3.6.3.4. Szegmens- és lapfordítás keverése..........................158 3.6.3.4.1. A sík modell ....................................................158 3.6.3.4.2 Több lapot átfogó szegmensek.........................159 3.6.3.4.3. Több szegmenst átfogó lapok..........................159 3.6.3.4.4. Nem illeszkedő lap- és szegmenshatárok........159 3.6.3.4.5. Illeszkedő lap- és szegmenshatárok ................159 3.6.3.4.6. Egy laptáblázat elhelyezése
szegmensenként...............................................161 3.7. Védelemi mechanizmusok......................................................162
3.7.1. Szegmens szintű védelem ...............................................162 3.7.2. A szegmens deszkriptorok és a védelem ........................163
3.7.2.1. Típusellenőrzés .......................................................164 3.7.2.2. Határ (limit) ellenőrzés ...........................................167
3.7.3. Privilégium szintek .........................................................169 3.7.4. Az adathozzáférések korlátozása....................................171
3.7.4.1. Kódszegmensekbeli adatok elérése.........................173 3.7.5. Vezérlésátadások korlátozása .........................................174 3.7.6. Kapudeszkriptorok..........................................................176
3.7.6.1. Veremváltás ............................................................181 3.7.6.2. Visszatérés egy procedúrából .................................185
3.7.7. Az operációs rendszer számára lefoglalt utasítások .......188 3.7.7.1. Privilegizált utasítások ............................................188 3.7.7.2. Érzékeny utasítások.................................................189
3.7.8. Mutatók érvényességét ellenőrző utasítások ..................189 3.7.8.1. Deszkriptor érvényességének ellenőrzése...............192 3.7.8.2. Mutatók integritása és az RPL ................................193
3.7.9. Lapszinti védelem...........................................................194 3.7.9.1. A laptáblázat bemenetek által tartalmazott
védelmi paraméterek..............................................194 3.7.9.1.1. A megcímezhető tartományt érintő
megszorítások..................................................195 3.7.9.1.2. Típusellenőrzés................................................196 3.7.9.1.3. A védelem kombinálása a laptáblázatok
mindkét szintjén ..............................................197 3.7.9.1.4. A lapvédelem fölülírói ....................................197
3.7.9.2. Lap- és szegmensvédelem kombinálása .................198
6
Tartalomjegyzék
3.8. Védett üzemmódú multitaszking............................................200 3.8.1. Taszk-állapot-szegmens.................................................201 3.8.2. A TSS deszkriptor...........................................................204 3.8.3. Taszkregiszter .................................................................205 3.8.4. Taszk kapudeszkriptorok ................................................208 3.8.5. Taszkkapcsolás ...............................................................209 3.8.6. Taszkok visszafelé kapcsolása (LINKING) ...................214
3.8.6.1. A Busy (foglalt) bit megelőzi a hurkok kialakulását ............................................................216
3.8.6.2. A taszk visszakapcsolások módosítása ...................217 3.8.7. Taszkok címtartománya..................................................218
3.8.7.1. Taszkok által lineárisról- fizikai címre végzett leképzés..................................................................218
3.8.7.2. A taszkok logikai címtartománya ..........................219 3.9. Védett üzemmódú kivételek és megszakítások ......................222
3.9.1. Kivétel- és megszakításvektorok ...................................223 3.9.2. Utasítások újraindítása....................................................225 3.9.3. Megszakítások engedélyezése és letiltása .....................225
3.9.3.1. További NMI megszakítások maszkolása..............226 3.9.3.2. INTR megszakítások maszkolása ..........................226 3.9.3.3. Debug hibák maszkolása az RF bit segítségével ....227 3.9.3.4. Egyes kivételek és megszakítások maszkolása.......228
3.9.4. Szimultán kivételek és megszakítások közötti prioritás........................................................................228
3.9.5. A megszakításdeszkriptor-táblázat .................................230 3.9.6. IDT deszkriptorok...........................................................231 3.9.7. Megszakítás taszkok és megszakítás-kezelő
procedurák ...................................................................233 3.9.7.1. Megszakítás-kezelő procedúrák..............................233
3.9.7.1.1. A megszakítás-kezelő eljárás verme ..............234 3.9.7.1.2. Visszatérés egy megszakítás-kezelő
eljárásból .........................................................235 3.9.7.1.3. A megszakítás-kezelő eljárás flag-
használata ........................................................236 3.9.7.1.4. Védelem a megszakítás-kezelő
eljárásokban.....................................................236 3.9.7.2. Megszakítás-kezelő taszkok....................................237
3.9.8. Hibakódok.......................................................................239
7
Tartalomjegyzék
3.9.9. Kivétel feltételek............................................................240 3.9.9.1. 0-s számú megszakítás - Osztáshiba (Divide
Error)......................................................................241 3.9.9.2. 1-es számú megszakítás - Debug kivétel ................241 3.9.9.3. 3-as számú megszakítás - Töréspont
(Breakpoint) ...........................................................241 3.9.9.4. 4-es számú megszakítás - Túlcsordulás
(Overflow) .............................................................242 3.9.9.5. 5-ös számú megszakítás - Határsértés (Bounds
Check) ....................................................................242 3.9.9.6. 6-os számú megszakítás - Érvénytelen utasítás
(Invalid Opcode) ....................................................243 3.9.9.7. 7-es számú megszakítás - nem elérhető eszköz
(Device Not Available)..........................................243 3.9.9.8. 8-as számú megszakítás - Kettős hiba, dupla
hiba (Double Fault) ................................................244 3.9.9.9. 9-es számú megszakítás - (az Intel által
fenntartott, használata nem ajánlott)......................246 3.9.9.10. 10-es számú megszakítás - Érvénytelen TSS
(Invalid TSS)..........................................................246 3.9.9.11. 11-es számú megszakítás - Szegmens nincs
jelen, (Segment Not Present) .................................247 3.9.9.12. 12-es számú megszakítás - verem kivétel
(Stack Exception)...................................................249 3.9.9.13. 13-as számú megszakítás - Általános védelmi
hiba (General Protection).......................................250 3.9.9.14. 14-es számú megszakítás - Laphiba (Page
Fault) ......................................................................252 3.9.9.14.1. Taszkkapcsolás alatti laphiba ........................253 3.9.9.14.2. Laphiba összeférhetetlen veremmutatóval ....254
3.9.9.15. 16-os számú megszakítás - Lebegőpontos egység hiba, Floating-Point Error) ........................255
3.9.9.15.1. Numerikus kivételek kezelése.......................257 3.9.9.15.2. Szimultán kivételekre adott válaszok............258
3.9.9.16. 17-es számú megszakítás - Illeszkedés ellenőrzés ellenőrzési hiba (Alignment Check) .....259
3.9.9.17. 18-as számú megszakítás - Processzortípus ellenőrzés (Machine Check) ..................................261
8
Tartalomjegyzék
3.9.10. A kivételek összefoglalása............................................261 3.9.11. Hibakódok összefoglalása ............................................263
3.10. Rendszermenedzselő üzemmód...........................................264 3.10.1. Az SMI megszakítás .....................................................265 3.10.2. Az SMM kezdeti állapota .............................................267
3.10.2.1. Az SMM végrehajtása...........................................268 3.10.3. Az SMRAM processzor-állapot tároló formátuma.......269
3.10.3.1. Az SMM revízió-azonosító (FEFCH ofszet) ........271 3.10.3.2. I/O trap-újraindítás (FF00H ofszet) ......................272 3.10.3.3. Felfüggesztett állapotból való automatikus
újraindítás (FF02H ofszet) .....................................273 3.10.3.4. Az állapottároló bázisa (FEF8H ofszet)................273
3.10.4. Az SMRAM relokációja ...............................................274 3.10.5. Visszatérés az SMM-ből...............................................275
3.11. 8086-os virtuális üzemmód ..................................................276 3.11.1. 8086 CPU kód végrehajtása..........................................277
3.11.1.1. Regiszterek és utasítások ......................................277 3.11.2.1. Lapozás a 8086-os virtuális taszkok esetében ......278 3.11.2.2. Védelem egy 8086-os virtuális taszkon belül .......279
3.11.3. Belépés a 8086-os virtuális üzemmódba és az abból való kilépés ........................................................279
3.11.3.1. Taszkátkapcsolások általi tranzíciók.....................282 3.11.3.2. Átmenet trap- és megszakításkapukon
keresztül .................................................................282 3.11.4. Érzékeny utasítások ......................................................285 3.11.5. Virtuális megszakítások támogatása.............................286 3.11.6. A 8086 operációs rendszerhívások emulációja.............286 3.11.7. Virtuális I/O ..................................................................287
3.11.7.1. I/O-ra leképezett I/O .............................................288 3.11.7.2. Memóriába leképezett I/O.....................................288 3.11.7.3. Különleges I/O pufferek........................................289
3.11.8. Különbségek a 8086 CPU-hoz képest ..........................289 3.11.9. Különbségek a 286 CPU-hoz képest ............................294
3.11.9.1. Privilégiumszint ....................................................294 3.11.9.2. A busz lezárása......................................................295
3.11.10. Különbségek a 386 és 486 CPU-hoz képest ...............296
Ábra- és példajegyzék ......................................................................297
9
Tartalomjegyzék
Előzetes a második kötet tartalmából ............................................301
10
Hardware kompatibilitás
1.fejezet: Kompatibilitás az x86-os architektúrákkal
1.1. Hardware kompatibilitás Az INTEL a Pentium processzort (80502, 80503) úgy tervezte, hogy a már meglévő x86-os architektúrákkal "felülről" kompatibilis legyen. A gyártók közötti hardware kompatibilitásra kár lenne szót vesztegetni, ugyanis a hardware felépítés szükségképpen elkell hogy térjen, a jogi viták elkerülése miatt. Azonban a fejlesztőknél, és a gyártóknál (bízzunk benne hogy nem csak ez) nem ez a fő szempont. Szeretnének minél gyorsabb, és hatékonyabb típusokat kifejleszteni e gyorsuló számítástechnikai piac korlátlan "számítási éhségének" kielégítése érdekében. 1.1.1. Software kompatibilitás Nagyon lényeges kérdés azonban a software kompatibilitás. A software kompatibilitás megőrzése érdekében az alkalmazások fejlesztésekor szemelőtt kell azokat a bit-eket, Byte-okat amelyek különböző hardware architektúrák esetén változhatnak. Erre a sokféle processzor verzió, és chip-gyártó miatt kell ügyelnünk. Az ötödik generációs x86 kompatibilis processzorok gyártása terén sok gyártó és fejlesztő indult csatába. Minden egyes processzornál a kompatibilitás kérdését külön meg kell vizsgálni. Ma már vannak neves cégek, amelyek csak ezen kérdések vizsgálatára kötelezték el magukat, pl.: az XXCAL laboratórium. A továbbiakban ezen nemzetközileg elismert "laborcégek" vizsgálati eredményeire, vagy a software fejlesztőjének kompatibilitási nyilatkozatára fogunk hivatkozni. Számos regiszter és memóriaszerkezet leírásakor egyes bitek "fenntartott"-ként vannak jelölve. Abban az esetben, amikor egy bit meghatározatlannak vagy fenntartottnak van jelölve, alapvető követelmény az, hogy az jövőbeni processzorokkal való kompatibilitás érdekében a software ezeket a biteket úgy kezelje, mintha a jövőben (bár ismeretlen) hatásuk lenne a processzor működésére. A fenntartott bitek
11
Kompatibilitás az x86-os architektúrákkal
működését célszerű nemcsak meghatározatlannak, hanem kiszámíthatatlannak is tekinteni. Ajánlatos, hogy a fenntartott biteket figyelembe vevő software kövesse a következő irányvonalakat: − A fenntartott biteket tartalmazó regiszterek tesztelésének eredménye
ne függjön az említett bitek állapotától. Ezért tesztelés előtt ezeket a biteket maszkolni kell.
− A memóriába vagy regiszterbe való tárolás ne függjön egyetlen
fenntartott bit állapotától sem. − Ne alapozzunk a fenntartott bitekben tárolt információ
visszanyerésének lehetőségére. − Egy regiszter feltöltésekor a fenntartott biteket mindig a
dokumentációban közölt értékekkel töltsük fel. Ha ez nincs feltüntetve, akkor vissza kell tölteni az előzőleg onnan kiolvasott értékeket.
12
Hardware kompatibilitás
1.2. Konkurens ötödik generációs x86-kompatibilis architektúrák 1.2.1. Az INTEL Pentium processzora Az X86-os család legfiatalabb tagja a Pentium processzor, amelyet az INTEL úgy tervezett, hogy "lefelé" 100 %-ban kompatibilis legyen az X86-os család előző tagjaival.
Hardware-es
Utasítás-elôrejelzés
64 bites
Kód-cache
Busz interface
PrefetchBuffer-ek
Adat-cache
Regiszterkészlet
Hardware-esszorzás
Hardware-es
osztásHardware-es
összeadás
FPUALU ALU
Pipeline-olt
32 bit64 bit
64 bit
64 bit
: A Pentium processzor blokkvázlata
uperskalár architektúrával épül föl, tehát tt egynél több utasítást tud végrehajtani.
egységgel, a processzorlapkára integrált külön
32 bit256 bit
64 bit
256 bit 256 bit
32 bit 32 bit
32 bit 32 bitIntegerEgység
64 bit
1.1. ábra
or sz A Pentium processz
laegyetlen órajel ciklus aBeépített lebegőpontos
13
Konkurens ötödik generációs architektúrák
kód- és write-back adatcache-sel,
ián működő Intel486 chip-ez képest.
ine öt utasítás végrehajtási zintre tagozódik:
−− Címgenerálás
− Végrehajtás − WriteBack Utasítások elő-betöltése (Instruction Prefetch): Az utasítások kódjának a magasabb címekről történő előzetes beolvasása a
64 bit-es külső adatbusszal, az újabb 90-100MHz-es típusok integrált MP (Multi Processor) vezérlővel rendelkeznek. 1.2.1.1. INTEGER egység A Pentium processzor szíve a két beépített utasítás pipeline, amelyek egymástól függetlenül működnek. Ezek a pipeline-ok teszik képessé a Pentium processzort, hogy egy óraciklus alatt két integer utasítást végrehajtson. Ez közel kétszeres chip sebességet jelent az azonos frekvench A Pentium processzor pipeline-jai azonosak az Intel486 CPU egyszerű pipeline-jával, de magasabb sebességhez optimalizálták őket. Mindegyik pipels
Prefetch Utasítás dekódolás
−
U VPipeline Pipeline
Utasításdekódolás
Cím Címgenerálás generálás
Végrehajtás Végrehajtás
Write-Back Write-Back
Utasításdekódolás
PREFETCH
1.2. ábra: Az INTEGER egység
14
Az INTEL Pentium processzora
processzorba, a végrehajtást megelőzően; az utasítások végrehajtásának tfedésére használt technika. Amikor egy utasítás a prefetch-ből az á
utasításdekóderbe kerül, a pipeline kész egy másik, új utasítás végre-hajtásának elkezdésére. Sok esetben a Pentium processzor két utasítást is el tud végezni egyszerre - egy utasítást mindegyik pipeline-ban - ez a módszer "utasítás párosítás" néven ismert. A párosítás feltétele, hogy mindkét utasításnak "egyszerűnek" kell lennie. Mindegyik pipeline saját ALU-val (aritmetikai logikai egység), címgeneráló egységgel, és adatcache interface-szel rendelkezik.
VÉGREHAJTÓ EGYSÉG
MIKROKÓD ROMSZEKVENCIA
VEZÉRLÔ
LIMIT
EGYSÉG EGYSÉG EGYSÉG EGYSÉG
SZORZÓ ÖSSZEADÓ ELTOLÓ REG.
KÉSZLET
UTASÍTÁSDEKÓDER
UTASÍTÁS
SOR
VEZÉRLÉS
CÍMEKROM
BRANCH VEZÉRLÉS
VEZÉRLÉS
PIPELINE BELSÔ
ADATBUSZ
BYTE MUX. ÉSADATBUSZMEMÓRIA
I/O REGISZTEREK
MEMÓRIAMANAGER
1.3. ábra: A PIPELINE-ok belső felépítésének blokkvázlata
15
Konkurens ötödik generációs architektúrák
1.2.1.2. Cache-ek, memória kezelés Az előbb említett cache egységek 8 kByte kapacitásúak, és az egyik csak adatokat, a másik csak utasításokat tárol. Az előbb említett cache-ek kétutas csoport-asszociatív szervezésűek és támogatják a direct-map eljárást. A csoport-asszociatív szervezés a cache-felépítés olyan formája, mely egy adattömb helyét a főmemóriában leszűkíti ugyan, de ennek helye a cache-ben nincs teljes mértékben meghatározva. A csoport-asszociatív felépítés a közvetlen leképezést megvalósító felépítés
elyben a főmemória egy adott címének csak egyetlen hely felelhet meg cache-ben), és a teljes mértékben asszociatív felépítés (mely az adatot a
melyik részéből a cache bármelyik részébe helyezheti) közt ké rom n z e l i, hogy főmemória a ott címéről az adat n helyen legyen cache-elve, mely bárhol lehet a cache-ben. A cache-vonalak 32 Byte-os (256 bit) szervezésűek, így a cache áramköröknek elég csak 2* 32 Byte-os vonalon keresni adatot a teljes cache helyet. Ezen 32 Byte-os vonalak (a 486DX-ben csak 16 Byte-os vonalak vannak) segítségével épül fel a Pe cesszor 6 bit széles bus a.
proces ak adat-, utasítástárolásra van szüksége és a c teljesen fel van töltve, akkor a legrégebben használt
elhagyja, és az így teremtett üres helyet az aktuális inform cióval írja fel l. Az adatcach -nek két van - m degyik pipe z eg og ikl t k űvelet is feltudja használni ugyanazt az adatot. Ha az adat már éppen kikerül az adatcache-ből (és csak akkor), a processzor visszaírja az adatot a fő memóriába. Ez a technika WRITE-BACK cache kezelés
n
p oáltal cache-elt adatot próbál elérni.
(mafőmemória bár
pez komp isszumot. Egy "n-szerese csoport-ass ociatív" cachehetővé tesz a d
ntium pro
Ha a ache már
információkat
4 z
szorn vagy
á ü e interface-ey egy órac
inuson belül kéline-ho
ülönböző my-egy, amely azt biztosítja, h
néven ismert. Abban az esetben ha a processzor az adatot egyidejűleg a főmemóriába és a cache-be is beírja (a Pentium processzor dinamikusan támogatja a Write-Through cache kezelést), WRITE-THROUGH cache kezelésről beszélhetünk. A fent említett eljárások biztosítják a főmemória s a cache konzisztenciáját. (A konzisztencia különöseé
multiprocesszoros rendszerekben fontos, és azt biztosítja hogy a r cesszor ne helytelen értéket kapjon meg, amikor egy másik processzor
Ha a cache-elt adatot megváltoztatja,
16
Az INTEL Pentium processzora
akkfelh koll
ESI szabványként ismert. (MESI= Modified, Exclusive, Shared,
vonalaproempro Ca
á
or mindegyik másik processzornak a megváltoztatott adatokat kell asználnia.) Az előbbiekben tárgyalt cache-konzisztencia proto
MInvalid). A szabvány 4 állapotot definiál, amelyek mindegyike a cache
alaihoz van rendelve, a CPU által ezen a vonalon végrehajtott művelet pján. Multiprocesszoros rendszerekben sokszor előfordul, hogy több cesszornak egyidőben van szüksége ugyanarra az adatra. Ha a fent lített protokoll szabályait betartjuk a multiprocesszoros konzisztencia blémát is megoldottnak tekinthetjük.
che-vonal llapota
M módosított
E kizárólagos
S megosztott
I érvénytelen
Ezvonal igen igen
igen
nem
a cache-
érvényes ? Az adat
másolata ...
nem aktuális
érvényes
érvényes
-- Az adat
megtalálható
egy m
ásik processzor
cache-ében ?
nem nem talán talán
Írás a
vonalra ...
nem megy ki
a buszra
nem megy ki
a buszra
kimegy a buszra és frissíti a cache-t
közvetlenül kimegy a
buszra
1.4. ábra: Cache-vonal állapotai a MESI protokoll szerint
nnak meghatározására, hogy egy írásművelet soráA n mikor kell a memóriát felfrissítse, a cache egy adott 'frissítési stratégiát' kell
hatással az olvasásműveletekre.) ssítési stratégiák a következők:
− Átírás (write-through) - A cache-vonalba való írásigény esetén mind a cache-memória, mind a főmemória frissítésére sor kerül. Az átírás
főhasználjon. (A frissítés stratégiája nincs A Pentium processzor által támogatott fri
17
Konkurens ötödik generációs architektúrák
has
zaírás (write-back) - A cache-vonalba való írásigény csak a cache-memóriát frissíti fel. A visszaírás-stratégia csökkenti a busz
che konzisztenciáját fenntartó mechanizmusok is kiválthatják.
A külön adat- és utasításcache előnye, hogy kizárja az tasításbetöltés és az adatelérés konfliktusának létrejöttét. Az említett onfliktus akkor jöhet létre, ha pl. az egyik pipeline prefetch állapotban
ache-ből - egy adathoz szeretne hozzájutni és ugyanazokat a chevonalakat egyidőben akarják használni. A különbontott cache-ek
znos például a grafikus pufferek esetében, ahol ahhoz hogy az adat a grafikus képernyőn megjelenjen, frissíteni kell a főmemóriát is.
− Viss
forgalmát, a szükségtelen memória-írások kiküszöbölése által. A cache-vonalakba való írások nem továbbítódnak azonnal a főmemóriába, hanem a cache-ben gyűlnek össze. A megváltoztatott cache-vonalak később, a visszaírási művelet végrehajtásakor kerülnek a főmemóriába. A visszaírási műveleteket általában a cache-vonalak felszabadításának szükségessége váltja ki, például amikor a már teljesen betelt cache-ben szükség van egy új vonal lefoglalására. A visszaíró műveleteket a ca
A processzor lehetővé teszi, hogy bármely memóriaterület bármelyik stratégia segítségével kezelhető legyen. Mind a software, mind a hardware kézben tarthatja a vezérlést a használt stratégia felett; a software a laptáblázatok bejegyzéseinek PWT bitje, míg a hardware a WB/WT# jel segítségével. A Pentium processzor belső cache-ei együtt használhatók a külső cache-ekkel, melyek működhetnek átíró, visszaíró vagy mindkét módban. ukvan és utasítást tölt be a cache-ből, miközben a másik pipeline - szintén a ccabiztosítják a két hozzáférési művelet párhuzamosságát. 1.2.1.3. Programág előrejelzés
18
Az INTEL Pentium processzora
A cache egységBTB-t sem. (Branch Tcache, amely a dinamiktárolja. Az utasítás-előinformációk segítségévsebességgel lehet hasznkeresztül lehet igazán mciklus végetérésekor meghatározza, hogy avéget a ciklus), vagy végzett a ciklus végrehajtásával, és a következő utasítással kell a programot folytatni. A fentiekben v ük programágnak (Branch). Az utasítás előrejelzés pedig megjósolja, melyik programágat fogja váágválasztások statisztiktalál, a BTB "megjegyBTB információi alapjmelyik programágát kehelyes, ezzel az eljáráEllenkező esetben a feidőveszteséget nem oklenne. 1 l
az INTEGER egység ipeline-jaiban kezdődik, és az első néhány integer pipeline-szint után
ek felsorolásánál azonban nem hagyhatjuk ki a arget Buffer = programág-tároló) Ez egy aprócska us utasítás-előrejelzés (Branch Prediction) adatait
rejelzés az a technika, amely által szolgáltatott el a pipeline-okat teljes feltöltöttséggel, azaz teljes álni. A koncepciót egy tipikus alkalmazási példán egérteni: az utasítás-előrejelzés minden software-elvégez egy feltételes vizsgálatot, amely
ciklus elejét kell-e ismét végrehajtani (nem ért
ázolt két lehetőséget vagy "útvonalat" nevezz
lasztani a software, a már előzőleg megtett ái alapján. Amikor a processzor egy elágazást zi" az utasítást, és a programág ugrási címét. A án születik meg a "jóslat" arról, hogy az elágazás ll majd a következőkben felhasználni. Ha a jóslat ssal az ágcím betöltési időt meg lehet takarítani. lhasználandó ág címét be kell tölteni, ami külön oz, mert erre a műveletre egyébként is szükség
ebegőpontos egység A 486DX processzorokhoz képest egy teljesen újratervezett matematikai processzor került a Pentiumok lapkáira. Az újítás gyümölcse egy 8 szintű pipeline-nal felépülő meglehetősen gyors lebegőpontos egység, amely órajelenként egy, néhány esetben két (ha a második utasítás egy "Exchange") lebegőpontos számítást képes elvégezni. A lebegőpontos utasítások végrehajtása
.2.1.4. Beépített
p
19
Konkurens ötödik generációs architektúrák
kerül át a lebegőpontos pipeline-ba. Az FPU pipeline-jának első négy szintje megegyezik az INTEGER egység pipeline-jában megtalálható
őpontos végrehajtó egység, kerekítő és regiszterbe író egység, hibajelző egység. Az
FPU olyan új hardware-ben tt algoritmusokat használ, amelyek a
űveletekben (pl.: összeadás, szorzás, áromszosára növelik a műveleti
cesszor ?
ppent fel a
endellenesség nem katasztrofális, és csak a 1995 jan. 1. előtt vásárolt Pentium
eltérés az gyszeres, kétszeres, és négyszeres pontosságú lebegőpontos osztási
a bekövetkezésének valószínűsége ismert: <1:9000000. A "renitens" szám a normál alakban felírt eredmény tizedespont utáni negyedik, és tizenkilencedik helyiértéke között fordulhat elő.
Utasításdekódolás
PREFETCH
első négy szinttel. Az utolsó négy szintet pedig következő egységek alkotják: 2 szintes lebeg
áttervezett tomegvalósíCím
generálás közös mosztás), hsebességet.
Szám konverzió
80 bit
1.2.1.5. "Bogaras" a koproV rehajtás 1ég
->
Végr
A szaksajtóban meglehetősen sok hír röehajtás 2
Pentiumok " hibás " lebegőpontos társprocesszoráról. Megnyugtathatom a kedves olvasót, a r
KeRegis
rekítészterbe írás
processzorokban található meg. Sem a hiba nagysága, sem az általános számítási műveletekre vonatkoztatott gyakorisága nem számottevő. (A gyártó 3 év garanciát vállal a processzorokra, és - bizonyos kereteken belül - ki is cseréli a "bogaras" példányokat.) A hiba az eredmény pontosságának csökkenése. Az
Hibadetektálás
1.5. ábra:
Az FPU pipeline-ja
eműveletekben (FDIV) fedezhető fel, az input operandusok bizonyos kombinációja esetén, a kerekítési módtól függetlenül. Az eredmény pontosságának csökkenése akkor következik be, amikor osztó utasítás ismétlőciklusának használnia kell a szétválogató táblát. A hibát okozó számpárok karakterizálása egyáltalán nem egyszerű, de a hib
20
Az INTEL Pentium processzora
1.2.1.6. Sebességnövelő technikák a Pentium osztályú zámítógépeknél
kintsük át miben különbözik egy ötödik generációs Pentium
lár architektúra lasztott cache-ek
Write-Back cache kezelés − újra tervezett 64 bit széles külső adatbusz a memóriák felé (a maximális sebesség
a memóriára vonatkozóan 528 MByte/s - a 486DX50-nél 160MB/s) c
s szükséges a nagyobb alkalmazásoknál (hagyományos 4 kByte-os lapok és növelt 4
esség ?
Első megoldásként számításba jöhet a Pentium osztályú alaplapo-on alkalmazott Pipelined Burst SRAM. Ez a másodszintű cache-elérési
modell változtatásán l kiderül, hogy ez a ódszer milyen arányú sebességnövekedést eredményez. A táblázat
datai Pentium processzorra vonatkoznak, óraciklus számban értendők.
s Előszöris teprocesszor az "elődöktől"? − szuperska− szétvá −
, gyorsabb FPU −
− ache kezelés burst módban (nagy 256bit-es adagok tölthetők adatcache-ből egyetlen egyszerű buszciklus alatt)
− a MOV, és néhány ALU utasítás harware-es megvalósítású, ezért gyorsabb működést, nagyobb teljesítményt tesz lehetővé
− támogatja a növelt lapméreteket így kevesebb lapozá
MByte-os is választhatók) Ha egy az eddigieknél gyorsabb számítógépet szeretnénk létrehozni, akkor meg kell, hogy vizsgáljuk melyek azok a részegységek, amelyekre a többi részegységnek várnia kell. Ha a várakozásokat "kihagyjuk" a rendszer gyorsulni fog. Napjainkban a processzorok olyan műveleti sebességet értek el, hogy örökké várniuk kell, a perifériákra vagy memóriára, legyen az akár HDD, a főmemória, vagy cache-memória. Hogyan növelhető a memória elérési seb
kak módszere. Az alábbi táblázatbó
ma
21
Konkurens ötödik generációs architektúrák
PipA ciklus típusa Aszinkron SRAM
elined Burst SRAM
Burst Read 3-2-2-2 3-1-1-1 Burst Write (Write back) 4-3-3-3 3-1-1-1 Single Read 3 3 Single Write 4 3 Back-to -back Burst Read
3-2-2-2-2
3-1-1-1-1
1.6. ábra: Cache kezelési modellek
Pl. a 3-1-1-1 adat az első adat beolvasásánál 3 óraciklust kell várni az érvényes adatra, a második azonban már egy ciklus alatt beolvasható, és így tovább. Például négy egymást követő adat beolvasása kilenc óraciklus helyett, csak hatot igényel. Pipelined Burst SRAM-mal
atátviteli sebesség maximuma 300 MByte/s fölött van. ad A második megoldást keressük a DRAM-ok tájékán. A normál Page-mode DRAM-oknál az adat a CAS# jel felfutóélénél érvényes. Erre "gyógyszer" EDO DRAM (Extended Data Output) használata. (Az EDO DRAM csak 72pin-es SIMM modulként kerül forgalomba. Fizikai méretkülönbség nincs a Page mode DRAM és az EDO DRAM között.) Ha EDO DRAM-ot használunk, az adat a CAS# ciklus teljes időtartama alatt érvényes. Ezzel a megoldással a (fő)memória elérési sebesség
00MB/s -ról 200MB/s fölé emelkedik. A két időzí1 tés közötti ülönbséget az alábbi ábrán vehetjük szemügyre. k
22
Az INTEL Pentium processzora
P
érvényes érvényes érvényesDATA (out)
érvényes érvényes érvényes
EDO DRAM idôdiagram:
CAS#
DATA (out)
age mode DRAM idôdiagram:
iesésével kell számolnunk. A Bus Master IDE egoldás két legyet üt egy csapásra: egyrészről a vezérléssel nem a
processzornak kell vesződnie, (másik hardware elem teszi meg helyette) és kialakítható egy új adatátviteli megoldás a már meglévő IDE buszon. E megoldás: az enhanced IDE controller. Ez a kontroller két dedikált DMA csatornát használ. (az adatok közvetlenül a memóriába kerülhetnek, és nem szükséges a processzor közreműködése). Az adatátvitel PIO mode 3, és mode 4 IDE névre hallgat. A mode 3-mal az IDE adatátviteli
CAS#
1.7. ábra: DRAM idődiagramok
Ha a fizikai memórián nem csak a memória chip-eket értjük, hanem a merevlemez kapacitásának egy részét is, - pl.: MS-Windows swap területe (lásd: a szegmentált memóriamodellről szóló fejezetet, lapozás) - akkor a HDD adatátviteli sebességének növelésével szintén hatásosan növelhetjük a teljes rendszer teljesítményét. A tradícionális PIO (Programozható I/O) IDE a CPU közreműködését igényli, tehát a processzornak sokat kell várni a lassú mechanikai alkatrészekre. Minél gyorsabb processzorunk van, annál nagyobb teljesítmény km
23
Konkurens ötödik generációs architektúrák
sebességének maximuma 11 MByte/s, a mode 4-gyel 17 MByte/s, és ha mode 4 mellé még a DMA mode 2-t is kiválasztjuk 22 MByte/s-os bességet is elérhetünk (Az adatok PCI IDE controllerre vonatkoznak,
helyett nagyobb, 4 MByte-os pokat is kezelhetünk. A nagyobb lapméret előnye, hogy csökken a pcserélési frekvencia, és növekszik a lapokra vonatkoztatott találati
kat lehet végrehajtani.
1.2.1.7. Multiprocesszoros rendszerek A 90-100MHz-es Pentium processzorok lapkái tartalmaznak egy multiprocesszoros vezérlő áramkört is. Ez a vezérlő két részre oszlik: a programozható interrupt vezérlőre (APIC= Advanced Programmable Interrupt Controller), és az arbitrátorra. Ezen vezérlő segítségével olyan nagy teljesítményű és viszonylagosan kis költségű Server architektúrák is megvalósíthatók, amelyek 256 (!) processzort tartalmaznak, mindegyiket saját cache-sel. 1.2.1.8. Adatvédelem
zám eg a tervezők, amely kifejezetten az paritásvizsgálat a külső lábakon, és a lapkára integrált memória stuktúrákon (cache, bufferek, mikrokód ROM). Akad azonban olyan szituáció amikor az adatok integritása különösen fontos. Ezekben az esetekben használható ki a Pentium által támogatott funkcionális redundancia ellenőrzés. [Functional Redundancy Checking (FRC)]. Az FRC két Pentium chip-et igényel: az egyik Master, a másik Checker. A chip-ek párhuzamosan futnak, és a Checker
aseés a HDD-nek "ismernie" kell a fentiekben említett protokollt). A negyedik megoldást maga a Pentium processzor kínálja nekünk: a hagyományos 4 kByte-os lapméretek lalaarány. A lapcserélgetés helyett hasznos utasításo
omplex grafikai eljárások, keret pufferek, operációs rendszer kernelek kesetében jelentős sebességnövekedés érhető el. A megoldás másik előnye, hogy transzparens (átlátszó) az alkalmazások szempontjából.
S os olyan technikát valósítottak m
adatok védelmét szolgálja. A hibadetektálás kétszintű: a
24
Az INTEL Pentium processzora
összehasonlítja az általa kapott eredményeket a Master eredményeivel, hogy egészen biztosan hibamentesek legyenek az eredmények. Az FRC alkalmazásával a hibadetektálás hatásfoka 99% feletti. A processzor tartalmaz néhány teszt lehetőséget a chip megbízhatóságára vonatkozóan. Az önteszt minden RESET esetén lefut, és a processzor 70%-át ellenőrzi az IEEE 1149.1 szabvány szerint. Ez segít a gyártóknak a chip külső kapcsolatainak vizsgálatában, és láthatóvá teszi a regisztereket, a processzor állapotainak pontos detektálhatósága érdekében. Ezenkívül a rendszer tartalmaz rendszerprogramozók számára egy lehetőséget a cache-ek találati arányának mérésére. Ezzel a "sebesség monitorozó" üzemmóddal felderíthetők azok az esetek, amikor a processzor hosszú ideig vár a külső buszra, és ez a funkció segít a külső memória optimalizálásában is. A Pentium processzor rendelkezik egy a 386SL-nél megismert System Management Mode-dal is, amely a teljesítmény management-ben és a biztonsági feladatok megoldásában lehet hasznos segítség.
25
Konkurens ötödik generációs architektúrák
1.2.2. A Cyrix M1-es processzor családja Nézzük meg, mi rejtőzik az M1-es processzor belsejében. Ha a felépítést tekintjük számos új megoldást találunk. Hogy a különbségeket megértsük, nézzük a processzor szívét, az INTEGER egységet, amelyben
egközelítőleg az összes művelet zajlik.
.2.2.1. Pipeline vagy szuperpipeline ?
m 1 Az M1-es belsejében is megtaláljuk az ötödik generációs processzoroknál már megszokott pipeline egységet.
Az M1 szuperpipeline INTEGER egysége A PENTIUM pipeline INTEGER egysége
= Pipeline szint = utasítás
1.8. ábra: Az M1- es és a Pentium processzorok pipelinejainak összehasonlítása
26
A Cyrix M1-es processzor családja
27
Konkurens ötödik generációs architektúrák
A pipeline az az egység, amelynek belsejében az adatok és az tasítások végrehajtódnak. A Pentium chip mindegyik pipeline-ja öt égrehajtási szintre osztódik nt
összehasonlítjuk a két procPentium pipeline adatfeldolgohogy az utasítás végrehajtása két pipeline szorosabb egyprocesszort különlegesen magteszi alkalmassá a 0,5 mikrono 1.2.2.2. 32 regiszter job Ha a processzor más r32 általános felhasználású chipekkel, amelyek csak 8 ilmennyiségű regiszter flexibregiszterek a működéshez szezek több adatot tudnak tárol dolgozhat, hogy ritkábban kell várnia, hogy az adat előkerüljön a memóriából. A 32 regiszter miattadattal, ami magasabb sebesséaz ugrási címen található anélkül, hogy tönkretenné vaaktuális Pentium regiszter lekközül a jóslat (Branch Prediction) figyelembe vételével a legoptimálisabbat választhatja ki. Egy másik felépítésbeli különbség található a cache egységben is. Az Intel Pentium chipek elsőszintű cache-e 8 kByte adat, és 8 kByte utas intű cache egysége egy 16 kByte-os duál-portos definiálatlan cache-ből (a cache tárolhat utasításokat és adatokat is vegyesen), és egy 256 Byte-os
tasításvonal cache-ből épül e
uv - mi ahogyan már a 80486-ban is. Ha
esszort az M1-es szuperpipeline, míg a zási technológiát alkalmaz. Ez azt jelenti, hét szintre tagozódik, az M1-es esetében a üttműködése érdekében. Ez az M1-es
as, 100 MHz fölötti órajelek alkalmazására s technológiával .
b mint 8 !
észeibe tekintünk bele, akkor az M1-es-ben regisztert találhatunk, szemben az x86 yen regiszterrel rendelkeznek. A nagyobb ilisebb felhasználást tesz lehetővé. A ükséges részeredményeket tárolják, és ha ni, akkor a processzor úgy
az M1-es processzor mindig tele lehet get eredményez. A feltételes ugrások során
utasításokat feltételesen is végrehajthatja lódi Pentium regiszterkészlet tartalmát. Az épezéséhez pedig a többszörös regiszterek
ítás cache-re osztódik. Az M1-es elsősz
u f l.
28
A Cyrix M1-es processzor családja
Utasítás adat
Utasítás vonalCACHE
Adat rendezõ
Definiálatlan CACHE
0. készlet
1. készlet2. készlet
3. készlet
CACHE Címzés
FPU
Adat busz
Busz InterfészEgység
Utasítás vonal CACHEhiányzó adat
Módosított X, Yfizikai címek
1.9. ábra: Az M1-es definiálatlan CACHE-e bármilyen arányban tartalmazhat adatot és utasítást. Az utasításvonal CACHE pedig az
INTEGER egység által leginkább használt utasításokat tárolja. Nézzünk egy példát: egy adatintenzív programszegmens túlterheli a kisebb méretű adatcache-t ( a Pentium esetében 8 kByte), és a chip lassabban fog dolgozni, mert a többi adatot a külső memóriából kell beolvasnia. Az M1-es esetében ugyanez az adatintenzív programszegmens egy nagyobb (16 kByte) definiálatlan cache-ben lelassulás nélkül hajtódhat végre, mivel a processzornak kevésbé kell a külső memóriára támaszkodnia. Az M1-es sebességi előnyének egy részét a tervezők a cache nagy sebességével érték el, egyetlen óraciklus alatt
29
Konkurens ötödik generációs architektúrák
képes elérni az adatot. Ez a gyártó szerint kétszer gyorsabb a Pentium datelérésénél.
ég erre a várakozásra, mert ind a
elyik megállna.
a 1.2.2.3. Csökkentett függőség - nagyobb sebesség Amikor két utasítás fut párhuzamosan egy szuperskalár processzoron előtérbe kerül a két utasítás közötti függőség problémája. Ez a függés azt okozza, hogy az egyik utasításnak meg kell állnia, hogy megvárja a másik végrehajtását. Ez pl. akkor fordulhat elő ha mind a kettő ugyanazt a regisztert egyidőben szeretné használni, így az egyiknek
rnia kell. Az M1-es esetében nincs szüksvám 32 regiszter mindkét pipeline felől elérhető, ezért mindegyik utasítás megkaphatja a másolatát erről a regiszterről és egyiknek sem kell várakoznia. Egy másik problémát vet fel a szuperskalár processzorokban amikor a két párhuzamos pipeline-ban valamelyik utasításnak szüksége van a másik utasítás eredményére. Az M1-es olyan adathívási technikát használ, amely biztosítja mindkét pipeline-ban végrehajtódó utasítás redményének szimultán elérését anélkül, hogy valame
Azzal, hogy az egyik utasítás eredményét nem kell kiírni a memóriába és a másik utasítás ezt az eredményt mégis el tudja érni a processzor időt takarít meg, csökkennek a memória elérési ciklusok.
30
A Cyrix M1-es processzor családja
1.2.2.4. Kiegyénített terhelés -gyorsabb programfutás
Ha a pipeline kiegyenlí-tetlenségekkel terhelt, akkor az egyik pipeline sokkal telítettebb mint a másik ezért a másiknak meg kell állnia, hogy megmaradjon a program komplexitása, ez szintén lassulást eredményez. Az M1-es tervezői ezt a kiegyenlítetlenséget úgy szüntették meg, hogy az aktuális utasítást mindig a kevésbé terhelt pipeline-on hajtatják végre, és az utasítások át tudnak kelni a két pipeline között. Az M1-es rendelkezik a becslés képességével, ez azt jelenti, hogy meg tudja jósolni, hogy melyik programág utasítását kell betölteni egy bizonyos pipeline-ba ahhoz, hogy időt takarítson meg. (Ezt a funkciót nevezzük utasítás előrejelzésnek.) Ha az aktuális utasítás már fuvalamely pipeline-on mielőtt még a pontos jóslat ismeretes lenne, már időt takarít
r mág
UtasításFetch
Utasítás dekódolás 1
Utasításdekódolás 2
Utasításdekódolás 2
Címszámítás 1
Címszámítás 1
Cím Címszámítás 2 számítás 2
t
meg. Ha a jóslat rossznak bizonyult, akkonem vesztettünk időt, mivel a prograugrási címének betöltésére egyébként isszükség lenne.
Végrehajtás Végrehajtás
Write-BackWrite-Back
1.2.2.5. Kiugrás lehetősége a végrehajtási sorrendből Abban az esetben ha az egyik pipeline-ban lévő utasítás gyorsabb mint az őt megelőző másik utasítás, akkor kiléphet a pipeline sorrendből, és betöltődhet a másik pipeline-ba - anélkül, hogy a
X YPipeline Pipeline
1.10. ábra: Az M1-es
processzor szuperpipeline-okból felépített INTEGER
egysége
31
Konkurens ötödik generációs architektúrák
programfutás felfüggesztődne - így nem kell processzoridőt fecsérelni a lassúbb utasítás végrehajtásának kivárására.
1.11. ábra: Kiugrás a végrehajtási sorrendből. Az M1-es processzorban az egyik pipeline végrehajtási sorában lévő utasításnak nem kell
megvárnia a másik pipeline lassúbb utasítását. Kiugorva a végrehajtási sorból, időt lehet megtakarítani a vérehajtás során, a program futásának
megszakítása nélkül.
32
A NexGen Nx 586-os processzor családja
1.2.3. A NexGen Nx 586-os processzor családja 1.2.3.1. Hogyan lehet RISC processzorból CISC avagy fából vaskarika ?
A NexGen kutatásainak gyümölcse egy olyan nagy sebességű 8 ől
me áb ko m chi Ennek ellenére a Microsoft kijelentette, hogy az Nx586 Windows kompatibilis. A processzor joggal viselheti a Novell "YES It run with NetWare" logóját is. A kompatibilitási teszteket a független XXCAL laboratórium végezte el. A legnépszerűbb software-k ciklusainak trillióival tesztelték több operációs rendszer, és hálózati protokoll alatt. Az eredmény megdöbbentő: "Platinium Certification " Ezen sorok láttán azt hiszem sokakban felmerül a gondolat: Az INTEL és a Pentium egy újabb, méltó ellenfelére akadt. No de nézzük, mit takar a tokozás.
X 6-os processzor család, amely a 486-os és Pentiumos rendszerekt
glehetősen különböző részekből épül föl. A chip nem "lmpatibilis" sem a 60-66MHz-es, sem a 75-90-100MHz-es Pentiupekkel, tehát speciális alaplap kell hozzá.
33
Konkurens ötödik generációs architektúrák
Nx 586Processzor
Nx 587Koprocesszor
SRAML2 CACHE
A chip-től elválasztva találhatjuk meg a lebegőpontos egységet (FPU) mint ahogyan a 386 - 387 -es rendszerekben. Ezzel szemben
integrálásra került a másodszintű (L2, vagy külső) cache vezérlője, a leprocesszorlapkán. Az Nx586-ban egy-egy külön-külön 64 bit széles busz áll rendelkezésre a matematikai processzorral, és a külső SRAM-okkal való társalgásra. A harmadik 64 bit széles busz a rendszer többi tagjával történő kapcsolattartást biztosítja. A külön cache-busz csökkenti a memória, és az I/O ciklusok közötti konfliktusokat. Előny az is, hogy a
SIMM
DRAMRendszer
logikamodulok
16-bites ISA busz (8MHz)32-bites PCI vagy VESA busz (30-33MHz)
64 bit
64 bit 64 bit
64 bit Rendszer
interface
1.12. ábra: Nx586 alapú IBM PC kompatibilis számítógép felépítése NxVL vagy NxPCI rendszerinterface chip felhasználásával. A
atematikai processzor külön tokban helyezkedik el, míg a másodszintű mcache vezérlője a processzorlapkán kapott helyet.
34
A NexGen Nx 586-os processzor családja
cache-busz sebessége megegyezhet a CPU órajel frekvenciájával, amíg a
.2.3.2. x86 - RISC86
omplex Instruction Set Computer), amely összetett tasításokat tartalmaz, különböző modellek szerint. Egy példa a CISC
sen és nem software-ből mulálva, mint ahogyan a Motorola PowrePC 603, vagy az Alpha
tjai a normál ISC utasításkészletnek, úgy, hogy közben "örökölték" az x86-os rchitektúra sajátosságait. A RISC név mégis megilleti ezeket az
ódként alkalmazhatóak.
86 feltételezett eredménnyel hajtja végre a ltételes ugrásokat, és az ugrási feltételek kiértékelése után aktualizálja
rendszer-busz tetszőleges sebességgel dolgozhat. Az interface-ek elválasztásának a kivezetések száma és a tokozás gazdaságossága szab határt, ugyanis az Nx586 tokozási költsége (463 lábú PGA tok) már így is kétszerese egy Pentiuménak (296 lábú PGA tok). 1 A RISC (Reduced Instruction Set Computer), egy olyan processzortípust jellemez, amely csak kevés, a fordítók által gyakran igényelt (redukált) utasítást tartalmaz hatékonyabb implementációban. Ellentéte a CISC (Cuprocesszoroknál használható modellek közül: a Pentium Load & Store modellje. Egy Nx586-os processzor teljes mértékben implementálja az X86-os utasításkészletet. Ez az implementáció a RISC86-os architektúrával történik, valós időben, dinamikusan. Hardware-eeprocesszorok teszik, aminek hatalmas teljesítménycsökkenés a következménye. Ezek az utasítások közvetlen leszármazotRautasításokat, mert egyszerű mikrok Az x86-os architektúra egyik szűk keresztmetszete a korlátozott regiszterkészlet: csak 8 általános felhasználású regisztere van. Itt segít fordítás, és a RISC processzorokban már hagyományos 32 regiszter. Az Nx586, az x86 8 regiszterét 22 fizikai regiszterre képezi le. Ezt az eljárást nevezzük regiszter átnevezésnek. Mire jó a regiszter átnevezés? A pipeline-ok elakadásának elkerülése érdekében az Nx5feazokat. Ez a nem optimalizált programok esetén is fennáll.
35
Konkurens ötödik generációs architektúrák
A 32 regiszter többszörösen lefedi a Pentium regiszterkészletét. A pipeline folyamatos adatáramlása biztosítható a regiszterek gyors átnevezésével, így a számítási eredmények több fázisa hozzáférhető az adatok újrabetöltése nélkül, tehát a pipeline-ok nem akadnak el a lassú adatbetöltés miatt.
X86 -os utasítások
Utasítás fordító, és ütemezô
Címzô egység
Sok X86-os utasítás egyszerűen konvertálható RISC86-os utasítássá. Vannak azonban olyan X86-os utasítások is, - amelyek a betölt-eltárol modellt használják, például a memória kezelési ciklusok- amelyek csak két, vagy három RISC86-os utasítást igényelnek.
RISC86-os utasítások
Végrehajtóegység
Végrehajtóegység
RISC86-os utasítások
Végrehajtóegység
RISC86-os utasítások
1.13
. ábra: A NexGen szabadalmaztatott RISC86-os architektúrája dinamikusan fordítja az összetett X86-os (CISC) utasításokat
RISC86-os utasításokká, így tehát kihasználhatja a RISC utasítások sebességi előnyeit.
36
A NexGen Nx 586-os processzor családja
1.2.3.3. Szuperskalár végrehajtás-javuló hatásfok Azt már tudjuk, hogy egy X86-os utasítás, fordítás után ciklusonként két vagy több RISC86 utasításként is megjelenhet, minden funkcionális egységnél. A funkcionális egységeket úgy tervezték, hogy párhuzamosan több RISC86-os utasítást is végrehajthassanak. A NexGen szuperskalár elnevezése RISC86-os szempontból értendő. A RISC86-os utasítások párhuzamosságának jobb kihasználhatósága érdekében, minden egyes funkcionális egység 14 belépési ponttal rendelkező végrehajtási sorral rendelkezik. Az Nx586-os mikroprocesszor - ahogyan a Pentiumok is - két INTEGER egységgel rendelkezik. A szokatlan azonban az, hogy ez az egység az Nx586-ban egyáltalán nem szimmetrikus. Az egyik INTEGER egység végzi a RISC86 integer utasításokat, beleértve a szorzást és osztást is, míg a másik INTEGER egység az egyszerű egyciklusos utasításokat hajtja végre. A dekóder egység rendelkezik egy "betöltés kiegyenlítő" algoritmussal, és ennek segítségével irányítja az utasításokat valamelyik INTEGER egységre. A RISC86 betöltő és tároló utasítások a CÍM-egységbe kerülnek, amely kiszámítja a cél címet, és gondoskodik az X86-os szabványról szerinti fordításról. Mivel a chip csak egy egyszerű CÍM-egységet tartalmaz, ciklusonként csak egy betöltő, vagy tároló utasítás hajtódhat végre. 1.2.3.4. Az utasítás-előrejelzési CACHE (BPC) Az Nx586 alkalmazza az elméleti futtatás és az utasítás előrejelzés technikáját is. Ha a processzor találkozik egy programággal, először megbecsüli a végrehajtáshoz szükséges időt, és majd később kezdi el az utasítások végrehajtását. Ezt a módszert nevezzük elméleti végrehajtásnak. Az
37
Konkurens ötödik generációs architektúrák
Nx586 ke legtöbb setben a észül el, mikor a harmadik programág vizsgálata elkezdődik.
nél. Ez a koncepció hasonlít az AMD
ust használ a
hívás esetén. Az Nx586 tartalmaz egy VISSZATÉRÉSI
.2.3.5. Cache hierarchia
n négyutas csoport asszociatív cache-t alkalmaz a találati rány növelése érdekében. A Pentiummal összehasonlítva mindkét
lag indexelt, és címkézett cache-ek vannak, de a tasak.
ttőnél több programág elméleti futtatására is képes. Az első programág jóslata abban az időpillanatban ke
a A NexGen utasítás-előrejelzési cache-e 5 ciklusos ágbüntetéseket alkalmaz. A BPC 96 belépési ponttal rendelkezik, és az első 24 utasítás
yte-ot tartalmazza minden célcímB29000 ÁGCÉL CACHE-ében alkalmazottra, de különbözik a Pentiumétól, mert a Pentiumé csak a célcímeket tartalmazza (256 elemű célcím puffer).
Az Nx586 két bites "Smith and Lee" algoritm programág jóslatok létrehozásához. Minden egyes BPC adat 2 előrejelzés bitet tartalmaz. Ha egy ág késik, a BPC újabb 2048 adattal bővül, a processzor ellenőrzi a 2 bit széles "ágtörténet" táblázatot, és növeli a jóslási pontosságot. Ez a két struktúra pontosan megjósolja az ágfeltételeket, de nem segít, ha a kód RET utasítást tartalmaz. Ennek oka az, hogy ezek a programágak nehezen kezelhetőek, mert a célcímek változhatnak minden gyes szubrutin e
CÍM VERMET, - hasonlatosan az Alpha architektúrájára - ami 1-8 egymásba ágyazott szubrutin hívást tud kezelni. E a három struktúra kombinációja biztosítja azt, hogy a legtöbb kód esetében a sikeres előrejelzések aránya 90% fölött van. 1 Azzal, hogy a lebegőpontos egység lekerült a processzor lapkájáról, elegendő hely maradt nagyobb cache-ek felépítésére. Az Nx586 16 kByte utasítás-, és 16 kByte adatcache-t tartalmaz. Ezek a memóriák éppen kétszer nagyobbak a Pentium adat- és utasításcache-énél. A NexGeaprocesszorban fizikai
entium esetében kétuP
38
A NexGen Nx 586-os processzor családja
ég: a 0.5 mi echnológia 66M ében minde s alatt egy elé délyez, ezért ké lérés zajlik ciklus alatt. 6 egyetlen cím ggel re , hogy má che elérés csak intű (L2) cache, vagy a rendszerbusz elérésére használható. Sok processzorban felf tás végreha or a fent említ nyek bekövetkeznek, de az Nx586 az utasítás végrehajtásának lelassulása nélkül képes kezelni ezeket az esem dszintű cache-kontroller normál SRAM-okból felép re csatlakoz lső cache-nek azonban csak kétféle konfigurációját támogatja: 256k vagy 1M. A máso ache egységes, utasításokat és adatokat is tartalmazhat, és akárcsak az első tas csoport tív. A külsőcache elérésére a más rlő két ciklust alkalmaz, ezért 66MHz-es órajelnél mi M-ok szü k.
Elérési sebess kronos t Hz esetgyik félperiódu rést enge t cache-ele egyetlen óra Az Nx58 ző egysé
a m dszndelkezik, ebből adódik sodik ca áso
üggesztődik az utasí jtás amik ett esemé
ényeket.
A beépített másoített külső cache- ik. A kü
dszintű c
s uzintű cache, négydszintű cache-vez
asszociao éimálisan 15ns-os SRn A kségese
166 MHz
1660 1 15
sns00000= =
ása ugyanabb p-ben történik, ah datok tárolása, ezért az alkalmazható ad ria 6%-kal csökken. Minden cím iklust igény ahogyan a 8 B avak (quadword-ök) is. A felhasznált adatelérési minta 4-2-2-2. Címkék soro beolvasásáho nálható a csopor ciatív cache Mivel a pon port detektált, a be asás az adato atokban történ Az Nx586-os egy kicsivel hosszabb adatelérési mintákat használ mint egy 66MHz-es Pentium, amelyik ugyanazokkal a 15ns-os SRAM-okkal tipikusan 3-2-2-2 -es mintákkal dolgozik. A NexGen-féle csoport asszociatív módszer nagyobb találati arányt biztosít. A fentiekben vázolt implementáció előnye, hogy azonos cache-elérési minták esetén nagyobb frekvenciákat alkalmaz, mivel a cache-busz sebessége független lehet a rendszerbuszétól. Egy 100MHz-es Nx586-os 4-2-2-2 -es cache elérési mintával 10ns-os SRAM-okat igényelne. A 100MHz-es Pentium
A címkék tárol an a chi ol az aatmemó
ke beolvasása két c el, mint yte-os sz
zatokban történő z hasz t-asszo implementáció. tos cso olvkkal együtt soroz ik.
39
Konkurens ötödik generációs architektúrák
rendszerbusza 66MHz-en "ketyeg", és 5-3-3-3 -as modellt használ. A Pentiumnak kisebb sebessége ellenére előnyére szól, hogy megtarthatjuk a kevésbé költséges 15ns-os SRAM-jainkat. A lapkára integrált cache-k WRITE-THROUGH protokollt használnak, míg a külső cache-ek esetében a tervezők a WRITE-BACK módszert alkalmazták a rendszerbusz forgalmának csökkentése érdekében. Az adat- és utasításcache-ek támogatják az önmódosító kódokat.
40
Landmark 2.0
2. fejezet: Processzor erőforrások
an a Pentium sségének ponto tése céljából összevetettük néhány gyártó 32, vagy 64 bites X86-os archi-tektúrájú processzorát. Byte külső felhasználásáva Az e ön közöljü lső cache méretprocesszoroknál különböző lehet, a különbségekre - típusjelzés szerint - az e elése során k . ents SLC jelzésű processzorai esetében, egy vala fixen beforrasztott processzor állta a sarat a tesztek ny ek követke , hogy különböz lső cache-sel, és esetleg FPU nélkül történtek meg a mérések. Az SLC33-as pr alaplap 64 kByte, az SLC2-66 128 kByte külső ca z SLC2-5 aplap nem rendelkezett külső cache-foglalattal. Az ezektől eltérő ben 256 kByte 1 he-t h 486-os p rok minden gyártó esetében tarta pontos egységet. A táblázatokban a "+FPU" jelzés küls jelent. Ha az 486SX - 486SLC típusoknál nem jelöl r jelenlétét, ények ntos egység nélkül értékelendőek. Az Nx 586-os processzort fogadó alaplap NxVL rendszervezérlő chip-pel épült fel, és nem rendelkezett koprocesszor foglalattal. lt processzor minden esetben léteznek az aktuális típusjelzés alatt, csak a jobb összehasonlíthatóság érdekében
övettük el őket". Ezek fizikailag az előírtnál magasabb órajellel m ghajtott "tuningolt" de kifogástalanul működő példányok, pl.: az Am486DX4-120 valójában egy AmDX4-100, 120MHz-es órajel frekvenciával. Landmark 2.00
Az alábbiakb ok sebe s érzékelte
A tesztek 256 k -cache l készültek.ttől eltérő eseteket kül k. A be különböző TI
redmények kiérték itérünk
A Texas Intrummilyen alaplapba
úzópróbái során. Enn zménye ő méretű kü
oc óesszort tartalmazche-t tartalmazott. A 0-es al
esetek 5ns-os cacasználtunk fel.
A DX jelzésű rocesszolmazzák a lebegőő koprocesszort tük koprocesszo a mérési eredm lebegőpo
A *-gal jelö ok nem
"ke
41
Processzor erőforrások
Processor Típus: CPU (MHz) FPU (MHz) PENTIUM 90 519,47 1743,79 PENTIUM 66 385,85 1299,15 PENTIUM 60 346,74 1169,92
NEXGEN Nx586 P90 527.15 -- Am 486DX4-120 * 401,59 1059,28
INTEL 486DX4-100 359,53 882,57 Am 486DX4-100 334,15 856,64
Am 486DX2-100 * 334,62 882,79 INTEL 486DX2-80 * 267,70 706,05
Am 486DX2-80 267,70 704,11 Cyrix 486DX2-V80 264,45 770,57 INTEL 486DX2-66 222,96 587,49
Am 486DX2-66 222,91 588,02 Cyrix 486DX2-V66 219,94 640,87
TI 486SLC2-66+FPU 152,76 162,07 INTEL 486SX2-50 167,30 14,10
TI 486SLC2-50+FPU 115,15 116,70 Am 486DX-40 133,84 353,06
TI 486SXLC-40 129,81 10,66 TI 486SLC-40 129,90 6,45
INTEL 486DX-33 110,37 291,15 TI 486SLC-33 107,98 7,42
INTEL 486SX-25 83,67 7,04 Am 386 DX-40 62,40 -- Am 386SX-40 52,19 --
42
Landmark 2.00
PENTIUM 90
PENTIUM 66
PENTIUM 60
NE
IN
T
XGEN Nx586 P90
Am 486DX4-120 *
TEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
I 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40 52.1962.4
83.67107.98110.37
129.9129.81133.84
115.15167.3
152.76219.94222.91222.96
264.45267.7267.7
334.62334.15
359.53401.59
527.15346.74
385.85519.47
0 100 200 500 60
La k 2 se g )
300 400 0
ndmar .0 CPU bessé ek (MHz
PENTIUM 90
PENTIUM 66
NE
IN
T
PENTIUM 60
XGEN Nx586 P90
Am 486DX4-120 *
TEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
I 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
43
Processzor erőforrások
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
7.047.42
291.156.4510.66
353.06116.7
14.1162.07
640.87588.02587.49
770.57704.11706.05
882.79856.64882.57
1059.28
1169.921299.15
1743.79
0 200 400 600 800 1000 1200 1400 1600 1800 2000
Landmark 2.0 FPU sebességek (MHz)
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
44
CHECKIT 3.0
CHECKIT 3.0
Processor Type: Dhrystones Whetstones PENTIUM 90 70577 25940900 PENTIUM 66 52749 21665700 PENTIUM 60 47474 19360100
NEXGEN Nx586 P90 59343 1015400 Am 486DX4-120 * 55852 20808800
INTEL 486DX4-100 43158 14893800 Am 486DX4-100 39211 12872800
Am 486DX2-100 * 47474 17337700 INTEL 486DX2-80 * 39211 13109500
Am 486DX2-80 39211 13109500 Cyrix 486DX2-V80 39211 13876500 INTEL 486DX2-66 33609 11419900
Am 486DX2-66 33609 11419900 Cyrix 486DX2-V66 33609 11561800
TI 486SLC2-66+FPU 29759 3705600 INTEL 486SX2-50 24348 461000
TI 486SLC2-50+FPU 21427 2605100 Am 486DX-40 19303 6880100
TI 486SXLC-40 16999 334800 TI 486SLC-40 9749 201600
INTEL 486DX-33 15785 5703700 TI 486SLC-33 11236 224000
INTEL 486SX-25 12054 226600 Am 386 DX-40 11631 312200 Am 386SX-40 7206 114600
45
Processzor erőforrások
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40 72061163112054
1123615785
974916999
1930321427
2434829759
336093360933609
392113921139211
4747439211
4315855852
5934347474
5274970577
0 10000 20000 30000 40000 50000 60000 70000 80000
Checkit 3.0: CPU összehanonlítás Dhrystone-okalapján
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
46
CHECKIT 3.0
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40 114600312200226600224000
5703700201600334800
68801002605100
4610003705600
115618001141990011419900
138765001310950013109500
1733770012872800
1489380020808800
101540019360100
2166570025940900
0 10000000 20000000 30000000
Checkit 3.0: FPU összehasonlítás Whetstones-okalapján
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
47
Processzor erőforrások
MIPS 1.20: (MIPS)
Processzor Típus: General Inst.
Integer Inst.
Mem. -mem.
Reg. -reg.
Reg. -mem.
átlagos:
(MIPS)
PENTIUM 90 13,34 23,48 17,19 29,59 28,21 22,36 PENTIUM 66 9,84 17,39 13,10 21,91 21,44 16,73 PENTIUM 60 8,88 15,66 11,79 19,74 19,30 15,07
NEXGEN Nx586 P90 7,73 27,54 4,44 31,52 13,86 16,94 Am 486DX4-120 * 11,96 27,99 16,05 34,24 25,55 23,16
INTEL 486DX4-100 10,04 27,17 13,36 34,40 21,27 21,25 Am 486DX4-100 9,9 23,30 13,21 28.50 21,18 19,22
Am 486DX2-100 * 10,01 23,32 13,37 28,53 21,33 19,31 INTEL 486DX2-80 * 8,05 18,66 10,70 22,82 17,06 15,46
Am 486DX2-80 7,97 18,66 10,70 22,82 17,06 15,44 Cyrix 486DX2-V80 9,70 22,90 14,09 29,62 19,80 19,23 INTEL 486DX2-66 6,66 15,54 8,91 19,01 14,21 12,86
Am 486DX2-66 6,68 15,53 8,91 19,00 14,20 12,86 Cyrix 486DX2-V66 8,08 19,05 11,72 24,64 16,47 15,99
TI 486SLC2-66+FPU 7,29 13,59 10,73 15,31 14,81 12,34 INTEL 486SX2-50 5,00 11,66 6,68 14,26 10,68 9,66
TI 486SLC2-50+FPU 5,66 10,24 8,01 11,54 11,08 9,31 Am 486DX-40 4,03 9,32 5,35 11,41 8,55 7,73
TI 486SXLC-40 4,77 11,13 6,95 14,13 9,36 9,33 TI 486SLC-40 4,77 11,13 6,70 14,42 9,36 9,28
INTEL 486DX-33 3,31 7,69 4,41 9,41 7,05 6,37 TI 486SLC-33 3,96 9,27 5,69 12,01 7,77 7,74
INTEL 486SX-25 2,51 5,83 3,34 7,13 5,33 4,83 Am 386 DX-40 3,14 6,08 4,00 8,86 5,65 5,71 Am 386SX-40 2,60 5,82 3,61 8,42 4,76 5,04
48
MIPS 1.20
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
PENTIUM 90
PENTIUM 66
Cyri
INTEL 486DX2-66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
x 486DX2-V80
0 20 40 60 80 100 120
MIPS 1.2 (MIPS)
PENTIUM 90
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40 Regiszter-memóriamozgatásRegiszter-regisztermozgatásMemória-memóriamozgatásInteger utasításokGeneral utasítások
PENTIUM 66
Cyri
INTEL 486DX2-66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
x 486DX2-V80
49
Processzor erőforrások
CPUTEST 1.1 (MIPS)
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
Am 486DX4-100
INTEL 486DX2-66
Am 486DX2-66
Cyrix 48
TI 486SLC2-66+FPU
INTEL 486SX2-50
INTEL 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
6DX2-V66
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
25.18219.419
17.48622.803
28.43220.31
17.88923.66
18.93618.938
20.66615.78115.867
17.19313.57
13.2269.934
10.8168.913
8.3058.943
5.8656.571
7.2395.652
0 5 10 15 20 25 30 35
CPUTEST 1.1: Átlagos mûveleti sebesség (MIPS)
PENTIUM 90
Am 486DX4-120 *
Am 486DX4-100
INTEL 486DX2-66
Am 486DX2-66
Cyrix 48
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
INTEL 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
6DX2-V66
50
CPUTEST 1.1
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
C
0
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
yrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-4
52.32438.766
34.90967.448
56.49647.0447.03647.073
37.65837.658
34.44531.36731.357
28.6527.937
23.53523.588
18.82819.97819.978
15.52610.87511.773
19.76417.164
0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75
CPUTEST1.1: Regiszter - regiszter (MIPS)
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
C
0
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
yrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-4
51
Processzor erőforrások
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
39.32429.174
26.27225.787
35.48119.477
14.52629.563
23.6523.65
28.66919.69919.692
23.84619.1919.456
13.73315.139
11.60910.969
12.4855.515
9.3416.37
3.7
0 5 10 15 20 25 30 35 40 45
CPUTEST1.1: Regiszter - memória (MIPS)
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
52
CPUTEST 1.1
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
486DX2-V80Cyrix
INTEL 486DX2-66
INTE
TI 486SLC2-50+FPU
TI
Am 386SX-40
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
L 486SX2-50
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
486SLC-33
INTEL 486SX-25
Am 386 DX-40
38.97935.627
32.08127.389
15.1959.126
6.45112.09
9.6719.671
17.5218.056
9.14914.573
8.2459.482
4.7669.027
2.7133.761
7.8676.339
3.9649.807
5.041
PENTIUM 90
Cyrix
INTEL 486DX2-66
INTE
TI 486SLC2-50+FPU
TI
Am 386SX-40
INTEL 486SX-25
Am 386 DX-40
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
486SLC-33
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
L 486SX2-50
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
486DX2-V80
0 5 10 15 20 25 30 35 40 45
CPUTEST1.1: Memória - memória (MIPS)
53
Processzor erőforrások
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
486DX4-100Am
Am
Cyrix 486DX2-V66
INT
TI 486SLC-33
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
486DX2-66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
EL 486DX-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
10.8478.036
7.2378.818
6.313.935
3.0585.314
4.2514.251
5.5793.5413.54
4.643.61
3.3852.327
3.1632.2432.243
2.651.7771.911.813
1.617
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
0 2 4 6 8 10 12
CPUTEST1.1: Stack mûveletek (MIPS)
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
486DX4-100Am
Am
Cyrix 486DX2-V66
INT
TI 486SLC-33
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
EL 486DX-33
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
486DX2-66
54
CPUTEST 1.1
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
A
Am 386 DX-40
Am 386SX-40
m 486DX4-100
m 486DX2-100 *A
INT
486DX2-80
TI
INTEL 486SX-25
EL 486DX2-80 *
Am
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
486SLC-33
0.383
0.4
0.355
0.602
0.496
0.273
0.259
0.553
0.519
0.535
0.569
0.503
0.226
0.503
0.642
0.495
0.634
0.479
0.48
0.48
0.143
0.473
0.529
0.579
0.27
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7
CPUTEST1.1: I/O mûveletek (MIPS)
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
A
INT
486DX2-80
TI
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
486SLC-33
Am
Cyrix 486DX2-V80
INTEL 486DX2-66
EL 486DX2-80 *
Am 486DX4-100
m 486DX2-100 *
55
Processzor erőforrások
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
86DX4-120 *
6DX4-100
Am 4
INTEL 48
INTEL 486DX2-80 *
C
IN
TI 486SLC-40
I
INTEL 486SX-25
Am 486DX4-100
Am 486DX2-100 *
Am 486DX2-80
yrix 486DX2-V80
TEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
NTEL 486DX-33
TI 486SLC-33
Am 386 DX-40
Am 386SX-40
6.87
5.09
4.583
8.362
8.874
9.023
7.388
7.394
5.915
5.915
8.049
4.927
4.925
6.695
4.954
3.697
3.734
2.957
4.086
4.086
2.439
3.279
1.849
3.053
1.864
0 1 2 3 4 5 6 7 8 9 10
CPUTEST 1.1: Matematikai mûveletek FPU nélkül (MIPS)
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
86DX4-120 *
6DX4-100
Am 386 DX-40
Am 386SX-40
Am 4
INTEL 48
INTEL 486DX2-80 *
C
IN
TI 486SLC-40
I
INTEL 486SX-25
NTEL 486DX-33
TI 486SLC-33
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
Am 486DX2-80
yrix 486DX2-V80
TEL 486DX2-66
Am 486DX2-66
Am 486DX4-100
Am 486DX2-100 *
56
CPUTEST 1.1
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
486DX2-80Am
Am 486DX2-66
Cyrix 486DX2-V66
Am
Am
Cyrix 486DX2-V80
INTEL 486DX2-66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
386 DX-40
386SX-40
25.223
18.687
16.828
20.224
26.057
16.631
13.441
21.765
17.412
17.412
20.11
14.503
14.498
16.727
14.035
13.478
9.569
11.057
8.852
6.672
9.118
6.376
6.831
4.793
3.525
PEN
Am
Am 486DX2-66
Cyrix 486DX2-V66
Am
Am
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
386 DX-40
386SX-40
Cyrix 486DX2-V80
INTEL 486DX2-66
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
486DX2-80
TIUM 90
0 5 10 15 20 25 30
CPUTEST 1.1: Logikai mûveletek (MIPS)
57
Processzor erőforrások
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
486DX2-V66Cyrix
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI
INTEL 486SX-25
86 DX-40
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
486SLC-33
Am 3
Am 386SX-40
52.595
38.967
35.09
39.115
56.128
34.951
26.242
46.921
37.456
37.456
55.208
31.2
31.188
45.92
29.434
24.68
20.433
19.744
22.785
19.085
16.282
18.148
12.344
13.04
11.41
0 5 10 15 20 25 30 35 40 45 50 55 60 65
CPUTEST 1.1: Adatforgatás (Bit/s)
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Cyrix
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI
INTEL 486SX-25
86 DX-40Am 3
Am 386SX-40
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
486SLC-33
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
486DX2-V66
58
CPUTEST 1.1
PENTIUM 90
PENTIUM 66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Cyrix 486DX2-V80
INTEL 486DX2-66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
0.041
0.022
0.018
7.486
50.846
42.338
42.332
42.365
33.892
33.892
15.844
28.23
28.222
13.179
14.081
21.101
10.614
16.945
7.471
7.47
13.973
1.185
10.596
5.929
3.85
0 10 20 30 40 50 60
CPUTEST 1.1: JMP/CALL utasítások (MIPS)
PENTIUM 90
PENTIUM 66
Am 486DX2-66
Cyrix 486DX2-V66
TI 486SLC2-66+FPU
INTEL 486SX2-50
TI 486SLC2-50+FPU
Am 486DX-40
TI 486SXLC-40
TI 486SLC-40
INTEL 486DX-33
TI 486SLC-33
INTEL 486SX-25
Am 386 DX-40
Am 386SX-40
ennyi
Cyrix 486DX2-V80
INTEL 486DX2-66
PENTIUM 60
NEXGEN Nx586 P90
Am 486DX4-120 *
INTEL 486DX4-100
Am 486DX4-100
Am 486DX2-100 *
INTEL 486DX2-80 *
Am 486DX2-80
Ha azt szeretnénk megtudni, hogy az egyes 486-os architektúrák m ben hasonlítanak, vagy térnek el egymástól, elég a mérési adatok között vizsgálódnunk. Az ugrások (JMP/CALL), matematikai műveletek -koprocesszorral és anélkül - sebességi különbségéből kitűnik, hogy a
59
Processzor erőforrások
Cyrix processzorok felépítése lényegesen különbözik az INTEL és az AMD által használt struktúráktól. Egy gyorsabb koprocesszort, és kicsivel
yorsabb, az INTEL-től különböző CPU-t takar a tokozás. Az INTEL és z AMD DX2-66 -os processzora esetében az is kitűnik, hogy az INTEL
r belülről teljesen egegyezik! Mindegyik tesztprogram a teljesen azonos eredményeket
ez a helyzet. Ebben a ategóriában a Cyrix viszi a pálmát. A tesztprogramok mérő-algoritmus
párosméremért méréazonparamesetében az eredmény szintén nagymértékben függ a cache méretétől. A
IPS és a CPUTEST esetében azonban a helyzet sokkal jobb.
PentimérübelsőmaguCALismeutasíJMP-CALL utasítások vérehajtásáról készült táblázat/
művePentimindfejeztechnszereoknaprocerends
ganem alaptalanul perlekedett: a két processzommutatott. A DX2-80 -asok esetében szintén khosszait is érdemes megfigyelni. Az áruló a Texas SCL40 - SXLC40
a, ugyanis különbség a két típus között csak a belső-cache tében van. Az SLC40-ben 1 kByte (!), az SXLC40-ben 8 kByte. A adatokból kiderült, Landmark CPU sebesség mérése nem, FPU
se pedig nagymértékben függ a belsőcache mérettől, egyébként os teljesítményű processzorok esetén. (Sokszor sajnos nem csak azt a
étert mérjük amelyiket szeretnénk!) A Dhrystone-ok Whetstone-ok
M
Az ugrásokat összehasonlítva sokakat meglep a tény, hogy a umok, és az Nx586 esetében is meglehetősen alacsony értékeket nk. Csodák ebben a műfajban nincsenek. A processzorok a külső, és cache-ek feltöltésével, és az utasítás előrejelzéssel foglalják el kat, pipeline-ok pedig az ugrás után nem lehetnek tele utasítással. (A L utasítás esetében a helyzet még rosszabb: az előbbiekben rtetett procedúrák kétszer - egyszer a CALL, és egyszer a RET tás eredményeként - hajtódnak végre.) /lásd: CPUTEST 1.1
Érdekes dolgokra bukkanhatunk, ha az Nx586 regiszter
leteinek sebességét vetjük össze az azonos súlycsoportba tartozó uméval: a kizárólag regiszterek között végrehajtott műveletekben ig az Nx586 vezetett. Ennek magyarázata - az Nx586-ról szóló etben már tárgyalt - 32 regiszter, és a regiszter átnevezési ológia. Sajnos az Nx586 a memória műveletek méréseinél nem pelt túl fényesen, ezt az alaplapra integrált 12ns-os CACHE-RAM -k tulajdonítjuk. (A Nexgen 10ns-os cache-RAM -okat ír elő a P90-es sszorához.) A másik összetevő, hogy PCI-buszra épülő zervezérlő chippel (pl.: NxPCI rendszer vezérlő) ugyanazon
60
CPUTEST 1.1
proce(90M
Számunkra meglepetést okozott a Cyrix, és a DX4-es
zó utasítások (FP) a kétszeres ontosságú alakok használatát feltételezik.
UTASÍTÁS NEXGEN INTEL IBM
sszorral egy nyúlfarknyival nagyobb sebesség érhető el. Hz-nél kb.: 2,5-3%)
processzorok a Pentiumokhoz viszonyított meglehetősen magas INTEGER műveleti sebessége. Most nézzük milyen különbségek vannak az utasítások végrehajtásának ütemezésében néhány konkurens ötödik generációs processzorban. Kiemeltünk néhány matematikai utasítást a teljesség igénye nélkül. A táblázat az utasítás végrehajtásának idejét a végrehajtáshoz szükséges órajel ciklusok számával adja meg. A matematikai processzorra vonatkop
Nx586 Pentium PowerPC 601
FP ADD késés: 2 3 4 eredmény: 2 1 1
FP MUL késés: 2 3 4 eredmény: 2 2 2
FP DIV késés: 40 39 31 eredmény: 40 39 29
MUL (integer) késés: 8 10 9 DIV (integer) késés: 39 41 36
Érdekességként nézzük meg a Pentium processzor és konkurensei r alatt mért INTEGER, és Floating Point ISC processzorként hardware-sen (pl.: Nx586),
ások (pl.: PowerPC, R4400, Alpha) software-b
UNIX operációs rendszeteljesítményeit. Egyesek Rm ől emulálva valósítják meg az x86-os architektúrát.
61
Processzor erőforrások
Processzor típus
Belső órajel frekvencia
SPECint92
SPECfp92
Belső-cache méret
Pentium 60 60MHz 58.3 52.2 16 kByte Pentium 66 66MHz 64.5 56.9 16 kByte Pentium 75 75MHz 83.8 60.8 16 kByte Pentium 90 90MHz 100.9 73.5 16 kByte Pentium 100 100MHz 112.7 81.8 16 kByte
SPARC+ 50MHz 65.2 83 36 kByte PowerPC601 66MHz 75 91 32 kByte PowerPC603 66MHz 55 65 16 kByte PowerPC604 100MHz 140 145 32 kByte
HP7100 99MHz 80 150 -- Alpha21064 150MHz 84.4 127.7 16 kByte
MIPS R4400SC 150MHz 61.7 63.4 16 kByte Cyrix M1 100MHz 130 nincs adat 16 kByte
Gyártók: Pentium -INTEL PowerPC -IBM K5 -AMD M1 -CYRIX HP7100 -HEWLET-PACKARD R4400 -MIPS Alpha21064 -DEC Nx586 -NEXGEN
62
UNIX SPECint SPECfp tesztek
Pentium 60
Pentium 66
Pentium 75
Pentium 90
Pentium 100
SPARC+
erPC601
PowerPC603
rPC604
HP7100
ha21064
4400SC
Cyrix M1
Pow
Powe
Alp
MIPS R
0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150
Pentium 60
Pentium 66
Pentium 75
ntium 90
Pentium 100
SPARC+
erPC601
PowerPC603
rPC604
HP7100
ha21064
4400SC
Cyrix M1
UNIX SPE
Pe
Pow
Powe
Alp
MIPS R
Cint92
MIPS R4400SC
Cyrix M1
Pentium 60
Pentium 66
Pentium 75
Pentium 90
Powe
HP7100
Alpha21064
Pentium 100
SPARC+
rPC601
PowerPC603
PowerPC604
0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150
MIPS R4400SC
Cyrix M1
UNIX SPECfp92
Pentium 90
Powe
HP7100
Alpha21064
PowerPC603
PowerPC604
Pentium 100
SPARC+
rPC601
Pentium 75
Pentium 60
Pentium 66
63
Általános CPU programozási információk
3. Fejezet: Általános CPU programozási információk
3.1. A memória felépítése
emór
echanizmus, mely több, független kevesebb RAM-ot és
ő nagy mtart
gző hardware a logikai címet a emszegmentált címtartomány címzéséhez szükséges lineáris címmé, a
programok és rendszerek egbízhatóságának növelése érdekében. Például megelőzhető az, hogy
program ensbe
A Pentium processzor buszára kapcsolt memória neve fizikai memória, mely 8 bites Byte-okból álló sorozatnak tekinthető. Minden Byte-nak megfelel egy és csakis egy, fizikai címnek nevezett cím, amelynek érteke 0-tól maximum 232-1-ig (4 GByte) terjedhet. A memória kezelését a megbízható és hatékony működés érdekében a hardware végzi. A memóriakezelés használata esetében a
rogramok nem érik el közvetlenül a fizikai memóriát, hanem egy pm iamodellt címeznek, melynek virtuális memória a neve. A memória kezelése szegmentálásból és lapozásból áll. A
egmentálás egy olyan mszcímtartományt biztosít. A lapozás mechanizmusagy bizonyos mennyiségű lemeztároló kapacitást igényle
cí ományú modelljét támogatja. Használható mindkét vagy csak az egyik módszer a kettő közül. Egy program által használt címek logikai címek. A szegmentálást vénlapozást végző hardware pedíg a lineáris címeket fizikai címekké alakítja át. A memória tekinthető egyetlen "lapos" címtartományként is, mint amilyen a fizikai memória; tekinthető azonban egy vagy több, egymástól független memóriarésznek is, melyek neve szegmens. Egy program legtöbb 16383 különböző fajta és méretű szegmenst használhat. A szegmensek felhasználhatók a megy program verme, túllépve a neki szánt területet, felülírja a
ódját képező utasításokat; ez a kód és a verem két külön szegmkvaló helyezésével érhető el. Így mindegyik szegmens meghatároz egy modult.
64
A memória felépítése
Mindkét, a lapos és a szegmentált modell is biztosítja a memória
édelmét. E két modell közt elhelyezkedő modellek szintén
címet képez.
k. Az lkalmazásfejlesztők számára a lapozás nem érzékelhető, részletek ezzel
a lapos modell. Bár nincs olyan zemmódbit vagy vezérlőregiszter amelyik a szegmentáló mechanizmust
zegmensnek ugyanarra a neáris címre való leképezésével. Ennek következtében minden emór
hardware védelmet nyújt a software hibák ellen. Ha egy logikai cím egy
vkiválaszthatók. Egy memóriamodell kiválasztásának szempontjait és azt, ahogyan a rendszerprogramozók egy modellt megvalósítanak, az alkalmazási terület határozza meg. Függetlenül attól, hogy több szegmens van használatban vagy sem, a logikai címek lineáris címekké való átalakítása a címeket egy szegmensen belüli ofszetnek értelmezve történik. Minden szegmensnek van egy szegmensdeszkriptora, mely tartalmazza a szegmens báziscímét és mérethatárát. Ha az ofszet nem haladja meg ezt a határt, és nincs más feltétel, mely megakadályozná a szegmenshez való hozzáférést, az ofszet és a báziscím összeadódik és a lineáris Ha a CR0 regiszter 31. bitje törölve van (a CR0 regisztert lásd később), a szegmentálásból adódó lineáris cím fizikai címként lesz felhasználva. Ez a regiszterbit határozza meg hogy használatban van-e lapozás vagy sem. Ha a bit 1-re van állítva, a lineáris cím fizikai címmé való átalakítását a lapozó hardware végzi. Ha több szegmens van használatban, ezek részei az alkalmazásfejlesztő által használt programozási környezetneakapcsolatban később. 3.1.1. Nemszegmentált vagy "lapos" modell A legegyszerűbb memóriamodellükikapcsolná, ugyanez a hatás érhető el minden slim iaművelet ugyanarra a memóriatartományra fog vonatkozni. A lapos modellben a szegmensek lefedhetik a fizikai címek egész skáláját vagy csupán azokat a részeket, melyek a fizikai memóriába vannak leképezve. A kisebb címtartomány előnye, hogy egy minimális
65
Általános CPU programozási információk
nemlétező címet (melyhez nem tartozik memória) jelöl, akkor egy kivétel keletkezik (kivételeket lásd később).
.1.2. Szegmentált modell
mutatásra kerülő címátalakító mechanizmus segítségével épezi le. A programozóknak ezt a leképezést nem kell figyelembe
fszetek és minden egyes szegmenshez való hozzáférés külön llenőrizhető.
- a szegmensen belüli 32 bites cím.
3 A memória felépítésének szegmentált modellje a logikai címek tartományát 16383, egyenként maximum 4 GByte méretű szegmensre osztja, melyek nagysága összesen 246 Byte (64 TByte). Ezt a 64 TByte logikai címtartományt a fizikai címtartományra a processzor a későbbiekben bekvenniük. A szegmentált modell előnye az, hogy a címtartományokon belüli oe Egy, a szegmentált címtartományt címző pointer két részből áll (lásd a 3.1 ábrát). 1. Szegmensszelektor - a szegmenst azonosító 16 bites mező. 2. Ofszet
3.1. ábra: Szegmentált címzés
66
Regiszterek
3.2. Regiszterek A processzornak tizenhat, a programozók által használható regisztere van. Amint azt a 3.2. ábra is mutatja. Ezek a következőképpen soportosíthatók:
nyolc darab 32 bites regisztert a programozó szabadon használhatja.
é teszik annak megváltoztatását.
.2.1. Általános regiszterek
is (kivéve az ESP gisztert, mely nem használható indexoperandusként). A felsorolt
X, CX, DX, BP, SP, SI, DI ltalános regisztereinek neveiből származnak. Ahogy a 3.2. ábra is utatja
lsó Byte-ok).
c 1. Általános regiszterek. Ezt a
2. Szegmensregiszterek. Ezek a regiszterek a különböző memóriahozzáférési módokhoz hozzárendelt szegmensszelektorokat tartalmazzák. A kód- és veremterülethez való hozzáférés például külön szegmensregiszterek segítségével történik. Ez a hat regiszter a pillanatnyilag hozzáférhető memóriaszegmenseket határozza meg. 3. Állapot- és vezérlőregiszterek. Ezek a regiszterek a processzor
állapotáról adnak tájékoztatást és lehetőv
3 Az általános regiszterek az EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI 32 bites regiszterek. Ezek a regiszterek a programozó által szabadon választott értékeket tartalmazhatnak (logikai, aritmetikai műveletek operandusait, eredményét stb). Ezenkívül tartalmazhatják még a címszámításokhoz szükséges operandusokatreregiszterek nevei a 8086 processzor AX, Bám , ezekkel a nevekkel lehet hivatkozni a 32 bites regiszterek alsó 16 bitjére. Az AX, BX, CX és DX 16 bites regiszterek mindkét Byte-jának saját neve is van. A Byte-regiszterek elnevezése a következő: AH, BH, CH és DH (felső Byte-ok) illetve AL, BL, CL és DL (a
67
Általános CPU programozási információk
Általános regiszterek
AH AL AX
1516
Szegmens regiszterek
Státusz és vezérlõ regiszterek
DH DL
CS
EFLAGS
DXEAXEDX
16-BIT 32-BIT
ESP
07831
giszter rendelkezésre áll, gyes utasítások azonban operandusaik tárolására csak bizonyos
operandusként az CX (ciklusszámláló), ESI (forrásindex) és EDI (célindex) regisztereket
BH BLCH CL
BPSIDISP
BXCX
EBXECX
EBPESIEDI
SSDSESFSGS
EIP
3.2. ábra: Alkalmazások számára elérhető regiszterkészlet A címszámítások és legtöbb aritmetikai illetve logikai művelet eredményei számára minden általános célú reeregisztereket használnak fel. Például a füzérutasítások Ehasználják. Ezen műveletekhez specifikus regisztereket hozzárendelve az utasításkészlet tömörebben kódolható. A specifikus regisztereket használó
68
Regiszterek
utasítások a következők: duplapontosságú szorzás és osztás-, I/O-, füzér-, transzlatáló, ciklus-, különböző eltoló- és forgató-, valamint veremműveletek. 3.2.2. Szegmensregiszterek A szegmentáció a rendszertervezők számára rugalmasságot nyújt a különböző memóriafelépítési modellek közti választásban. A szegmensregiszterek a 16 bites szegmensszelektorokat tartalmazzák, melyek egy, a memóriában elhelyezkedő táblázatot indexelnek. Ez a
blázat tartalmazza a szegmensek báziscímét, valamint a ntált modell
inden egyes szegmens ugyanarra a fizikai memóriatartományra való
áll ndelkezésre, ezeknek szelektorait a CS, DS, SS, ES, FS és GS egmensregiszterek tartalmazzák. Minden regiszterhez egy külön emóriaelérési mód tartozik (kód, adat, vagy verem); mindegyik
ak közül (lásd a 3.3 brát). Más szegmensek is használhatók, ezek szegmensszelektorát be
telek és a vezérlést egmensek közt átadó utasítások (például CALL, RET vagy JMP)
p autómatikusan égzi).
támemóriahozzáférést illető információkat. Nem szegmemleképezésével valósítható meg. A memóriában egy adott pillanatban hat szegmensreszmregiszter egy szegmenst jelöl, a program által használtákell tölteni a megfelelő szegmensregiszterbe. Kódszegmens a neve annak a szegmensnek, mely a végrehajtandó utasításokat tartalmazza. Ennek szegmensszelektorát a CS regiszter tartalmazza. A processzor a kódszegmensben levő utasításokat olvassa be, a szegmensen belüli ofszetként az EIP regiszter tartalmát felhasználva. A CS regiszter feltöltése a megszakítások, kivészvégrehajtása eredményeképpen történik (a számítógév Egy eljárás meghívása előtt szükséges egy memóriarész kijelölése a verem számára. A verem tartalmazza a visszatérési címet, a hívórutin által átadott paramétereket, valamint az eljárás által igényelt ideiglenes változókat. A veremszegmens azonosítására minden veremművelet az SS
69
Általános CPU programozási információk
regisztert használja, mely a CS regiszterrel ellentétben külső módon feltölthető; így az alkalmazás saját maga építhet fel vermeket. A DS, ES, FS és GS regiszterek lehetővé teszik, hogy egyszerre
égy adatszegmens álljon rendelkezésre. A négy adatszegmens biztosítja onságos
ozzáférést. Például külön-külön adatszegmens hozható létre az aktuális odul
. Ha egy programhiba következtében a program futása sszezavarodik, a szegmentáló mechanizmus a hiba által okozott kárt a
nsek elérése érdekében a DS, ES, FS és GS regiszterek az
en is feltölthetők. Az egyetlen teendő a
megtörténne.
s szegmens báziscíme tárolva van. Egy
s címzése egy regiszterben vagy maga az utasítás testében egadott ofszet segítségével történik. Azt, hogy melyik
na különböző típusú adatstruktúrákhoz való hatékony és bizthm adatstruktúrái, a magasabb szintű modulból exportált adatok, egy dinamikusan létrehozott adatstruktúra és a más programokkal megosztott adatok számáraöprogram által foglalt szegmensekre korlátozza.
Az adatok szerkezetétől függően (vagyis hogyan vannak az adatok szegmensekre osztva) a program több szegmenshez is igényelhet hozzáférést. A további
Kód szegmens
Stack szegmens
CS
SSszegme
1. adatszegmens
3. adatszegmens
S
S
alkalmazói program futása közb
megfelelő szegmensregiszter feltöltése, még mielőtt az illető szegmens adataihoz való hozzáférés
Minden egye
szegmensen belüli adat megcímzéséhez a 32 bites ofszetet
hozzá kell adni a szegmens báziscíméhez. A szegmens kiválasztása (a szegmensszelektornak a szegmensregiszterbe való betöltése által) után az utasításnak csak az ofszetet kell megadnia. Az adatszegmensen belüli operandum
2. adatszegmensE
FS
4. adatszegmensGS
D
3.3. ábra: Szegmentált memória
70
Regiszterek
szegmensregiszter használandó akkor, amikor csak egy ofszet van egadv
utató (EIP) regiszter az aktuális kódszegmensben vő következő végrehajtandó utasítás ofszetjét tartalmazza. Az
utasítások (ugrások, hívások, stb.), egszakítások és kivételek végzik.
.2.4. A verem felépítése és használata
giszter támogatja:
e csak egy verem állhat rendelkezésre. Az, amelynek
asználja.
V
tartalmazza. A veremmutatót a PUSH és POP utasítások, szubrutinhívások és visszatérések, kivételek, valamint
.4. ábra) a processzor csökkenti az ESP regisztert, majd beírja az
m a, egyszerű szabályok határozzák meg. 3.2.3. Utasításmutató Az utasításmleutasításmutató nem áll közvetlenül a programozó rendelkezésére, kezelését a vezérlésátadó m Az EIP regiszter egyik utasítás kezdőcíméről a következőére ugrik. Az utasítások előbetöltése miatt az EIP az utasításokat a processzorba betöltő busz aktivitásáról csak egy hozzávetőleges tájékoztatást ad. Az utasítások előbetöltésének részletes leírása egy későbbi fejezetben található. 3 A veremműveleteket három re 1. Veremszegmens (SS) regiszter. A verem a memóriában helyezkedik
el. Egy rendszerben a vermek számát a használható szegmensek maximális száma korlátozza. A verem nagysága maximálisan 4 GByte lehet, vagyis egyenlő egy szegmens maximális méretével. Egyszerrszelektorát az SS regiszter tartalmazza. Ez az aktuális verem. A processzor minden veremművelethez automatikusan az SS regisztert h
2. eremmutató (ESP) regiszter. Az ESP regiszter a verem tetejét
(TOS - Top-Of-Stack) az aktuális veremszegmensen belüli aktuális ofszetet
megszakítások használják. Egy adat veremre való ráhelyezésekor (3
71
Általános CPU programozási információk
adatot az új TOS-ba. Amikor egy adatot kivesz a veremből, a pr
a memóriában a verem lefele nő, a kisebb címek irányába.
. Veremkeret-bázismutató (EBP) regiszter. Az EBP regiszter je
tinra, a verem a visszatérési címet és az illető szubrutinnak átadott adatstruktúrákat tartalmazza. A szubrutin megnöveli a
szü eképpen az ideiglenes változók veremből való ki- és behelyezése által a veremmutató nő illetve csökken. Ha a
tt valami is a verembe került volna, akkor a bázismutató felhasználható a rögzített ofszetű adatstruktúrák elérésére. Ha ez nem így történt,
zet az időszakos változók által elfoglalt hely függvényében változni fog.
3.2.5. Flagregiszter Az feltételkódokat (azaz átvitel, előjel, túlcsordulás) és állapotbiteket, (gyüjtőnevükön: flageket), az EFLAGS nevű 32 bites regiszter tartalmazza. A flagek elrendezését a regiszteren belül a 3.5. ábra mutatja be. Az flagek a Pentium processzor állapotáról adnak tájékoztatást, ezenkívül egyes műveletek végrehajtását irányítják. Az állapot- és vezérlő flagbiteken kívül a flagregiszter még rendszerflageket is tartalmaz.
ocesszor kimásolja azt a TOS-ból, majd növeli az ESP regisztert. Másképpen fogalmazva
3
llemző felhasználási módja a vermen keresztül átadott paraméterekhez való hozzáférés. Amikor a vezérlés átadódik egy szubru
vermet, amennyiben ideiglenes lokális változói számára helyre van ksége. Ennek eredmény
veremmutató értéke azelőtt volt a bázismutatóba másolva, mielő
akkor egy adatstruktúrát azonosító ofs
Az EBP regiszter által történő memóriacímzés az aktuális veremszegmenst (SS regiszter) használja. Mivel a veremszegmenst nem kell külön megadni, az utasításkód tömörebb. Az EBP regiszter más szegmensek címzésére is használható, de ekkor a szegmenst külön meg kell adni (MOV AX,GS:[EBP]). Az olyan utasítások, mint az ENTER és LEAVE, a változókhoz való könnyebb hozzáférés érdekében az EBP regisztert automatikusan beállítják.
72
Regiszterek
SS
ESP Az utoljára behelyezett adat
SS
ESP Új behelyezett adatÚj
Régi
3.4. ábra: A verem működése 3.2.5.1. Állapotbitek Az EFLAGS regiszter állapotbitjei az olyan aritmetikai utasítások eredményének jellegéről adnak számot, mint az ADD, SUB, MUL vagy DIV. A MOV utasítás nincs hatással ezekre az állapotbitekre. A feltételes ugrások és szubrutinhívások lehetővé teszik, hogy a program érzékelni tudja az flagek állapotát és ezektől függően cselekedjen. Amikor egy ciklusszámláló értéke a csökkentések során elérte a nullát, a ZF bit állapota 1 lesz, e változás miatt a ciklus elejére való ugrást megvalósító feltételes ugróutasítás nem hajtódik végre, és a ciklus megszakad. Az állapotbiteket a 3.6. ábra mutatja be külön.
73
Általános CPU programozási információk
EFLAGS3130292827
000
2625242322212019
00000IDVIPVIF
X ID FLAGX LÁTSZÓLAGOS MEGSZAKÍTÁS-FELFÜGGESZTÉSX LÁTSZÓLAGOS MEGSZAK
1817
14
7
00
ACVM
NT
SF
ÍTÁS FLAGX ILLESZKEDÉS ELLENÖRZŐX 8086 VIRTUÁLIS MÓD
ATÁST JELZŐ FLAG
X BEÁGYAZOTT TASZK
S ELŐJEL FLAG
C - VEZÉRLŐ FLAGX - RENDSZER FLAG
1,0 - NEM HASZN
1615
RF0
X FOLYT
13121110
98
IOPL
OFDFIFTF
X I/O PRIVILÉGIUM SZINT
S TÚLCSORDULÁS FLAGC IRÁNY FLAGX MEGSZAKÍTÁS ENGEDÉLYEZŐ FLAGX CSAPDA FLAG
56
43210
ZF
AF0
0
PF1CF
S ZERO FLAG
S FÉL-ÁTVITEL FLAG
S PARITÁS FLAG
S ÁTVITEL FLAG
S - STÁTUSZ FLAG
ÁLT, INTEL ÁLLTAL FENNTARTVA
ter
3.5. ábra: Az EFLAGS regisz
74
Regiszterek
Név Szándék Kialakulási feltétel OF Túlcsordulás Az eredmény meghaladta a pozitív vagy
negatív határt SF Előjel Az eredmény negatív ZF Zero Az eredmény nulla AF Félátvitel Átvitel történt a 3. biten (BCD-nél
használatos) PF Paritás Az eredmény alsó Byte-jában páros számú 1
bitek vannak CF Átvitel A legfelső bitről átvitel történt
3.6. ábra: Állapotbitek
Az EFLAGS regiszter DF vezérlőbitje a füzérutasítások irányát vezérli. (10. bit) A DF bit beállítása a füzérutasítások csökkenő memóriatartomány felé történő végrehajtását eredményezi, vagyis a füzérek feldolgozása a magasabb címek felől az alacsonyabb címek irányába tart. A DF bit törlése fordított irányú feldolgozást eredményez. 3.2.6 Rendszer-regiszterek A rendszerprogramozóknak szánt regisztereket a következő kategóriákba sorolhatjuk: - EFLAGS regiszter - memóriaszervező regiszterek (memory management ) - vezérlő regiszterek (control) - nyomkövető regiszterek (debug) A rendszer-regiszterek vezérlik a felhasználói programok végrehajtó környezetét. Az operációs rendszerek többsége a felhasználói programok számára korlátozza ezen lehetőségeket. (Mindamellett
75
Általános CPU programozási információk
szerkeszthetünk olyan operációs rendszereket is, amelyprogram a legprivilegizáltabb szinten fut, ez esetben a felhasználói
rogramoknak me
ekben minden
gengedett e lehetőségekbe való beavatkozás.)
A 0-val illetve 1-el jelölt bitpozíciók az Intel által fenntartottak. asználatuk nem ajánlott. Mindíg a megelőző kiolvasáskor kapott
- (Id
ultita
egszakítás bit (19. bit)
p 3.2.6.1. Rendszer-flagek Az EFLAGS regiszter rendszer-flagjei vezérlik az I/O műveleteket, a maszkolható megszakításokat, a nyomkövetést, a taszkcserét, illetve a virtuális 8086-os üzemmódot. Egy felhasználói programnak ezeket a flageket nem kell figyelembe vennie, és tilos számára az állapotuk megváltoztatását megkísérelni. Egyes operációs rendszerekben egy rendszerflag állapotának megváltoztatását célzó kísérlet kivételt idéz elő. A fent említett flageket a 3.5. ábra szemlélteti. Hértékekre állítandók. ID entification Flag) azonosító flag, (21. bit) Ha egy program képes arra, hogy az ID flaget magasra, illetve alacsonyra állítsa, azt jelenti, hogy a processzor támogatja a CPUID utasítást. Lásd cpu azonosítása. VIP - (Virtual Interrupt Pending Flag) virtuális megszakításfelfüggesztés bit (20. bit)
Ez a flag a VIF flaggel együtt lehetővé teszi minden egyes, m szkos környezetben futó felhasználói program számára, hogy a rendszer IF flagjének egy virtuális verzióját használhassa. Részletes útmutató ezen flagek virtuális 8086-os, illetve védett üzemmódú használatáról a függelékben található.
IF - (Virtual Interrupt Flag) virtuális mV A VIF flag egy virtuális képe az IF (Interrupt Flag) megszakítás flagnek, a VIP-el együtt használatos.
76
Regiszterek
AC - (Alignment Check Mode) illeszkedés-ellenőrzés (18. bit) Az AC flag és a CR0 regiszterbeli AM bit magasra állításával
ET) lehetővé válik a memóriahivatkozások illeszkedésének ellenőrzése. atkozás, mint
éldául egy páratlan címen elhelyezkedő 16 bites szóra, vagy egy néggyel o
még abban az esetben sem, ha ezt egy felhasználói ódbeli memóriahivatkozás okozná.
lyes leszkedését, mint például az i860-as. Az illeszkedési kivételt az rtelme
ás, mint a 8086-os processzor rogramozási környezetének emulálása.
F - (Resume Flag) folytatás jelző bit (16. bit)
Az RF bit ideiglenesen letiltja a nyomkövetési hibákat (debug
ults), annak érdekében, hogy egy debug fault után újra folytatni lehessen egy utasítást, anélkül, hogy közvetlenül egy újabb nyomkövetési hibát okozna. A hibakereső (debugger) az IRETD utasítással állítja magasra ezt a bitet, a megszakított programba való visszatérés
(SValahányszor egy illeszkedési hibás operandusra kerül hivpnem sztható címen levő doublewordra, egy illeszkedési kivétel jelentkezik. Az illeszkedési kivételek csak felhasználói módban (user-mode) (3. privilégium szinten) generálódnak. Azok a memóriahivatkozások, amelyek alapértelmezése a 0. privilégium szint, mint például a szegmensdeszkriptorok betöltése, nem okozzák a fenntemlített kivételtm Az illeszkedési kivételt fel lehet használni az adatok illeszkedésének ellenőrzésére. Ez akkor lehet hasznos, ha egy olyan processzorral cserélünk adatokat, amely megköveteli minden adat heilé zőprogramok (interpreters) arra is felhasználhatják, hogy bizonyos mutatókat (pointereket) speciálisan megjelöljenek hibás illesztéssel. Ezáltal elkerülhetők a mutatók egyenkénti ellenőrzésének költségei, és így az alkalmazás pillanatában csak a speciális mutatókat kezelik. VM - (Virtual-8086 Mode) virtuális 8086-os üzemmódjelző bit (17. bit) Magasra állítva a VM flaget a processzort virtuális 8086-os üzemmódba hozzuk, amely nem mp
R
fa
77
Általános CPU programozási információk
pillanatában. A POPF, POPFD, vagy IRET utasítások nem befolyásolják az RF flaget. NT - (Nested Task) egymásba ágyazott taszkokat jelző bit (14. bit) A processzor beállítja, illetve teszteli az NT flaget, hogy vezérelje a megszakított és meghívott taszkok egymásba láncolását. Az NT flag befolyásolja az IRET utasítás végrehajtását, ugyanakkor a POPF, POPFD, és IRET utasítások befolyásolják az NT flaget. Ezen flag értékének helytelen megváltoztatása váratlan kivételeket generálhat a felhasználói programokban. IOPL - (I/O Privilege Level) I/O privilegizált szintet jelző bitek (12. és 13. bit) Az I/O privilegizálási szintet a védelmi mechanizmus az I/O címtartományhoz való hozzáférés ellenőrzésére használja. Az aktuálisan végrehajtás alatt álló szegmens privilégiumszintje (CPL) és az IOPL értéke határozzák meg azt, hogy a POPF, POPFD, és IRET utasítások módosíthatják-e ezen mező értékét. További információk a második kötetben.
- (Interrupt-Enable Flag) megszakítás-engedélyezést jelző bit (9. bit) Ha IF magas logikai szintre van állítva, a processzor válaszol a maszkolható megszakítás kérésekre (INTR megszakítások). Alacsonyra állítva ezt a bitet letiltjuk ezeket a megszakításokat. Az IF flag nincs hatással sem a kivételekre, sem a nemmaszkolható megszakításokra (NMI megszakítások). A CPL illetve IOPL határozzák meg, hogy a CLI, STI, POPF, és IRET utasítások változtathatnak-e ezen a biten. TF - (Trap Flag) csapda bit (8. bit) A TF flag magasra állítása a processzort - a hibakeresés érdekében - lépésenkénti végrehajtás üzemmódba helyezi. Ebben az üzemmódban a processzor minden egyes utasítást követően egy hibakereső kivételt (debug excepcion) generál, ezáltal lehetővé téve egy program ellenőrzését, miközben az egyenként hajtja végre az utasításokat. A
IF
78
Regiszterek
lépésenkénti végrehajtás csak egy a processzor által kínált számos hibakereső lehetőség közül. Ha egy felhasználói program a POPF, POPFD, vagy IRET utasítások egyikével magasra állítja a TF flaget, egy hibakereső kivétel (debug exception) generálódik. 3.2.6.2. Vezérlőregiszterek
.7. ábra a CR0 3 É vezérlőregiszterek formátumát mutatja be. Az operációs rendszerek túlnyomó része
ja a felhasznál t abban, h regisztereket thessék (habár ez élküli ren engedett). A ználói programok olvashatják ezeket a regisztereket, példának
kedvéért a CR0-t olvasva meghatározhatják, hogy a numerikus koprocesszor jelen van-e. A MOV utasítás k ehetővé teszik, hogy ezeket a regisztereket feltölthess essük az általános regiszterekből, illetve regiszterekbe. P
V EAX, CR0
A CR0 regiszter rendszervezérlő bi amelyek üzemmódokat vezérelnek, vagy olyan állapotokat jeleznek, amelyek inkább általánosan a pr oznak taszkok végrehajtására. Egy pr a rezer elyikének
gk ált előző tt é lítan
PG - (Paging) lapozás bit ( CR0 31. bitje) Ha ez a bit magas, a lapozás mtiltott.
Ha a lapozás alatt kivétel generálódik, a CR2-es regiszterbe kerül 2 bites lineáris telt ézte. A lapozás alatt
ét lásd ké
A 3 , CR1, CR2, CR S CR4
meggátol ói programoka ogy a vezérlőfeltöl egy védelem n dszerben megfelhas
ülönböző formái lük vagy elmenthéldául:
MOMOV CR3, EBX
teket tartalmaz,
ocesszorra vonatk , mintsem egyediogramnak tilos vált bitek valam
megváltoztatását mekiolvasásukkor kapo
ísérelni. A rezervs ál
biteket mindig azrtékekre tanácso i.
egengedett, ha alacsony, a lapozás
az a 3 cím, amely a
skivé előid
létrejött kivételek (page faults) kezelé sőbb.
79
Általános CPU programozási információk
10
23456789
101112131415161718192021
2425262728293031
2223
10
23456789
101112131415161718192021
242526272829
2223
3031
CR0CCCR4
0
000
000000
00000000
TARTVA
RTVA
E
LAP
B
PSEDE
PP
NE
Ha lapozást használunk, a CR3-as regiszter tartalmazza a címt
nálható címbitként. Az 386-os processzorral ellentétben, 486-os illetve a Pentium processzorok ezek közül két bitnek
D -
R1CR2R3
0MCE
00
000
00
FENN
FENNTA
LAPHIBA
LINEÁRIS
CÍM
CÍMTÁR
ÁZIS
TSDPVI
VME
CDWT
MPEMTSETNE
AM
WP
PGCDNW
A vezérlő regiszterek f3.7. ábra: elépítése
lap ár (a felső szintű laptáblázat) címének 20 legjelentékenyebb bitjét. A CR3-as regiszter a lapcímtár báziscím-regisztere (PDBR Page Directory Base Register) néven is ismert. Megjegyzendő, hogy a lapcímtárnak is lapkeret illeszkedésűnek kell lennie, ezért a regiszter alsó
2-bitje nem hasz1ajelentőséget tulajdonítanak. Ezek: PC (Page-Level Cache Disable) lapszinti cache-letiltás bit (CR3 4.
bitje) Ha a lapozás megengedett, a lapozást nem használó buszciklusok mint például a megszakítás elismerő ciklusok idején ennek a bitnek az
80
Regiszterek
állapota megjelenik a processzor PCD vonalán. Ha a lapozás nem engedélyezett, ez az információ minden egyes buszciklus idején
egjelenik. A PCD vonalat (pin-t) egy külső cache-be történő pufferelés
álják.
D - (C
először invalidálni kell. A cache-elésre vonatkozó információkat sd később.
Ha ez a bit 0-ra van állítva, engedélyezi a cache átírást (write-, ha 1-re van állítva, letiltja a
ache-invalidáló ciklusokat és azokat az átírásokat, amelyek cache-
m(caching) ciklusonkénti vezérlésére használják. PWT - (Page-Level Writes Transparent) lapszinti átlátszó átírás bit (CR3
3. bitje) Ha a lapozás megengedett, a lapozást nem használó buszciklusok mint például a megszakítás elismerő ciklusok idején ennek a bitnek az állapota megjelenik a processzor PWT vonalán. Ha a lapozás nem engedélyezett, ez az információ minden egyes buszciklus idején megjelenik. A PWT vonalat (pin-t) egy külső cachen történő átírás (write-through) ciklusonkénti vezérlésére haszn C ache Disable) cache-letiltás bit (CR0 30. bitje) Ha ez a bit 0-ra van állítva, engedélyezi a cache feltöltő mechanizmust, ha 1-re, letiltja azt. Ha ez a bit 1-es, a cache-vesztések (cache misses) nem okoznak cache feltöltést. Megjegyzendő, hogy a cache-találatok nincsenek letiltva; ahhoz, hogy teljesen kiiktassuk a cache-t,lá NW - (Not Write-through) átírástiltás bit (CR0 29. bitje) through) és a cache-invalidáló ciklusokatctalálatosak. A cache-használatra vonatkozó információkért lásd később. AM - (Alignment Mask) illeszkedési maszk (CR0 18. bitje) Ha ez a bit 1-es, az illeszkedés ellenőrzés engedélyezett, ha 0, letiltott. Az illeszkedés ellenőrzésre csak abban az esetben kerül sor, ha az AM bit és az AC flag is 1-es, és a CPL értéke 3 (felhasználói mód).
81
Általános CPU programozási információk
W Write Protect) írásvédelem bit (CR0 16. bitje) Ha 1-re van állítva, ez a bit levédi a felhasználói- szintű lapokat a felügyelőprogram-szinti írás ellen. Ha ez a bit értéke 0, a “csak olvasható”, felhasználói-szintű lapokra a felügyelőprogram írhat is. Ez a lehetőség hasznosnak bizonyul, ha az ún. "írás közbeni másolás" megoldást (copy-on-write) akarjuk megvalósítani ú
P - (
j, származtatott szkok (processes) létrehozására (forking), amely egyes operációs ndszerekben (például az UNIXban) használatos.
E - (Numeric Error) numerikus hiba bit (CR0 5. bitje)
onalakat külső logikával PC-típusú hibajelentések létrehozására asználják.
ővítés bit (CR0 4. bitje)
S - (Task Switched) taszkkapcsolás bit (CR0 3. bitje)
szkkapsolás alkalmával beállítja a
tare N Ha ez a bit magasra van állítva, a lebegőpontos numerikus hibák jelentésének standard mechanizmusa engedélyezett. Ha NE=0 és az IGNE# bemenet aktív, a numerikus hibákat a processzor nem veszi figyelembe. Abban az esetben, ha NE=0 és az IGNE# bemenet inaktív, a numerikus hibák arra késztetik a processzort, hogy megálljon, és egy megszakításra várjon. A megszakítás a FERR# vonal segítségével generálódik, amely a megszakítás kontroller egyik bemenetét hajtja meg (a FERR# vonal emulálja az 287-es és 387-es matematikai koprocesszorok ERROR# vonalát). Az NE bitet, az IGNE# és a FERR# vh
T - (Extension Type) koprocesszorral bE Ez a bit azt mutatja, hogy a processzor támogatja az 387 DX matematikai koprocesszor utasításkészletét (Pentium processzoroknál ez a bit fenntartott). T
A processzor minden egyes ta TS bitet, illetve teszteli azt, amikor a lebegőpontos numerikus utasításokat értelmezi. Ezzel a bittel lehetővé válik a numerikus kontextus mentésének illetve helyreállításának késleltetése mindaddig, amíg a numerikus adat
82
Regiszterek
ténylegesen felhasználásra nem kerül. A CLTS utasítás 0-ra állítja (RESET) ezt a bitet. EM - (Emulation) numerikus koprocesszor emulálása (CR0 2. bitje) Mikor az EM bit magas logikai szintre van állítva (EM=1), egy numerikus utasítás végrehajtása "nem létező koprocesszor" kivételt generál. Ha a processzornak nincs lebegőpontos egysége, az EM bitet 1-re kell állítani. MP - (Monitor coProcessor) koprocesszor monitorozó bit. Az 286-os és 386 DX processzorokban az MP bit a WAIT -
oprocesszorral való szinkronizálásra használatos- utasítás működését esszorok
rogramjait futtatjuk 486-os vagy Pentium processzorok FPU-ján, ez a bit telez
ME - (Virtual-8086 Mode Extensions) virtuális 8086-os üzemmód
kvezérli. Abban az esetben, ha 286-os vagy 386 DX procpkö ően 1-re állítandó. Az MP bitet resetelni kell a 486 SX processzor estében. PE - (Protection Enable) védett üzemmód engedélyező bit (CR0 0. bitje) A PE bit magas állapota engedélyezi a szegmens-szintű védelmet. A védelemről további információk a védett üzemmódnál A CR4-es regiszterben bizonyos architektúrális kiterjesztéseket engedélyező bitek találhatók. Ez a regiszter a Pentium proceszszorban jelenik meg először Vkiterjesztések bit (CR4 0. bitje) Ez a bit magasra állítva támogatja egy virtuális megszakítás engedélyezést jelző flag virtuális 8086-os üzemmódbeli alkalmazását. Ezen "adottság" javítani képes a virtuális 8086-os üzemmódban futó alkalmazások teljesítményén, mégpedig úgy, hogy megszünteti a költségeit egy virtuális 8086-os monitorba való fault kivétellel történő- "kiugratásnak", bizonyos utasítások emulálásakor. Lásd a függelékben.
83
Általános CPU programozási információk
PVI - (Protected-Mode Virtual Interrupts) védett üzemmódú virtuális megszakítások (CR4 1. bitje) Ez a bit magasra állítva támogatja egy virtuális megszakítás
Ennek a bitnek a magasra állítása engedélyezi az I/O
E - (
gről a függelékben lálhatók.
Enable) géptípus ellenőrzés engedélyezését jelző bit (CR4 6. bitje)
.2.6.3. Nyomkövető regiszterek
engedélyezést jelző flag védett üzemmódbeli alkalmazását. Ezen tulajdonság lehetővé teszi a 0. privilegizálási szintre tervezett programok számára, hogy a 3-as privilégiumszinten fussanak. További információk a függelékben. TSD - (Time Stamp Disable) time stamp-számláló olvasás tiltása (CR4 2. bitje) Ezt a bitet 1-re állítva az RDTSC utasítás (Read from Time Stamp Counter) privilegizált utasítássá válik. Részletek az RDTSC utasításról a 2. kötetben. DE - (Debugging Extensions) hibakeresés kiterjesztések bitje (CR4 3. bitje) töréspontokat. Lásd később. PS Page Size Extensions) lapméret kiterjesztések bitje (CR4 4. bitje) Ennek a bitnek a magasra állítása engedélyezi a 4 MByte-os lapméretet. További információk erről a lehetőséta MCE - (Machine Check
Magasra állítva ezt a bitet, engedélyezzük a géptípus ellenőrző kivételt. 3
84
Regiszterek
A nyomkövető regiszterek fejlett hibakereső képességgel látják el a processzort, beleértve az adat töréspontokat és annak lehetőségét, hogy a kódszegmens módosítása nélkül az utasítások közé töréspontokat
reakpoints) szúrhassunk (hasznos lehet a ROM-ra alapozott software-ek
progegy haszn 3.8. ábra illusztrálja.
(bnyomkövetése esetén). Csak a legmagasabb privilégiumszinten futó
ramok képesek ezekhez a regiszterekhez hozzáférni. A későbbiekben teljeskörű leírást kaphatunk ezen regiszterek felépítéséről és álatáról. A nyomkövető regisztereket a
10
23456789
10
10
23456789
10111213141516171819202122232425262728293031
DR7 DR6 DR5 DR4 DR3 DR2 DR1 DR0LEN
R1
0
11121314
2223242526
31
15161718192021
27282930 3
LEN
LEN
R/W
R/W
3
2
2
/W1
LEN
R/W0
00
GD
00
1GELEG3L3G2L2G1L1G0L0
B3B2B1B0
BD
BTBS
1111111111
1
11111
FENNTARTVA FENNTARTVA LINEÁRISCÍME
LINEÁRISCÍME
LINEÁRISCÍME
SPONTLINEÁRIS
CÍME
TÖRÉSPONT3.
TÖRÉSPONT2.
TÖRÉSPONT1.
TÖRÉ0.
111111111
3.8. ábra: Nyomkövető regiszterek
85
Általános CPU programozási információk
3.3. CPU üzemmódok 3.3.1. Valós üzem
mód ("valós mód")
Ez az üzemmód az Intel 8086 processzor programozási
llítja, melyből egyetlen utasítás gítségével átkapcsolható a védett módba.
támogatja. Minden új mikroprocesszorra (kezdve az 386 SL-től) jellemző az SMM, mely egy operációs rendszer- és alkalmazásfüggetlen, ezek számára transzparens mechanizmus. Ezen mechanizmus segítségével implementálhatók a rendszerteljesítményt menedzselő és OEM megkülönböztető funkciók. Az SMM-be való belépés egy külső megszakításvonal (az SMI#)
környezetét valósítja meg, biztosítva egy pár kiterjesztést (ilyen például az ebből a módból való kilépés lehetősége). A reszet általi inicializálás a processzort a valós üzemmódba áse 3.3.2. Védett üzemmód Ez a processzor natív állapota. Ebben az üzemmódban az összes utasítás és architekturális jellemző elérhető, biztosítva a legnagyobb teljesítményt és képességeket. Minden új alkalmazás és operációs rendszer számára ez az ajánlott üzemmód. A védett mód által nyújtott lehetőségek közé tartozik 8086-ra írt "valós módú" software multitaszking, védett módú környezetben történő közvetlen végrehajtása. Ennek a lehetőségnek a neve 8086-os virtuális mód (vagy "V86 mód"). A 8086-os virtuális mód valójában nem a processzornak egy üzemmódja, hanem egy attribútum, amelyet védett módban, megfelelő software segítségével, bármely taszk számára beállítható. 3.3.3.Rendszermenedzselő üzemmód A Pentium mikroprocesszor a rendszermenedzselő üzemmmódot (SMM - System Management Mode) is
86
CPU üzemmódok
aktiválásával történik, mely a CPU-t egy különálló címtartományra apcsolja át, lementve a CPU teljes állapotát. Ennek következtében az k
SMM-specifikus kód végrehajtása transzparens. Az SMM-ból való visszatéréskor az előző műveletek fordítottja hajtódik végre.
87
Általános CPU programozási információk
3.4. Inicializálás és az üzemmódok közötti tkapcsolás
e égrehajtását. Inicializáláskor a processzor a modell és revíziószámmal
hogy milyen hetőségek állnak a software rendelkezésére. Annak módját, ahogyan az
alkalmfeltérkérész a processzor kezdeti állapotáról nyújt információkat és tárgyalja a va s álásának követelményeit, a két üzemm en része az
icializáló folyamatnak. A védett üzemmódba való átkapcsolást egy
.4.
RESeghatározott állapotba kerülnek. Ezek a meghatározott állapotok, mint
éldául az EBvégrehajt ek után felépítheti a memóriá a rá nt például a GDT és IDT táblázatok, m a azói software-ek használnak. A RESE(TLB-k) és elágazás célpufferek (BTB-k) működése letiltódik.
álasza akkor is, ha jelzést kap a futás üg
ggel, hogy nem változtatja meg a
első cache-ek és modell specifikus regiszterek állapotát, valamint a
á A hardware reszetet követően a processzor egy jólmeghatározott alapállapotba kerül annak érdekében, hogy megkezdhesse a softwarvkapcsolatos információkat nyújt annak meghatározására, le
azások a rendelkezésükre álló lehetőségeket futásidőben pezik, egy későbbi fejezet tárgyalja, egy példa kíséretében. Ez a
ló és védett üzemmód konfiguród közti átkapcsolás folyamatát, mely normális esetb
inpéldaprogram mutatja be.
1. A processzor inicializálása 3 Az inicializálást a processzor RESET bemenete idézi elő. A
ET aktiválását követően a processzor egyes regiszterei egy jól mp P regiszter tartalma, elegendőek ahhoz, hogy a software
ása megkezdődjön. A software ezban z olyan adatstruk kat, mitú
lyeket a rendszer- és z alkalmeT aktiválásakor a belső cache-ek, fordítást gyorsító pufferek
A gép bekapcsolásakor a RESET jelet a hardware aktiválja. E jelet a hardware más esetekben is aktiválhatja; például a reszet általi inicializálás manuálisan is előidézhető, egy billentyűgomb segítségével. Reszetelés lehet a hardware vfelf gesztésére vagy a kikapcsolásra.
A Pentium processzornak egy INIT bemenete is van, mely a RESET-hez hasonlít, azzal a különbséb
88
Inicializálás és az üzemmódok közötti átkapcsolás
leb őpontos állapotot. Az INIT leheg etőséget nyújt a védettből a valós zemmódba való átkapcsolásra úgy, hogy a cache-ek tartalma megmarad.
3.4. eszt-kérés
egvalósítása a hardware-tervező feladata, amennyiben az öntesztre
(Az us, ezért az Intel nntartja a jogot magának az órajelek pontos számának bejelentés nélküli gv
regiszter tartalma nulla lesz. Ha a teszt után az EAX regiszterben nullától ülönböző érték van, ez azt mutatja, hogy a processzor hibás. Ha nem olt önteszt kérve, inicializálás után az EAX regiszter tartalma nulla.
Inicializálás után az EDX regiszter a processzor azonosítóját és a
3H. Ezt a ámot az inicializáló software kiválasztására felhasználva a bináris rgykód kompatibilissé tehető más Intel processzorokkal is. A DL
nosítószámát tartalmazza. Reszetelés után az DX regiszter felső szava fenntartott.
üAz INIT aktiválásakor a TLB-k és a BTB letiltódnak.
1.1. A processzor állapota reszetelés után
Bekapcsoláskor öntesztelés kérhető; az öntmszükség van. Az önteszt elvégzése körülbelül 219 órajelnyi időt igényel.
órajelek előbb említett száma modell-specifikfeme áltoztatására.) A processzorteszt hibamentes lefolyását követően az EAX
kv revíziójának számát tartalmazza (3.9. ábra). A DH regiszter a 3, 4 vagy 5 értékeket tartalmazza, melyek a Intel386, Intel486 illetve a Pentium CPU-t azonosítják. E családok különböző alosztályainak esetében a DH-ban más értékek is lehetnek, például az Intel386 SX CPU esetében 2sztáregiszter a revízió egyedi azoE
DLDH31 15 7 0
DX
EDX
FENNTARTVA ESZKÖZAZONOSÍTÓ
EGYEDIAZONOSÍTÓ
89
Általános CPU programozási információk
3.9. ábra: Az EDX regiszter tartalma reszetelés után
CR0 Reszetelés után31302928272625242322
18
1312
4
212019
17161514
AM
PGCDNW 1- Nem át-író tiltva
0 - Lapozás tiltva1 - Cache tiltva
0 - Illeszkedés ellenőrzés tiltv
FENNTARTVA
a
0 - Írásvédettség tiltvaWP
1110987
56
NE
32 EM
TS1
10 PE
MP
FENNTARTVA
0 - Külső FPU hiba
leteknél nincs c0 - Nincs taszk váltás0 - ESC műve0 - WAIT műveleteknél nincs c0 - Valós üzemmód
.10 után 3 . ábra: A CR0 regiszter tartalma reszetelés
90
Inicializálás és az üzemmódok közötti átkapcsolás
Pen etően a CR0 reg apo llapot a processzort val ba állítja és kikapcsolja a lapozást. A flagek és egyé iszte 1. ábra mutatja be. Regi
A tium processzor üzembe helyezését köviszter áll tát a 3.10. ábra mutatja (60000010H). Ez az á
ós üzemmódb reg reknek az üzembehelyezés utáni állapotát a 3.1
szter RESET - BIST nélkül
INIT
EFLAG 00000002h 00000002h EIP 0000FFF0h 0000FFF0h CR0 6000001 A CD és NW
biteket nem cseréli, a 4. bitet 1-be állítja, az
0h
összes többit törli. CR2, CR3, CR4 00000000h 00000000h CS szelektor=0F000h
bázis=0FFF0000h szelektor=0F000h
határ=0FFFFh
hozzáférhrtő
bázis=0FFF0000h határ=0FFFFh
tó, hozzáférhető
elérési jogok vannak, írható, olvasható,
elérési jogok vannak, írható, olvasha
SS, DS, ES, FS, GS szelektor=0000h bázis=0000h határ=0FFFFh elérési jogok vannak, írható,
szelektor=0000h bázis=0000h határ=0FFFFh elérési jogok vannak, írható,
olvasható, hozzáférhető
olvasható, hozzáférhető
E 000005xxh 000005xxh DX EAX hibátlan önteszt
esetén nulla 0
EBX, ECX, ESI, EDI, EBP, ESP
00000000h 00000000h
91
Általános CPU programozási információk
L szelektor=0000h bázis=00000000h határ=0FFFFh elérési jogok
szelektor=0000h bázis=00000000h határ=0FFFFh el
DTR
vannak, írható, olvasható
érési jogok vannak, írható, olvasható
GDTR, IDTR bázis=00000000h határ=0FFFFh
vannak, írható, olvasható
bázis=00000000h határ=0FFFFh
vannak, írható, olvasható
elérési jogok elérési jogok
DR0, DR1, DR2, DR3 00000000h DR6 FFFF0FF0h FFFF0FF0h DR7 00000400h 00000400h T Sime tamp számláló 0 Nem cseréli Vezérlkiválas
ő és esemény ztó
0 Nem cseréli
TR12 0 Nem cseréli Minden msp fi
ás modell eci kus regiszter
Nem definiált Nem cseréli
Adat éTLB-k
s kód Cache, Érvénytelen Érvénytelen
he zévannakszabad
.4.1 első v utas Egy cím ge a s iszter bázis része
ik a tén , kia a l Ez emmód yes, isc a
védett módban másképp történik, mint ódban. Egy utasítás
3.11. ábra: A processzor állapota a reszetelést követően
Az EFLAGS regiszter felső 10 bitjének állapota az üzembe lye st követően meghatározatlan. A meghatározatlan bitek fenn
tartva, a software végrehajtása egyik említett bit állapotától sem függjön.
3 .2. Az égrehajtott
nerálásához
ítás
zegmensregy hozzáadód
minden üzyleges címhez
érvénlakítva íg ineáris címet.
ím kiszámításaesetében habár a báza valós üzemm
92
Inicializálás és az üzemmódok közötti átkapcsolás
beolvaés így a kettő e
sásához a CS er bázis része hozzáadódik az EIP tartalmához gyüt lin
Valós üzem a ak tartalma megváltozik, akkor a bázis rész is megváltozik, ennek az
ek a 16-szo Reszetelés után azonban a CS bázisrésze edik yen z l,
ehelyett a CS szeleCS szelektor értékének a reszetelés utáni első megváltoztatása a fenti szabályt fogja követni (bázis = szelektor*16). Ennek ere az
andócímről fog történni M-ban l inicializáló kell elhelyezkedjen. A cím a Pentium fizi emóriájának legnagyobb címe alatt 16 Byte-tal van. Biztosítani kell, hogy az inicializálás befejezés távoli ugrás és hívás ne hajtódjon végre. Ha az első távoli ugrás vagy hívás valós üzemmódban történik, az új érték a (16 bites) CS szelektorba kerül és a CS bázisának értékét csak 20 bitesre fogja beállítani, vagyis a célként szereplő cím a 0 és 1M közti tartományban lesz. Ajánlatos meggyőződni arról, hogy ebben a tartományban érvény és kód van-e.
adatszeg ára a ímtartomány ódik, ahol a várhatóa z
3.4.1.3. A cache engedélyezés
e en CR D jeinek törlésével történik t ) a cache-elést (átíró módban az Intel486 tium esetében) és a cache-letiltó ciklusokat. szet ást követően minden cache-vonal érvénytelen, a cache-elés engedélyezése előtt nincs szükség a cache érvénytelenítésére. A cache kezelésének részletes leírását, beleértve az átíró cache-stratégia Pen n
aló megvalósítását a laptáblázat-bejegyzés PWT bitjének felha
regisztt meghatározza a eáris címet.
szegmensregismódban, amikor zter szelektorán
értéknmásként viselk
rosára. , nem lesz eg lő 16-szor a s elektor értékéve
dményeképpen
ktor értéke 0F000H és a CS bázisé 0FFFF0000H. A
első végrehajt utasítás beolvasása a CS.bázis+EIP = 0FFFFFFF0H . Az EPRO evő
processzorkód ezen a címen kai m
e előtt semmilyen
es memória
Az aljára (0 cím) állít
mensek szám báziscím a fizn a RAM helye
e
ikai ckedik el.
A cach gedélyezése a
(a hardware resze0 regiszter C1-re állítja őket és visszaíró m Mivel a re
és NW bit. Ez engedélyeziódban a Penáltali inicializál
tium processzorov
sználásával, egy későbbi tartalmazza.
93
Általános CPU programozási információk
Olyan körülmények közt, amikor a cache-vonalak esetleg
ngedélyezése előtt a cache-t le ell tiltani vagy ki kell üríteni. Ezt a software-inicializálás alkalmával a egbíz
sének modell specifikus részletei a 'Pentium M Processor Data Book' dokumentációban találhatók.
s üzemmódban
módja van. A végrehajtást a Pentium a patibilis üzemmódban kezdi, melynek valós
software elő kell szornak szüksége
lapvető rendszerfunkciók végrehajtásának céljából, mint zakítások kezelése. Ha a processzor továbbra is valós
e az adatstruktúrák felépítését a 8086-os ezze. Ha a processzor védett módban fog
s átu
lázatra. A ődik (amíg
nem változik), a megszakítások engedélyezése előtt fel kell
svektorok táblázatát és óriába, a reszet általi
követően lesz egy olyan időszak, amikor az NMI
érvényesnek vannak megjelölve, a cache ekm hatósági tesztet végző rutin segítségével oldható meg, mely a tesztregisztereket felhasználva, tesztmintákat futtat keresztül a cache memórián. A cache teszteléT 3.4.2. Software inicializálás való A processzornak több üzem
86 processzorral kom80üzemmód a neve. A reszet általi inicializálás után a
az adatstruktúrákat, melyekre a proceskészítse azokatvan az olyan apéldául a megsüzemmódban marad, a softwar
lakban kell elvégáltal használt aködnmű i, a software az adatstruktúrákat a védett módban használato
form mban kell felépítse, majd át kell kapcsoljon a védett üzemmódba. 3.4.2.1. Rendszertáblázatok Valós üzemmódban nincs szükség deszkriptor táb
eszkriptor táblázatot (IDT), mely a 0 címen kezdmegszakítás daz IDTR megtölteni a kivétel- és megszakítás-kezelőkre mutató pointerekkel. 3.4.2.2. Az NMI megszakítás Az NMI megszakítás mindig engedélyezve van (kivéve az
ásegym ba ágyazott NMI-ket). Mivel a megszakítázakítás-kezelőt be kell tölteni a memaz NMI megs
inicializálást
94
Inicializálás és az üzemmódok közötti átkapcsolás
megszakítás nem kezelhető. A hardware-nek biztosítania kell egy olyan
ódban
modellek használatát, melyek az egyetlen, ytól (lapos modell) egészen a nagyon strukturált
rjednek, melyek több, minden taszk számára független és artományt biztosítanak (multiszegmentált modellek). tő a lapozás, mely olyan nagyméretű adatstruktúrákhoz
rmája olyan et az operációs rendszer épít fel és a
DT-mens kell és
ásik csoport s: a
módszert, mely megelőzi az NMI megszakítások generálását, amikor azokat a software még nem tudja kezelni. Például az IDT és NMI megszakításokat bele lehet tenni a ROM-ba, így lehetségessé válik az NMI megszakítás kezelése már rögtön az inicializálás után. Legtöbb rendszer az NMI engedélyezését/letiltását úgy végzi el, hogy az NMI jelet átvezeti egy ÉS kapun, melyet egy I/O port egyik bitje vezérel. A reszeteléskor a hardware törölheti ezt a bitet, majd a software újra beállíthatja, amikor már készen áll az NMI megszakítás kezelésére. A rendszer software-ek tervezőinek ismerniük kell a hardware által használt mechanizmust, mely a software-t a reszetelést követő NMI megszakításoktól védi. 3.4.3. Software inicializálása védett üzemm A védett módban szükséges adatstruktúrákat a felhasznált memóriakezelő funkciók határozzák meg. A processzor támogatja a különböző szegmentált
mtartománfolyamatos címodellekig tevédett címtEngedélyezheteszi lehetővé a hozzáférést, melyeknek részben a memóriában, részben pedig a lemezen találhatók. A címképzés mindkét foadatstruktúrákat igényel, melyekmemóriakezelő hardware használ. 3.4.3.1. Rendszertáblázatok A lapozást nem használó lapos modellnek legkevesebb egy G
atszegre van szüksége, melyben legalább egy kód- és egy addeszkriptor van. Az első GDT bejegyzés egy nulldeszkriptorttartalmazzon. Egy lapozást használó lapos modellnek kód-adatdeszkriptorokat biztosíthat a felügyelői mód és egy mkód- és adatdeszkriptort a felhasználói mód számára. (Megjegyzémásodszintű laptáblázat kiküszöbölhető, ha a lapcímtár egy önmagára
95
Általános CPU programozási információk
mutató bejegyzést tartalm . Ez etben a lap tár éaz es cím s a laptáblázat ális
kség k h m utasítás me atá tt R szterbe.
ell az ációs rendszer se v ások számára T ks Az LDT-k
ig ne be yes operációs k le. ozási más.
ál az Egy ámú
ozott szer ényt
t, a egy kaput. Az
gítségével az IDT
Ha a áni állapota
elérhető processzor
ugyanazon a lapon helyezkedik el.) A verem helyezhető egy normírható/olvasható adatszegmensbe is, akkor a verem részére nincs szüdeszkriptorra. A verem csa azután asználható, iután a LDTR
regisegítségével a GDT báziscí és h ra betöltődö a GDT A multiszegmentált mod esetében operszámára további szegmen kre, alamint az alkalmazszegmensekre és LD -ra lehet szü ég. szegmensdeszkriptorokat ényel k a GDT- n. Egrendszerek szükség esetén újabb szegmenseket és LDT-ket foglalna
rogramEz maximális rugalmasságot biztosít az olyan dinamikus pkörnyezetek kezelésében, mint például egy tervezői munkaálloEnnek ellenére számos operációs rendszer egyetlen LDT-t hasznösszes folyamat számára és a GDT bejegyzéseket előre lefoglalja.beágyazott rendszer, mint például egy folyamatvezérlés, rögzített sz
eghatáralkalmazói program számára előre le kell foglaljon egy mszámú LDT-t. Ez egy egyszerű és hatékony mód egy olyan rend
teljesítmsoftware-környezetének struktúrálására, mely valós idejű igényel. 3.4.3.2. Megszakítások Ha a hardware megengedi a megszakítások generálásámegszakítás kezelő számára létre kell hozni egy IDT-t ésIDT csak azután használható, miután a LIDT utasítás se
báziscíme és határa betöltődött az IDTR regiszterbe. 3.4.3.3. Lapozás
ezérli. A szegmentációtól eltérően a lapozást egy módbit vCR0 regiszter PG bitje nulla (a reszet általi inicializálás utpontosan ez), akkor a programozó által architektúrából a lapozási mechanizmus teljes mértékben hiányozni fog.
96
Inicializálás és az üzemmódok közötti átkapcsolás
Ha PG bit értéke 1, akkor engedélyezve van a lapozás. A bitet a vetkező
A os
módban nem esül, akkor a PG
-re állíthatók.
ának eket
utasítás után egy JMP utasítás kell
kiürítse az addig beolvasott és dekódolt
álható.
ikusan s címe
ett
i. A Pentium csak a 2. lépés elvégzését
MOV CR0 utasítással lehet beállítani. A bit beállítása előtt a köfeltételeknek kell teljesülniük: 1. A software létrehozott már legkevesebb két laptáblázatot, a
apok a eslapcímtárat és 4 kByte-os l használat etén legkevesebb egy másodszintű laptáblázatot. 4 MByte- lapokkal kapcsolatos
ációk a függelékben találhatók. inform 2. A PDBR regiszterbe (mely ugyanaz, mint a CR3) be van töltve a
lapcímtár báziscíme. 3. A processzor védett módban van (a lapozás valós üzem
áll rendelkezésre). Ha minden más megszorítás teljés PE bitek egyidejűleg 1
Úgy a lefelé, mint a felfelé való kompatibilitás fenntartás
PG bit (és a PE bit) beállításakor a következő irányelvérdekében akell követni:
lenül a PG bitet beállító 1. Közvetkövetkezzen. A MOV CR0 után következő JMP szerepe az, hogy a végrehajtás folyásának megváltoztatása által a 386 és 486
zorokból processutasításokat. A Pentium processzor az elágazások előrejelzésére egy elágazási célpuffert (BTB - Branch Target Buffer) használ, ezért szükségtelen az elő-beolvasási sor elágazási utasításokkal való kiürítése. A BTB-ről több információ a függelékben tal
2. A PG bitet beállító utasítástól a JMP-ig terjedő kód egy ident
leképezett lapon kell elhelyezkedjen (a lap JMP előtti lineárimegegyezik a lapozás engedélyezése utáni fizikai címével).
A 32 bites x86 architektúrák a lapozás engedélyezését és a véd
átkapcsolását különbözőképpen valósítják meg. A 386 módba valóesetében a fenti 1. vagy 2. lépés végrehajtása szükséges. A 486 esetében mindkét lépést el kell végezn
97
Általános CPU programozási információk
igényli de a 386 és 486 oce rokkal a lefelé illetpr sszo ve felfelé való st elvégezni.
agyobb r nincs
l ára.
agasabb
foglaltnak megjelölni. Az LDT deszkriptorjaihoz hasonlóan a icializáló software TSS
regiszterbe. Ez
t végezné, alkalmával az aktuális
nálata után a zteren. Az
kriptorok létrehozására. A y a vezérlésnek magasabb
megszerezze a
kompatibilitás megtartása érdekében ajánlatos mindkét lépé 3.4.3.4. Taszkok Ha a multitaszking mechanizmus nincs használatban és a n
s nincs engedélyezve, akkoprivilégiumú szintekre való átváltászükség a TR regiszter inicia izás Ha a multitaszking mechanizmus használatban van és a nagyobb privilégiumszintekre való átváltás engedélyezve van (a mprivilégiumú SS és ESP értékei a TSS-ből kaphatók meg), az inicializáló software számára létre kell hozni a TSS-t és a TSS deszkriptort. A TSSdeszkriptor, létrehozásakor, nem lehet foglaltnak jelölve; a TSS deszkriptorokat a taszkátkapcsolások végrehajtásának mellékhatásaként a CPU szokta
eTSS d szkriptorjai is a GDT-ben vannak. Az indeszkriptorja az LDT utasítás segítségével töltődik a TR az utasítás a TSS deszkriptort foglaltként jelöli meg, de nem hajt végre
olást. Mielőtt a software az első taszkátkapcsolástaszkátkapcsbe kell tölteni a szelektort, mivel az átkapcsolástaszk bemásolódik a TSS-be. Az LTR utasítás hasztaszkátkapcsolás további műveleteket hajt végre a TR regisLDT szegmensekhez hasonlóan a TSS-ek és TSS deszkriptorok is szükség esetén lefoglalhatók, illetve előre lefoglalhatók. Ha a magasabb privilégiumszintekre való átváltás engedélyezve
deszvan, akkor szükség van a TSS-ek és TSS a TSS-t arra használja, hogprocesszor
privilégiumszintű szegmensekre való átadásakor torát és veremmutatóját. veremszegmens szelek
98
Inicializálás és az üzemmódok közötti átkapcsolás
3.4.3.5. A TLB, BTB és cache tesztelése A védett módba való átkapcsolás folyamatának részeként a programozó ha úgy akarja, tesztelheti a TLB-t, a BTB-t és a cache-t. Részletes információkat a tesztelésről a függelék tartalmaz. 3.4.4. Üzemmódváltás A 32 bites címtartomány és utasításkészlet teljes kihasználása
valós üzemmódba. Ez a rész oftware el kell végezzen ahhoz, üzemmódba váltson át.
tt módba
egy minimális szekben tárgyaltak szerint inicializálni
gisztereket. E táblázatok létrehozása után a
a CR0 regiszter PE bitjének 1-re 0 utasítás használható. A PE bit
zokat az irányelveket kell követni, melyeket az ás engedélyezése kapcsán.
uk, ami a valós üzemmódban volt; a ell töltsön. A végrehajtás a
-lel kezdődik.
érdekében a processzort a natív valós üzemmódjából át kell kapcsolni védett üzemmódba. Egy rendszer szükségesnek tarthatja azt is, hogy egyes műveletek esetében visszaváltson a
éseket azonosítja, melyeket a sazokat a léphogy valósból védettbe és védettből valós
éde3.4.4.1. Átkapcsolás v A védett módba kapcsolás előtt létre kell hozni számú adatstruktúrát és az előző rékell a GDT, IDT és TR resoftware elvégezheti a védett módba való átkapcsolás lépéseit.
s A védett módba való belépéa MOV CRállításával történik; erre
beállítása során is ugyanargyalt a lapozelőző rész tá
dett módba való belépés után a szegmensregisztereknek A vé
továbbra is ugyanaz a tartalmsoftware minden szegmensregisztert újra fel kvédett módban nulla értékű CPL
99
Általános CPU programozási információk
3.4.4.2. Visszakapcsolás valós üzemmódba
utasítással törli a CR0 regiszter PE . A valós üzemmódba képpen kell eljárjon:
őket végzi:
adja át (a zik a fizikai címmel). Biztosítja, hogy a GDT
elynek határa 64K enshatárt, melyre a
van. Biztosítja, hogy a GDT és az LDT a
i a valós kriptorok
zterek ptorok
b.
megszakításokat. A CLI utasítás letiltja az INTR vonalon áramkörök
R0 Ha a software egy MOV C
bitjét, a processzor visszatér a valós üzemmódbazővaló visszatérést lebonyolító procedúra a követke
1. Ha a lapozás engedélyezve van, a következ
entikusan leképezett lineáris címekre• A vezérlést idlineáris cím megegyeés az IDT is identikusan leképezett legyen.
• A CR0 regiszter PG bitjét törli. • Törli a TLB-t azáltal, hogy nullázza a CR3 regisztert.
2. A vezérlést egy olyan szegmensre adja át, m
(0FFFFH). Ez betölti a CS regiszterbe a szegmvalós módban szükség valós módban címezhető memóriában legyenek (0-1M).
3. Az SS, DS, ES, FS és GS szegmensregiszterekbe betölt
módnak megfelelő, a következő értékeket tartalmazó deszrjait: szelekto
• Szegmenshatár = 64K (0FFFFH) • Byte granularitás (G=0) • Kiterjesztés felfele (E=0)
) • Írható (W=1• Jelen van (P=1) • Bázis = bármilyen érték
Megjegyzendő, hogy ha nem történik meg a szegmensregis
ajtás a védett módban betöltött deszkriújrafeltöltése, akkor a végrehfelhasználásával folyik továb 4. Letiltja a
érkező megszakításokat; az NMI megszakítások külsősegítségével tilthatók le.
100
Inicializálás és az üzemmódok közötti átkapcsolás
5. Törli a CR0 regiszter PE bitjét.
k. Így (a ssor és a erülnek. A
ésre nincs szükség, azonban a lefele alós üzemmódba való áttérés távoli JMP utasítást.
ásvektor-táblázat bázisának és utasítást használja.
zési mód által igényelt
d átkapcsolásra
izálásara és üzemmódváltásra olyan példát alható a felhasználó által írt alkalmazásba. tók a felhasznált Intel fejlesztőeszközökről,
vagy édett
6. A JMP utasítás segítségével a valós módú programra ugri
3 6 és 486 processzorok esetében) kiürül az utasítá hozzáférési jog bitjeibe k
8megfelelő értékek a CS regiszter
p ornál erre a lépPentium rocesszvaló kompatibilitás érdekében a v
tá atos elhelyezni egyfolyama ba ajánl
s címzési mód a megszakít7. A valóah tárának betöltésére a LIDT
8. Engedélyezi a megszakításokat. 9. A szegmensregiszterekbe betölti a valós cím
értékeket.
sra és üzemmó3.4.5. Példa inicializálá
inicial Ez a rész az mutat be, amelyik belefoglUgyanitt információk találhavagyis az ASM386/486 assemblerről és a BLD386 builder-ről. 3.4.5.1. A példa célja E példa célja az, hogy rögtön a reszet után az EPROM-ban flash-memóriában levő kódot felhasználva átkapcsolja a CPU-t v
szerű alkalmazást futtasson. üzemmódba, majd egy egy
101
Általános CPU programozási információk
2.4.5.2. A memória elrendezése a reset-elést követően Az előbbiekben tárgyaltak és a 3.11. ábra alapján, a 3.12. áb
mutatja a processzor reszra a memória
etelését követően és e példa kezdeti elrendezésétpontján.
RESZET UTÁN0FFFF FFFFh
0FFFF 0000h
0FFFF FFF0h
64K
[CS.Bázis+EIP]
[SP, DS, SS, ES] 0
EIP=0000 FFF0CSbázis=0DSbázis=0ESbázis=0SSbázis=0SP=0
EPROM
rocesszor állapota a reszetet követően
i 3.1 utatja, a STARTUP.ASM
Meghatározás
12. ábra: A p3.
oritmus 3.4.5.3. Az alg A példa főbb lépése t a 3. ábra mforrásszöveg sorainak számozásával együtt. ASM sorok
157 Rövid ugrás az EPROM belépési pontjára 162-169 Felépít a RAM-ban egy ideig
bejegyzéssel: lenes GDT-t egy
0. null 1. irható/olvasható adat szegmens, Bázis=0 határ=4 GByte
102
Inicializálás és az üzemmódok közötti átkapcsolás
171-172 A GDT pointerét a GDTR regiszterbe tőlti. 174-177 A CR0 regiszter védet üzemmód bitjének beállítása. 179-181 Közeli ugrás a valód módot törlő sorra. 184-186 DS és ES regiszterek feltöltése a GDT[1]
izikai memória deszkriptorral, most mindkettő a teljes fterületre mutat.
188-195 Végrehajt egy specifikus tábla inicializálg.
ást amire az új védett mód miatt van szüksé
196-218 Az alkalmazás GDT-jét a ROM-ból a RAM-ba másolja 220-238 Az alkalmazás IDT-jét a ROM-ból a RAM-ba másolja 241-243 Az alkalmazás GDTR regiszterének feltöltése 2 245 A alm IDTR regisz rének feltöltése 44- z alk azás te247-261 Az alkalmazás TSS-ét a ROM-ból a RAM-ba másolja 263-267 A TSS deszkriptor felfrissítése.
277 TR regiszter feltöltése (taszkválltás nélkül) 282-286 SS és ESP feltöltése az alkalmazásban talált TSS
értékekkel. 287 Az alkalmazás TSS-ében talált EFLAG elmentése 288 Az alkalmazás TSS-ében talált CS elmentése 289 Az alkalmazás TSS-ében talált EIP elmentése
290-293 DS és ES feltöltése az alkalmazásban talált TSS értékekkel.
296 Végrehajt egy IRET-et, visszatölti a fenti értékeket és belép az alkalmazás kódjába.
3.13. ábra: Az algoritmus és a forrásszöveg ezzel kapcsolatos sorainak
száma Megjegyzések: A védett módba való átkapcsoláskor (a távoli ugrás vagy távoli hívás által) a CS szelektor nem változik meg és az eredeti bázisérték megmarad (Ha a reszet után nem volt távoli ugrás, a bázis értéke 0FFFF0000H marad; itt található az EPROM).
103
Általános CPU programozási információk
A reszet után a megszakítások le vannak tiltva és úgy is kell maradjanak, különben távoli ugrásokat okozhatnak. Az NMI nincs letiltva, de az inicializálás ideje alatt nem aktiválódhat. A TEMP_GDT használata megengedi a tömbök egyszerű mozgatását az EPROM-ból bárhova a RAM területén belül. Egy GDT bejegyzés úgy van felépítve, hogy a bázis a 0 címre mutasson és a határ 4GB legyen. Ha a DS és ES regiszterekbe betöltődik ez a deszkriptor, a TEMP_GDT-re nincs többé szükség és ennek helyét elfoglalhatja az alkalmazás GDT-je. Ez a kód egyetlen TSS-t (és egyetlen LDT-t sem) feltételez. Ha az alkalmazásnak több TSS-e van, ezeket a RAM-ba kell másolni. Ugyanígy kell eljárni az alkalmazás LDT-jeivel is.
Egyes implementálásoknál a korai 8086 processzorok szimulálása rdek a. A
védett meállítani, hogy
.4.
A példa az Intel software eszközeit (ASM386 és BLD386) használja. Az inicializáló kód generálására felhasznált ASM386 és BLD386 eszközei a következőket feltételezik:
• Az ASM 386 a kódszegmens attribútumának megfelelő, helyes operandusméretű opkódot fog generálni. Az attribútumot vagy az ASM386 segítségkérő vezérlője vagy a kódszegmens definíciója határozza meg.
• A kódszegmenset, mely valós üzemmódban fog futni, USE 16
attribútumúra kell állítani. Ha a szegmensben 32 bites operandusok (MOV EAX, EBX) kerülnek felhasználásra, egy automatikus operandusprefix fog generálódni, mely a processzort
é ében az A20-A31 címvonalak reszet után nincsenek dekódolv
ódba való átkapcsolás során ajánlatos a dekódereket úgy az összes címvonalat dekódolják. b
3 5.4. Eszközök használata
104
Inicializálás és az üzemmódok közötti átkapcsolás
a 32 bites műveletekre kényszeríti annak ellenére, hogy az alapértelmezésben szereplő kódszegmens attribútum 16 bites.
• Az Intel ASM386 assemblere megengedi a specifikus 16 és 32
bites utasítások használatát, ilyen például a a LGDTW, LGDTD, IRETD. Egy általános utasítás (például LGDT) használata esetén a megfelelő opkód generálásához az assembler a alapértelmezésben szereplő szegmensattribútumot fogja felhasználni.
Téma ASM386 és
Startup.A58 BLD386
vezérlő és BLD file
Hatás
Bootstrap public startup startup:
bootstrap start(startup)
Közeli ugrás a 0FFFFFFF0h-nál a startra
GDT elhelyezkedés
public GDT_EPROM GDT_EPROM TABLE_REG <>
TABLE GDT(location= GDT_EPROM)
A GDT elhelyezkedése a DGT_EPROM pozícióra lesz programozva.
IDT elhelyezkedés
public IDT_EPROM IDT_EPROM TABLE_REG <>
TABLE IDT(location= IDT_EPROM)
Az IDT elhelyezkedése az IDT_EPROM pozícióra lesz programozva.
RAM
0...3FFFh) tábla mozgatásokhoz a ramot
kizárása az alkalmazás szegmens területéből.
kezdet RAM_START equ 400h
memory(reserv=
A RAM_START a
használja célnak Ezért szükséges egy terület
105
Általános CPU programozási információk
Az alkalmazás TSS-ének elhelyezkedés
TSS_INDEX equ 10
ABLE GDT R 0:
Az alkalmazás TSS
e a
T(ENT Y=(1PROTECTED
))
deszkriptorát a
teszi. GDT-ben _
MODE_TASKGDT 10. pontjára
EPROM méret és elhelyezkedés
Az inicializáló kód mérete és
SEGMENT startup.c
elhelyezhedése. (base=0FFFF0000h) memory
legfeljebb 64K és a 4GB-os
ode Az inicializált kód mérete
tén
nie.
(RANGE( ROM_AREA
memória felső 64K-s terüle
= ROM(x..y)) kell elhelyezked
3.14. ábra: A BLD és az ASM forrásállomány közti összefüggés
3.4.5.5. A STARTUP.ASM listája
mmilyen opkód vagy ofszettel kapcsolatos nem tartalmaz.
tartup.a58 pw (132)
A CPU-t védett módba kapcsoló kód forrásszövegét a 3-1 példa
rtalmazza. Ez a lista setainformációt 3-1 példa: STARTUP.ASM OBJECT MODULE: startup.obj ASM386.EXE s Sor Forráskód 1 NAME STARTUP 2 ; 3 ; 4 ; 5 ;Előfeltételek: 6 ; 7 ;1. Az alsó 64K memória az RAM és a modul
106
Inicializálás és az üzemmódok közötti átkapcsolás
8 ; haslétrehozásánál.
ználhatja azt átmeneti területek
dő szabadon ja amibe
ogy egyezzen
. EQU 0FFFF0000h
neáris címe, ami
;nyelv file-ban van megadva.
RT EQU 400h
;lineáris memória területen. A GDT, IDT és a ti TSS
egy kis
is címen. A RAM_START-l l ő 3 atok
;szabad Byte lineáris címét. Ez akkor os, ha memória
0 ;managert használunk. 31 ; 32 TSS_INDEX EQU 10 33 ; 34 ;A TSS index az indítás után elsőként futó taszk TSS-ének 35 ;indexe. 36 ; 37 ;
9 ; van elegen10 ;2. A rendszernek
11 ; szabadon használható RAM-bemásolható 12 ; a GDT, IDT, TSS kezdeti értékei13 ; 14 ; 15 ;Konfigurációs adat, meg kell ha build nyelv 16 ;file-al17 CS_BASE 18 ; 19 ;A CS_BASE a STARTUP_CODE lia build 2021 ; 22 RAM_STA23 ; 24 ;A RAM_START a szabadon használható RAM kezdete a 25 kezde26 ;ezen hely fölé másolódnak és
t is adatszegmens27 ;kihagy ezen a lineárná év 2 28 ;bites szó tartalmazza a lemásolt táblázfölötti első 29 haszn3
107
Általános CPU programozási információk
38 ; 9 ; 340 ; 41 ;Szerkezet a rendszer adat számára 42 ; 3 ;TSS szerkezet 444
DW ? 0 ESP1 DD ?
DW ? ?
? DD ?
9 EAX_reg DD ? 0 ECX_reg DD ?
DD ? 2 EBX_reg DD ?
TASK_STATE STRUC 45 link DW ? 46 link_h DW ? 47 ESP0 DD ? 48 SS0 DW ? 49 SS0_h 551 SS1 DW ? 52 SS1_h DW ? 53 ESP2 DD ? 4 SS2 DW ? 555 SS2_h 56 CR3_reg DD 5 DD 7 EIP_reg 58 EFLAGS_REG 5661 EDX_reg 663 ESP_reg DD ? 64 EBP_reg DD ? 65 ESI_reg DD ? 66 EDI_reg DD ? 67 ES_reg DW ? 68 ES_h DW ? 69 CS_reg DW ? 70 CS_h DW ? 71 SS_reg DW ? 72 SS_h DW ? 73 DS_reg DW ? 74 DS_h DW ? 75 FS_reg DW ? 76 FS_h DW ? 77 GS_reg DW ? 78 GS_h DW ?
108
Inicializálás és az üzemmódok közötti átkapcsolás
79 LDT_reg DW ? 80 LDT_h DW ? 81 TRAP_reg DW ? 82 IO_map_bas3 TASK_STATE ENDS
? 3 DESC ENDS 4 ;
és LIDT utasítások
.
-------------------------------------------------------------- 114 ;
e DW ? 884 ; 85 ;A deszkriptor elemi szerkezete 86 DESC STRUC 87 lim_0_15 DW ? 88 bas_0_15 DW ? 89 bas_16_23 DW ? 90 acces DB ? 91 gran DB ? 92 bas_24_31 DB 9995 ;Szerkezet az LGDT észére r96 ;TABLE_REG STRUC 97 table_lim DW ? 98 tabla_linear DD ? 99 TABLE_REG ENDS 100 ;A GDT és IDT deszkriptorok ofszetje a builder által generált 101 ;GDT-ben. 102 ;GDT_DESC_OFF EQU 1*SIZE (DESC) 103 ;IDT_DESC_OFF EQU 2*SIZE (DESC) 104 ; 105 ;Értékadások az átmeneti GTD felépítéséhez06 LINEAR_SEL EQU 2*SIZE 1(DESC) 107 LINEAR_PROTO_LO EQU 00000FFFFh 108 LINEAR_PROTO_HI EQU 000CF9200h 109 ; 110 ;Védett mód engedélyező bit a CR0-ban 111 PE_BIT EQU 1 112 ; 113 ;-----
109
Általános CPU programozási információk
115 ;----------------------ADAT SZEGMENS----------------------- 116 ; 117 ;Kezdetben ez az adatszegmens a lineáris 0 címen 118 ;kezdődik a CPU bekapcsolási állapota miatt. 19 ; 1120 STARTUP_DATA SEGMENT RW
BEL DWORD
YTE 36 ;
47 ;
121 ; 122 free_mem_linear_base LA 123 TEMP_GDT LABEL BYTE 124 TEMP_GDT_NULL_DESC DESC <> 125 TEMP_GDT_LINEAR_DESC DESC <> 126 ; 127 ;Átmeneti terület az LGDT és a LIDT utasítások számára. 128 TEMP_GDT_SCRATCH TABLE_REG <> 129 APP_GDT_RAM TABLE_REG <> 130 APP_IDT_RAM TABLE_REG <> 131 ; 132 FILL DW 133 ; 134 ;Az utolsó dolog a szegmensben ami szükséges dword illeszkedéshez. 135 end_data LABEL B1137 STARTUP_DATA ENDS 138 ;---------------------------------------------------------- 139 ; 140 ; 141 ;---------------------------------------------------------- 142 STARTUP_CODE SEGMENT ER PUBLIC USE16 143 ; 144 ;A builder álltal feltöltve 145 PUBLIC GDT_EPROM 146 GDT_EPROM TABLE_REG <> 1
110
Inicializálás és az üzemmódok közötti átkapcsolás
148 ;A builder álltal feltöltve PROM
<>
adódik át a vezérlés. nnek a lineáris memória felső 15 an lenn155 ; 156 PUBLIC STARTUP 157 STARTUP: 158 ; 159 ;DS és ES a lineáris memória alsó 64K-ját
160 ASSUME DS TA RTUP_161 ;Lásd a 3-15 br
;A GDTR regiszter feltöltése az átmeneti
EBX,TEMP_GDT ;Felépíti a TEMP_GDT-t az ban.
D PTR [ címecni
165 MOV DWORD PTR [ PTR [ LO PTR [ _HI
TEMP_GD sc BX 169 MOV TEMP_GDT_scratch.table_lim,15 170 ;
66h ;32 bites GDT
EMP_GDT_sc
éd R0
EBX,PE_ BX
179 ;Törli az utasít P CLEAR_L L
LABEL:
149 PUBLIC IDT_E50 IDT_EPROM TABLE_REG 1151 ; 152 ;Belépési pont a STARTUP kódba - a bootoláskor egy rövid ugrás 53 ;segítségével ide 1E4 ;64K-jáb kell ie.
címzi. :S á
RTUP_Dát.
ATA, ES:STA DATA
162 GDT-vel.163 LEA alsó memóriá164 MOV DWORtudjuk.
EBX],0 ;ahol
EBX]+4,0 166 MOV DWORD167 MOV DWORD
EBX]+8,LINEAR_PROTO_EBX]+12,LINEAR_PROTO
168 MOV T_ ratch.table_linear,E
171 DB Lvégrehajtás 172 LGDT T ratch 173 ; 174 ;Belépés v175 MOV EBX,C
ett módba. BIT176 OR
177 MOV CR0,E178 ;
ás előolvasó sort180 JM181 CLEAR_
ABE
111
Általános CPU programozási információk
182 ; 183 ;Elkészíti a j t, a a 4G-s tartományt címzik.
CX,LINE SDS,CX S,CX
végzi a specifikus beállításokat
; ;
93 ; 94 ; 95 ;Lásd a
ROM GDT-t a RAM-ba másolja a TART+size(STARTUP_DATA) címre.
200 201 02 ADD ECX,OFFSET (GDT_EPROM)
204 05
208 209 MOV APP_GDT_ram[EBX].table_linear,EAX 210 ADD EAX,ECX 211 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 212 ; 213 ;A GDT bázicímének rögzítése a deszkriptorban. 214 MOV ECX,EDX 215 MOV [EDX[.bas_0_15+GDT_DESC_OFF,CX 216 ROR ECX,16 217 MOV [EDX[.bas_16_23+GDT_DESC_OFF,CL 218 MOV [EDX[.bas_24_31+GDT_DESC_OFF,CH 219 ;
z ú DS, ES regisztereke mik
184 MOV 185 MOV
AR_ EL
186 MOV E187 ; 188 ;El tábla .189 ; 190 191 192
; ......
111 3.16 ábrát. 196 ;Az EP197 ;RAM_S198 MOV EAX,RAM_START 199 ADD EAX,OFFSET (end_data)
MOV EBX,RAM_START MOV ECX,CS_BASE
2203 MOV SI,[ECX].table_linear
MOV EDI,EAX MOVZX ECX,[ECX].table_lim 2
206 MOV APP_GDT_RAM[EBX].table_lim,CX 207 INC EXC
MOV EDX,EAX
112
Inicializálás és az üzemmódok közötti átkapcsolás
220 ;Az EPROM IDT RAM-ba másolása a 21 ;RAM_START+size(STARTUP_DATA)+SIZE címre. 2222 MOV ECX,CS_BASE 223 ADD ECX,OFFSET (IDT_EPROM) 224 MOV SI,[ECX].table_linear 225 MOV EDI,EAX 226 MOVZX ECX,[ECX].table_lim 227 MOV APP_IDT_RAM[EBX].table_lim,CX 228 INC EXC 229 MOV APP_IDT_ram[EBX].table_linear,EAX 230 MOV EBX,EAX 231 ADD EAX,EXC 232 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 233 ; 234 ;Az IDT mutató rögzítése a GDT-ben. 35 MOV [2 EDX[.bas_0_15+IDT_DESC_OFF,BX
38 24_31+IDT_DESC_OFF,BH 2324 TR regiszterek feltöltése 241 MOV EBX,RAM_START 2424242424242449 NDEX*SIZE(DESC)
257 LSL ECX,EBX 258 INC ECX 259 MOV EDX,EAX
236 ROR EBX,16 37 MOV [EDX[.bas_16_23+IDT_DESC_OFF,BL 22 MOV [EDX[.bas_9 ; 0 ;GDTR és ID
2 DB 66h 3 LGDT APP_GDT_ram[EBX] 4 DB 66h 5 LIDT APP_IDT_ram[EBX] 6 ;
ása 7 ;A TSS mozgat8 MOV EDI,EAX MOV EBX,TSS_I2
250 MOV ECX,GDT_DESC_OFF 251 MOV GS,CX 252 MOV DH,GS:[EBX].bas_24_31 253 MOV DL,GS:[EBX].bas_16_23 254 ROL EDX,16 255 MOV DX,GS:[EBX].bas_0_15 256 MOV ESI,EDX
113
Általános CPU programozási információk
260 ADD EAX,ECX 261 REP MOVS BYTE PTR ES:[EDI], BYTE PTR
70 MOV free_mem_linear_base+RAM_START,EAX 271 ; 272 ;Feltételezzük, hogy a kezdeti taszkban nem használnak LDT-t - ha 273 ;szükséges, hozzáadhatunk egy LDT-t mozgató kódot, aminek 274 ;hasonlítania kell arra amit a TSS mozgatására használtunk. 275 ; 276 ;TR betöltése. 277 LTR BX ;Nincs taszkválltás, csak eszkriptor betöltés. 278 ;Lásd 79 ;A taszkválltás szimulálásához szükséges
AX,[EDX].SS_reg
V ESP,EDI 87 PUSH DWORD PTR [EDX].EFLAGS_reg 8
ES,BX
DS:[ESI] 262 ; 263 ;A TSS pointer rögzítése. 264 MOV GS:[EBX[.bas_0_15+IDT_DESC_OFF,DX 265 ROR EDX,16 266 MOV GS:[EBX[.bas_16_23+IDT_DESC_OFF,DL 267 MOV GS:[EBX[.bas_24_31+IDT_DESC_OFF,DH 268 ROL EDX,16 269 ;Elmenti a szabad memória kezdőcímét RAM_START helyzetben. 2
da 3.17 ábrát.
2regiszterek betöltése. 280 ; 281 ; 282 ; 83 MOV2284 MOV EDI,[EDX].ESP_reg 285 MOV SS,AX 286 MO228 PUSH DWORD PTR [EDX].CS_reg 289 PUSH DWORD PTR [EDX].EIP_reg 290 MOV AX,[EDX].DS_reg 291 MOV BX,[EDX].ES_reg 292 MOV DS,AX 293 MOV
114
Inicializálás és az üzemmódok közötti átkapcsolás
294 ;
izálásához. 96 IRETD
definiálja az Ez a rész
SEGMENT RW dup (?)
;
0 nop 1 nop
6 END main_start, ds:data, ss:stack
295 ;Egy távoli ugrás szimulálása a taszk inicial2297 ; 298 STARTUP_CODE ENDS 299 ; 300 END STARTUP, DS:STARTUP_DATA, SS:STARTUP_DATA 3.4.5.6. A MAIN.ASM forráskódja A 3-2 példában bemutatott MAIN.ASM állomány dat- és veremszegmenseket az alkalmazás számára. a
helyettesíthető egy magasszintű nyelvben írt taszk fő moduljával, melyet a STARTUP.ASM-ban szereplő IRET utasítás hív meg. 3-2 példa: MAIN.ASM 1 NAME main_module DATA 23 DW 1000 4 DATA ENDS56 STACK STACKSEG 800 7 ; 8 CODE SEGMENT ER USE32 PUBLIC 9 main_start: 1112 nop 3 ; 114 CODE ENDS 15 ; 1
115
Általános CPU programozási információk
0FFFF FFFFh
0FFFF 0000h
GDT_SCRATCH
START: [CSBASE+E
-Közeli ugrás a startra-TEMP_GDT felépítése-LGDT-Védett mód átkapcsolása
LIMIT
BASE
DS, ES=GDT[1] 4GB
IP]
TEMP_GDT
GDT [1]
GDT [0] 0
BASE=0, LIMIT=4G
3.15. ábra: A TEMP_GDT létrehozása és a védett módba való átkapcsolás (a forrásszöveg 162-172 sorai)
0FFFF FFFFh
0
GDT
TSS RAM
IDT RAM
TSS
IDT
-GDT, IDT, TSSROM-ból RAM-ba mozgatása
-Másolatok rögzítése-LTR
GDT RAMRAM_START
116
Inicializálás és az üzemmódok közötti átkapcsolás
3.16. ábra: A GDT, IDT és TSS ROM-ból RAM-ba másolása (a forrásszöveg 196-261 sorai)
SS=TSS.SSESP=TSS.ESPPUSH TSS.EFLAGPUSH TSS.CSPUSH TSS.EIPES=TSS.ESDS=TSS.DSIRET
EIP
EFLAGS
ESP
ES
CS
SS
DS
TSS RAM
IDT RAM
GDT RAMRAM_START
GDT
IDT ALIAS
GDT ALIAS
0
3.17. ábra: Átkapcsolás a taszkra (a forrásszöveg 282 296 sorai) 3.4.5.7. Állományok támogatása A STARTUP.ASM és MAIN.ASM forráskód állományok lefordítását és a végső alkalmazás létrehozását 3-3 példában mutatott parancsköteg állomány segítségével lehet elvégezni.
117
Általános CPU programozási információk
ASM386 STARTUP.ASM ASM386 MAIN.ASM BLD386 STARTUP.OBJ, MAIN.OBJ buildfile (EPROM.BLD) bootstrap (STARTUP) Bootload 3-3 példa: Az alkalmazás lefordítására és felépítésére szolgáló parancsköteg-állomány E példában a BLD386-nak több szerepe is van: • A szegmensek és táblázatok számára fizikai memóriát foglal le. • A bemeneti állományok és a felépítés módjának leírását tartalmazó
(úgynevezett "build") állomány alapján felépíti a táblázatokat. • Linkeli a tárgy állományokat és rendezi a referenciákat.
Bootolható és EPROM-ba programozható állományt generál. • A 3-4 példa a felépítés módjának leírását tartalmazó állományt mutatja be, melynek alapján a BLD386 a fentebb felsorolt műveletek végzi el. 3-4 példa: Build-állomány INIT_BLD_EXAMPLE; EGMENT S *SEGMENTS (DPL=0) , startup.startup_code (BASE=0FFFF0000h) ; TASK BOOT_TASK (OBJECT=startup, INITIAL, DPL=0, NOT INTENABLED) , PROTECTED_MODE_TASK (OBJECT=main_module, DPL=0,
118
Inicializálás és az üzemmódok közötti átkapcsolás
NOT INTENABLED) ; TABLE GDT (
LACATION=GDT_EPROM
, main_module.stack )
OM
, ENTRY=( 10: (PROTECTED_MODE_TASK , startup.startup_code , startup.startup_data , main_module.data , main_module.code ), IDT ( LOCATION=IDT_EPROM ); MEMORY ( RESERVE=(0..3FFFH -- terület a romból másolt IDT, GDT, TSS számára. R , 60000h..0FFFEFFFFH) , RANGE=(ROM_AREA=ROM (0FFFF0000h..0FFFFFFFFh)) -- Eprom méret 64K , RANGE=(ROM_AREA=RAM (4000h..5FFFFh)) ); END
119
Általános CPU programozási információk
3.5. A valós üzemmód felépítése, működése A Pentium processzor valós üzemmódban képes futtatni a 8086-os, 8088-as, 80186-os és a 80188-as processzorokra, illetve az Intel 286,
tel 386, Intel 486-os processzorok valós üzemmódjaira írt programokat.
megközelítőleg zonos a 8086, 8088, illetve 80188-as processzorokéval. A programozó ámár
melyek az operációs rendszer programozók valós üzemmódról lkotott képét hivatottak kibővíteni, mint például :
k lefordítása
lra forgatva képezi a 20 ites báziscímet. Az effektív (ofszet) cím négy 0-s bittel egészítődik ki a lső helyértékű bitek fölött, és a báziscímmel összeadódva alkotja a
t a 3.18. ábra szemlélteti. Minthogy fenn áll az tvitel (carry) lehetősége, a keletkezett lineáris címeknek 21 szignifiáns
In Ebben az üzemmódban a processzor felépítése asz a a valós üzemmódban dolgozó 32 bites proceszszor egy gyors 8086-os, vagy egy valós üzemmódú, bővített utasításkészletű Intel 286-os processzornak tűnhet. Ebben a részben bizonyos kiegészítő fogalmakról esik majd említés, aa • címek képzése • megszakítások és kivételek kezelése • valós üzemmódú kivételek. 3.5.1. Címe Valós üzemmódban a processzor a szelektorokat nem deszkriptorok mutatójaként értelmezi, hanem lineáris címeket állít elő, akárcsak egy 8086-os. A szelektort négy bittel babfelineáris címet, ahogyan azábitje lehet. Egy 8086-ra írt program a 0-tól 10FFEFh-ig terjedő (1 MByte és megközelítőleg 64 kByte-nyi) lineáris címtartomány bármely lineáris címét előállíthatja. ( Ugyanakkor megjegyzendő, hogy az Intel 486-os illetve Pentium processzorok esetében az A20M# jel valós üzemmódban felhasználható az A20-as címvonal maszkolására, utánozva ezáltal a 8086-os processzor 20 bitet átfogó viselkedését). Minthogy a lapozás valós üzemmódban nem megengedett, a lineáris cím fizikai címként kerül felhasználásra.
120
A valós üzemmód felépítése, működése
0 0 0 00420
00000420
420
BÁZIS
OFSZET
+
=
16 bites Szegmens szelektor
16 bites effektív cím
0XXXX XXXX XXXX XXXX XXXXLINEÁRIS CÍM
3.18. ábra: Címek lefordítása
zakítások) jelentkeznek, ha egy effektív cím a 0-tól 5535-ig terjedő tartományon kívül esik.
3.5.2. Regiszterek é A valós üzemmódban érvényes regiszter szett magába foglalja az összes 8086-os processzor esetében definiált regisztert és ezenfelül, a 386-os processzornál és 387-es koproceszszornál bevezetett új regisztereket: FS, GS, nyomkövető regiszterek, kontroll regiszterek, teszt regiszterek és a lebegőpontos egység (NDP) regiszterei. Új utasítások jelentek meg, amelyek expliciten az FS illetve GS szegmensregiszterekkel hivatottak műveleteket végezni, ezenkívül használhatók az új szegmens-fölülíró prefixek is annak érdekében, hogy a címek kiszámításához az utasításokat késztetni lehessen az FS és GS regiszterek használatára.
Ellentétben a 8086-os és 286-os processzorokkal, akárcsak a 386-os illetve 486-os processzorok, a Pentium képes 32 bites effektív címek előállítására egy cím-fölülíró prefix segítségével. Ugyanakkor valós üzemmódban a 32 bites címek értéke nem haladhatja meg a 65535-öt anélkül, hogy egy kivételt ne okozna. A 286-os valós üzemmódjával való teljes kompatibilitás érdekében pszeudo védelmi hibák (12-es vagy 13-as, hibakód nélküli megs6
s utasítások
121
Általános CPU programozási információk
Érvénytelen utasítás (invalid-opcode) kivételt előidéző utasítás ódok közé azon védett üzemmódú utasítások tartoznak, amelyek védett emm
e.
akítás agy kivétel azonosítóját, hogy megkapja a megfelelő indexet a
gsza
kódokat.
Az elsődleges különbség a valós üzemmódú 32 bites processzorok és a 8086-os megszakításkezelése között az, hogy a megszakításvektorok táblázatának helye és mérete az IDTR regiszter tartalmától függ.
küz ódú szegmens szelektorokat illetve szegmens deszkriptorokat mozgatnak vagy tesztelnek, mint például: a VERR, VERW, LAR, LSL, LTR, STR, LLDT, és az SLDT utasítások. A valós üzemmódban futó programok képesek kihasználni azon új, alkalmazás-orientált utasítások előnyeit, amelyek a 8086-os, 80186-os, 80188-as, 286-os, 386-os, 486-os illetve Pentium processzorok bevezetésével egészítették ki az architektúrát. Ellentétben a 8086-os és 286-os processzorokkal, hasonlóan a 386-os illetve 486-os processzorokhoz, a Pentium felkínálja egy operandus hossz fölülíró prefix használatának lehetőségét, amely lehetővé teszi 32 bites operandusok hozzáférését. Ennek ellenére ezen prefix használatától óvakodjunk, ha célunk a 8086-os vagy 286-os processzorokkal való kompatibilitás megőrzés 2.5.3. Megszakítás és kivétel kiszolgálás Valós üzemmódban a megszakítások és kivételek nagyjából úgy működnek, mint egy 8086-os processzoron. A megszakítások és kivételek megszakítás kezelő rutinokat hívnak meg egy megszakításvektor táblázaton keresztül. A processzor néggyel beszorozza a megszvme kításvektorok táblázatában. A megszakításvektorok táblázatának bejegyzései "far" (távoli) típusú mutatók a megszakítást vagy kivételt kiszolgáló procedúrák bemenőpontjaira. Egy megszakítás megjelenésekor a processzor eltárolja a CS, illetve IP regiszterek aktuális értékét a verembe (push), letiltja a megszakításokat, törli a TF flaget és átadja a vezérlést a megszakítás-vektorok táblázatából kiolvasott címre. A kiszolgáló rutin végén egy RET utasítás visszapörgeti az előbbi lépéseket, mielőtt a megszakított eljárásnak visszaadná a vezérlést. A kivételek valós üzemmódban nem szolgáltatnak hiba
122
A valós üzemmód felépítése, működése
Általános esetben ez nem nyilvánvaló a programozó számára, mert egy reset inicializálást követően az IDTR regiszterben a bázis cím 0 és a határ értéke 3FF, ami kompatibilis a 8086-os processzorral. Ugyanakkor, valós üzemmódban a LIDT utasítást használhatjuk az IDTR regiszterbeli báziscím illetve határ (limit) értékeinek megváltoztatására. További részleteket az IDTR regiszterről, valamint a LIDT és SIDT utasításokról az előbbi rész szolgáltat. Ha egy befutó megszakítás táblázatbeli bemenőpontja meghaladja az IDTR regiszter által tárolt határ értékét, egy kettős hiba kivételt (double-fault exception) eredményez. 3.5.4. Valós üzemmódú kivételek
A processzor jelez attól függően, ogy valós vagy védezemmódú kizárásokat részletezi.
Meghatározás Vekto A kivétel forrása Hiba-
némely kivételt eltérő módon
tt üzemmódban dolgozik-e. A 3.19. ábra a valós hü
r mutató pointer vissza-térés után
Osztási hiba 0 DIV és IDIV utasítások van Nyomkövetés 1 Akármi (1.megj) NMI 2 Nem maszkolható megszakítás van Töréspont 3 INT utasítás nincs Túlcsordulás 4 INTO utasítás nincs Határ ellenörzés 5 BOUND utasítás van Hibás műveleti kód 6 Fenntartott műveletkódok és van
helytelen LOCK prefix használat
Eszköz nem elérhető 7 ESC vagy WAIT utasítások van Dupla hiba 8 Interrupt tábla túl kicsi, hiba
előfordulása egy másik hiba kezelése közben
van
Fenntartva 9
123
Általános CPU programozási információk
Érvénytelen TSS (3.megjegyzés)
10 JMP, CALL, IRET utasítások, megszakításik és kivételek
van
Szegmens nincs 11 Akármilyen művelet, amelyik jelen (3.megjegyzés) cseréli a szegmenseket
van
Stack kivétel 12 Stack ofszet túl nagy van CS, DS, ES, FG, GS szegmens túlfutás
13 Ofszet túlnyúlik a 64K-s határon, kód végrehajtási kísérlet a CS határán túl
van
Laphiba (3.megjegyzés)
14 Akármilyen művelet, amelyik hivatkozik a memóriára
van
Fenntartva 15 van Lebegőpontos hiba 16 ESC vagy WAIT utasítások van
(2.megj) Illeszkedés ellenörzés (3.megjegyzés)
17 Akármilyen adat hivatkozás nincs
Fenntartva 18-31 Software megszakítás
0-255 INT n utasítások nincs
Maszkolható megszakítás
32-255 van
3.19. ábra: Kivételek és megszakítások
Megjegyzések: 1. Egyes nyomkövető kivételek a hibát okozó utasításra mutatnak,
mások az azt követő utasításra. A kivétel kezelő tesztelheti a DR6-os regiszter tartalmát, hogy megállapítsa, melyik helyzet áll fennt.
2. A lebegőpontos hibákat az első olyan ESC illetve WAIT utasítás
alatt jelenti, amely a kivételt előidéző ESC utasítást követi. 3. A 10-es, 11-es, 14-es és 17-es kivételek valós üzemmódban nem
jelentkeznek, viszont virtuális 8086-os módban előfordulhatnak.
124
A védett üzemmód felépítése, működése
3.6. A Védett üzemmód felépítése, működése
•
t inkább a későbbi, védett zemmódról és rendszer-programozásról szóló információk előrevetítése.
A processzor architektúrális tulajdonságainak jelentős hányadát kizárólag rendszer programozók veszik igénybe. Ebben a részben ezen tulajdonságok áttekintésére kerül sor. A felhasználói programok írói számára szükségesnek bizonyulhat e fejezet átolvasása, csakúgy mint az ezt követő fejezeteké, amelyekben a fenntemlített tulajdonságok felhasználási módjai kerülnek bemutatásra, annak érdekében, hogy megérthessék a rendszer programozók rendelkezésére álló hardware kínálta lehetőségeket, amelyekkel az alkalmazói programok számára megbízható és biztonságos környezeteket (environment) hozhatnak létre. Ezenkívül, a rendszerszinti architektúra hatékony hibaelhárító (debugging) lehetőségeket is támogat, amelyeket az alkalmazói programírók valószínűleg szívesen beépítenének fejlesztés alatt álló programjaikba. Az architektúra rendszerszinti lehetőségei közé tartoznak a következők:
memóriaszervezés • védelem • multitaszking • kivételek és megszakítások • ki- és beviteli műveletek (Input/Output) • inicializálás és üzemmódváltás • a lebegőpontos egység (FPU) menedzsmentje • hibaelhárítás, nyomkövetés • cache szervezés • multiprocesszálás
A felsorolt tulajdonságokat regiszterek és utasítások támogatják, ezek sorra bemutatásra kerülnek a következő részben. A jelen rész célja nem annyira a részletes bemutatásuk, minüValahányszor egy regiszterről illetve utasításról kerül említés, azt vagy magyarázat kíséri, vagy utalás egy későbbi fejezetre.
125
Általános CPU programozási információk
3.6.1. Memóriaszervező regiszterek. A processzor négy regisztere határozza meg azon adatstruktúrák helyét, amelyek a szegmentált memória szervezését szabályozzák, amint azt a 3.20. ábra mutatja. Speciális utasítások állnak rendelkezésre ezen regiszterek feltöltésére és elmentésére. A GDTR és IDTR regiszterek feltölthetők bizonyos utasításokkal, amelyek a memóriából egy 6-Byte hosszúságú adatblokkot vesznek ki. AZ LDTR és TR regisztereket olyan
tasításokkal tölthetjük fel, amelyek operandusai 16 bites szegmens uszelektorok. A regiszterek fennmaradó Byte-jait a processzor automatikusan feltölti az operandus által kijelölt deszkriptorokból.
SZELEKTOR
SZELEKTORLDTR
TR015
RENDSZER SZEGMENSREGISZTEREK DESZKRIPTOR REGISZTEREK (A
GDTR
IDTR
0151647 32 BIT LINEÁRIS BÁZISCÍM
RENDSZER C
32 BIT LINEÁRIS BÁZISCÍM 32 BIT SZEGMENS HATÁR JELLEMZŐK
UTÓMATIKUSAN TÖLTÕDNEK)
ÍMZÕ REGISZTEREK
3.20. ábra: Memória kezelő regiszterek Az operációs rendszerek többsége levédi a felhasználói program elől azokat az utasításokat, amelyek a memóriaszervező regisztereket töltik fel (bár elképzelhető olyan rendszer is, amelyben egyáltalán nincs védelem). GDTR Global Descriptor Table Register - globális deszkriptortáblázat regiszter A GDTR regiszter tartalmazza a globális deszkriptortáblázat (GDT) 32 bites báziscímét és a 16 bites határt (limit). Valahányszor hivatkozás történik egy memóriában levő adatra, egy szegmensszelektort használunk egy GDT- vagy LDT-beli szegmensdeszkriptor megkeresésére. A szegmensdeszkriptor a szegmens báziscímét
rtalmazza. ta
126
A védett üzemmód felépítése, működése
DTR
T) 32 ites báziscímét, a 32 bites szegmens határt, a deszkriptor attribútumokat
és a 16 bites szegmensszelektorát. Az LDT-t tartalmazó szegmensnek van gy szegmensdeszkriptora a GDT-ben. A GDT-nek nincs
szegmensszelektora. Valahányszor hivatkozás történik egy memóriában vő adatra, egy szegmensszelektort használunk egy GDT- vagy LDT-beli egmensdeszkriptor megkeresésére. A szegmensdeszkriptor a szegmens
TR I
R Task Register - taszkregiszter Ez a regiszter tartalmazza az éppenbites báziscímét, a 32 bites szegmens hatáés a 16 bites szegmensszelektorát. Egy Gdeszkriptorra (TSS) mutat. Lásd: multitaszk 3.6.2. Rendszer utasítások
re ióka
2. deszkriptortáblázatok címzése 3. multitaszking 4. lebegőpontos műveletek
L Local Descriptor Table Register - helyi deszkriptortáblázat regiszter Ez a regiszter tartalmazza a helyi deszriptortáblázat (LDb
e
leszbáziscímét tartalmazza. ID nterrupt Descriptor Table Register - megsz.-dt. reg. Az IDTR regiszter tartalmazza a megszakítás deszkriptortáblázat (IDT) 32 bites báziscímét és a 16 bites határát (limit). Valahányszor befut egy megszakítás, a megszakításvektor e táblázaton belüli indexként meghatároz egy kapudeszkriptort. A kapudeszkriptor egy mutatót tartalmaz, amelyet a megszakítás kiszolgáló rutin elindítására alkalmaznak. T
végrehajtás alatt álló taszk 32 rt, a deszkriptor attribútumokat DT-beli taszk-állapotszegmens ing.
A dszer utasítások a következő funkc t látják el:
1. mutatók paraméterellenőrzése
127
Általános CPU programozási információk
5. ki- és beviteli műveletek 6. megszakítás-vezérlés 7. nyomkövetés, hibakeresés 8. cache-szervezés 9.
anakkor nem asználható fel a PE bit törlésére sem.
leállítja a processzort, amíg egy ngedélyezett megszakítás vagy egy RESET jel nem érkezik be.
ardware halt üzemmódbeli válaszával.
iztonságos ommunikáció érdekében.
Minden egyes utasításról részletes információt kaphatunk a könyv
második kötetéböl.
rendszervezérlés Az SMSW és az LMSW utasításokat a 16 bites 286-os proceszszorral való kompatibilitás érdekében vezették be. A 32 bites processzorokra, mint például a Pentiumra írt programokban nem ajánlott a használatuk. Helyette inkább a vezérlőregiszterekhez kell a MOV utasítás különböző formáival hozzáférni. Az LMSW utasítás nem befolyásolja a PG, CD, NW, AM, WP, NE vagy ET biteket, ugyh A HLT utasítás mindaddige(jegyezzük meg, hogy az NMI illetve SMI megszakítások mindíg engedélyezettek.) A processzor egy speciális buszciklust generál a halt üzemmódra való váltás jelzésére. A hardware sokféleképpen válaszolhat erre a jelre. A gép elülső paneljén például bekapcsolhat egy fényjelzést, esetleg generálhat egy diagnosztizáló NMI-t, vagy akár inicializálást (reset) is kezdeményezhet. A software íróknak tisztában kell lenniük a h A LOCK utasításprefix célja, hogy lehetővé tegye egy védett olvasás-módosítás-írás művelet kezdeményezését egy memóriában lévő operandus értékének módosításakor. A LOCK# jel aktiválódik, és a processzor a levédett ("lezárt") utasítás alatt nem válaszol a buszvezérlés átadását célzó kérésekre. Ezt a mechanizmust multiprocesszoros rendszerekben használják a proceszszorok közti bk
128
A védett üzemmód felépítése, működése
3.6
A memóriaszervezés egy olyan hardware mechanizmus, amely
kör z esetben, ha több program fut párhuzamosan, mindegyiknek független
címellea tö szeegyköregy jedt ímtartományok szimulálhatók. Az operációs rendszerek tervezői
típusait tasítás elérése, veremre vonatkozó push vagy pop, olvasási vagy írási űvele
kben kihasználjuk, ugyanis
.3. Védett üzemmódú memóriaszervezés
lehetővé teszi az operációs rendszerek számára, hogy egy leegyszerűsített
nyezetet hozzanak létre a futtatott programok részére. Például abbanacímtartományt kell biztosítani. Ha mindannyian ugyanazon
tartományon osztoznának, egyenként kéne nehézkes és időpazarló nőrző műveleteket elvégezniük, hogy elkerülhessük az összeütközést bbi programmal.
A memóriaszervezés szegmentálásból illetve lapozásból áll. A gmentálás célja, hogy minden egyes program részére számos, mástól független és védett címtartományt biztosítson. A lapozás olyan nyezetek kialakítását támogatja, amelyekben egy kis méretű RAM és bizonyos mennyiségű lemezterületet felhasználásával kiter
cválaszthatnak a két mechanizmus közül. Ha egyszerre több program is szalad, az említett két eljárás közül bármelyiket felhasználhatjuk arra, hogy egy programot megvédjünk más programok beavatkozásától. A szegmentálás megengedi a teljesen strukturálatlan, egyszerű memória modellek (mint amilyen a 8 bites processzoroké), vagy az erőteljesen strukturált, címfordításos illetve védelemmel ellátott modellek használatát. A memóriaszervezés a "szegmenseknek" nevezett egységekre vonatkozik. Minden egyes szegmens egy önálló, védelemmel ellátott címtartomány. A szegmensekhez való hozzáférést olyan adatok vezérlik, amelyek meghatározzák a szegmens hosszát, a hozzáféréshez szükséges privilégiumszintet, a szegmensre történő memóriahivatkozások (um tek, stb.), illetve azt, hogy a szegmens a memóriában található-e. A szegmentálást a memória hozzáférések ellenőrzésére használják, ami a fejlesztés alatt álló program hibáinak felderítésében és a "végtermék" megbízhatóságának növelésében igencsak hasznosnak bizonyulhat. A tárgynyelvi modulok összekapcsolásának (link) leegyszerűsítésére is használatos. Nincs értelme helyfüggetlen kódot írni, ha a szegmentáló mechanizmust teljes mérté
129
Általános CPU programozási információk
minden egyes memóriahivatkozást a modul kód, illetve datszegmensének báziscíméhez viszonyíthatunk. A szegmentálást
are modulok létrehozására is lhasználhatjuk, amelyekben a fix címek (abban az értelemben fixek,
int például a 8080-as processzor, amelynél a logikai ím egyben fizikai cím is. A 32 bites processzorok védett üzemmódban is
működtethetők ezzel a memória modellel, ha a szegmenseket ugyanabba a címtartományba képezzük le (mapping), a lapozást pedig letiltjuk. A software-ek meghibásodásának igen gyakori oka az, hogy a verem "belenő" az utasításkódba vagy a program adataiba. Ennek megelőzésére biztos módszer a szegmentálás. A vermet a kód vagy adat részére fenntartott címtartományon kívül eső tartományba tehetjük. Így a verem címek mindíg a veremszegmensbeli, az adatcímek pedig az adatszegmensbeli memóriarészre vonatkoznának. A verem-szegmensnek hardware által meghatározott maximális hossza van. Bármely olyan próbálkozás, amely a verem maximális méretének túlhaladását célozná, kivételt generálna. Egy komplex programrendszer teljes mértékben kihasználhatja a szegmentálást. Például egy olyan operációs rendszer, amelyben a
rogramok valós időben osztják meg az adatokat, precízen ellenőrizheti a ozzáférést ezekhe k" (bugs), mint a rogram által végrehajtott szabálytalan hozzáféréssel generált kivételek
min egylap rdítja a lineáris címet
augyanakkor ROM-ra alapuló softwfehogy nem lehet őket megváltoztatni) egy szegmens báziscíméhez viszonyított ofszetek. Különböző rendszereknek eltérő fizikai címen lehetnek a ROM-moduljai, mivelhogy a szegmentáló mechanizmus minden egyes memóriahivatkozást a megfelelő helyre irányít. Egy egyszerű memória felépítés esetén minden cím ugyanarra a címtartományra hivatkozik. Ezt a memória modellt használják a 8 bites mikroprocesszorok, mc
ph z az adatokhoz. A "program-gubancopjelentkeznek. Ez hasznos lehet a programírás stádiumában, mint hibakereső segédlet, illetve a végfelhasználónak leszállított rendszerben,
t a hiba helyreállító procedúrák vezérlője.
A szegmentáló hardware egy szegmentált (logikai) címet fordít le folytonos, nem szegmentált címtartományra ún. "lineáris" címre. Ha a ozás megengedett, a lapozó mechanizmus lefo
130
A védett üzemmód felépítése, működése
fizikai címre. Ha a lapozás nem engedélyezett, a lineáris cím fizikai
címlap méméLaphozőke
alklapme ezett kivétel
isszaállítja a processzor regisztereinek tartalmát olyan értékekre, amvégrehajtását. Ez a speciális eljárás megengedi az utasítás újraindítását, azaz képesíti az operációs rendszert arra, hogy kiolvassa a lapot a lemleképezéseit, és újraindítsa a programot. A program számára ez a
lyamat áttetsző.
n lapozható (demand-paged) irtuális memóriát, engedélyezett a lapozás. A felhasználói software
alk
címként kerül felhasználásra. A fizikai cím a processzorból kijövő buszra kerül, engedélyezett lapozás esetén esetleg a háttértárolóról
ozódik be.
A lapozás mechanizmust arra használható, hogy egy jelentős retű, nem szegmentált címtartományt lehessen szimulálni egy kis retű, fragmentált címtartomány és némi lemezterület segítségével. ozással a szabad memóriaterületnél nagyobb adatstruktúrákhoz lehet záférni, azáltal, hogy részint a memóriaban, részint a lemezen tároljuk t.
A lapozást 4 kByte-os, lapoknak nevezett egységekre
almazzák. Ha egy program megpróbál hozzáférni egy lemezen levő hoz, különleges eljárással szakítódik meg. Más kivételekkel és gszakításokkal ellentétben, a címek lefordításakor keletk
velyek lehetővé teszik a kivételt előidéző utasítás megismételt
ezről, felfrissítse a lap lineáris címeinek fizikai címekre való
fo A lapozás opcionális. Ha egy operációs rendszer soha nem engedélyezi a lapozás mechanizmusát, a lineáris címek fizikai címekként kerülnek felhasználásra. Ez akkor volna lehetséges, ha egy 16 bites processzorra írt alkalmazást 32 bites processzorra adaptálunk. Egy 16 bites processzorra írt operációs rendszer nem alkalmaz lapozást, mivel a címtartománya annyira rövid (64 kByte), hogy sokkal inkább gazdaságosabb egész szegmenseket átcserélni (swap) a RAM és a lemez között, mint egyedi lapokat. Az olyan operációs rendszerekben mint az UNIX, amelyek támogatják az igényeknek megfelelőevrészére a lapozás áttetsző, tehát a 16 bites processzorokra írt
almazásokat támogató operációs rendszer képes futtatni azokat a
131
Általános CPU programozási információk
lapnem moknak. Szegmentálást használó
rogramokat azokkal a szegmensekkel kötelező futtatni, amelyek
3.6 telj ritériuma alapján választják meg. Például, ha egy operációs
ndszerben több program osztja meg valós időben adatait, maximális telja memszüksé A másik oldalról viszont, egy olyan operációs rendszer, amely csaszegmeszegmemegnő ivel a
egmensregiszterek tartalmát nem kell többé elmenteni vagy
Pélpro 3.6 sze zve. Egy
egmensen belüli ofszet vonatkozhat úgy kód, mint adat területre. Ez a
ozás engedélyezése mellett is. A lapozással elletétben, a szegmentálás áttetsző a felhasználói progra
phasználatára eredetileg meg voltak tervezve.
.3.1 A szegmentálási modell kiválasztása
A memória szegmentálásának modelljét a megbízhatóság és esítmény k
reesítményt egy olyan modell nyújthatna, amely hardware-ileg ellenőrzi
ória hivatkozásokat. Ehhez egy multiszegmens modellre lenne g.
k egyetlen programot futtat, magasabb teljesítményt érne el egy ntálás nélküli, ún. "sík" modellel. A "far" típusú mutatók és a ns-felülíró prefixek kiküszöbölésével lecsökken a kód hossza és
a végrehajtás sebessége. A kontextusváltás is gyorsabb, mszvisszaállítani.
A szegmentálás egyes előnyeit a lapozás is képes biztosítani. dául az adatok megoszthatók (share), ugyanazon lapok minden egyes gram címtartományba való betérképezésével.
.3.1.1. A sík modell
A legegyszerűbb modell a sík modell. Ebben a modellben minden gmens a teljes fizikai címtartományra van rátérképe
szmodell a lehető legtökéletesebben eltörli a szegmentálás mechanizmusát, akár a rendszerprogramozó, akár a felhasználói programiró szemszögéből látott architektúrából. E megoldás lehetséges volna egy olyan programozási környezet esetében, mint az UNIX, amely támogatja a lapozást, ellenben a szegmentálást nem.
132
A védett üzemmód felépítése, működése
Egy szegmenst egy szegmensdeszkriptor határoz meg. A sík modellben legalább két szegmensdeszkriptort kell létrehozni: egyet a kód hivatkozásoknak, egy másikat pedig az adat hivatkozásoknak. Mindkét deszkriptornak ugyanaz kell legyen a báziscíme. Valahányszor memóriahozzáférés történik, a szegmens regiszterek egyikét a szegmensdeszkriptor kiválasztására használják. A szegmens deszkriptor szolgáltatja a szegmens báziscímét és a határ (limit) értékét, valamint a hozzáférést ellenörző információkat. (Lásd a 3.21 ábrát) Általában a ROM-ot a fizikai címtartomány tetejére helyezik, mivel a processzor az FFFF_FFF0H címen kezdi végrehajtani az utasításokat. A RAM a címtartomány alján foglal helyet, ugyanis a reset után a DS adatszegmens báziscíme 0. A sík modellben minden deszkriptor báziscíme 0, és a szegmenshatár értéke 4 GByte. A szegmenshatárt 4 GByte-ra állítva a szegmentáló mechanizmust meggátoljuk abban, hogy kivételt generáljon a szegmenshatáron kívülre eső memória hivatkozásokkor. Ugyanakkor még fennáll annak lehetősége, hogy a lapozó illetve szegmentáló védelmi mechanizmusok kivételeket generáljanak, de ezeket is ki lehet iktatni a memória modellből.
CS
SS
DS
ES
FS
GS
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
EPROM
DRAM
4G
0
FIZIKAIKÓD ÉS ADATSZEGMENSDESZKRIPTOR
SZEGMENSREGISZTEREK MEMÓRIA
3.21. ábra: Sík modell
133
Általános CPU programozási információk
3.6.3.1.2. Védett sík modell
A vé t dell ít az egyszerű sík modellre, azzal a kü bsé el ho szeg atár akkorára vannak be tva m k tulaj pen gy általános védelm ib kivét erálne implem á ória területhez hozzáférni. Ez a lehetőség olyan op ciós r d ere en nálha a lapozás mechanizmu v k csolv E modellben a szegm har at ab , h y e l ző m arek en rekeszek cím h ségének következm Például, ha roc sz ho ne a RE szciklus tudomásulvételezésére és befejezésére használatos), a buszciklus nem fej dik be, és a program vé ása
B e n ro volna ezeket a memória cellákat m ímezni, mégis adódhat ilyen nemű kísérlet, program ény en. s ellenőrzése nélkül m tö n , gy eg anc programot. Hardware-es ellenőrzés esetén a progra tt módon "omlanak ös ". en r gy iagn üzen illetve he eáll e rá a ecov oced A . ra gy v sík a szegmensdeszkriptorok úgy voltak beállítva, hogy csak a fizikailag létező me ória tartományát takarják. A fizika DRAM rés t eg kó i tv datsz ns ta ziscíme és zeg nshatára opcionálisan beállítható úgy, hogy a DRAM tartomán oz e yezz záfé tárát az EP M a R reteinek összeg óriába
képezett I/O tartományt is haszn ő lehet özvetlenül a D
det sík mo hasonl
lön gg , gy a mensh értékek csak állí , a ek ora a donkép i memória címtartománya. E
megkísérelünk i h a el gen ódik valahányszor m erá
enten
lt msz
emkb hasz tó, amelyekben
s ki an ap a.
entálóemóri
dware meggátolja a programokeszeket címezzenek meg. Ezban og n m éte
ezor
etőz
ényei hardware függők. ADY# jel (amely egy bu a p es m érkezik be
ező grehajt leáll.
ár egy tle p gramnak sem megengedett egc
ozási hibák eredm eképp A címek hardware-eeg rté het ho y gub hirtelen leállíthatja a
mok ellenőrzösze Ily ko e d ózis etet lehet megjeleníteni,lyr ító ljá sok t (r ery pr ure) lehet kezdeményezni.
3 22. áb e édett modellre ad példát. Ebben
m i memóriának EPROM észé
sy me
d- lle e a egme karja. A kódszegmens bá
yh és
is D
engAM
dél mé
en hoz rést. Az adatszegmens haére kell beállítani. Ha memálunk, ez megcímezhet
ROlek RAM terület határán túl.
134
A védett üzemmód felépítése, működése
CS
SS
DS
ES
FS
GS
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
EPROM
DRAM
4G
0
FIZIKAIDESZKRIPTOROK
SZEGMENSREGISZTEREK MEMÓRIA
SZEGMENS
MEMÓRIA I/O
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
3.22. ábra: Védett sík modell 3.6.3.1.3. Multiszegmens modell
A legbonyolultabb modell a multiszegmens modell. Itt a gmentáló mechanizmus teljeskörű lehetőségeit használjuk. Minden es programnak megvan a saját szegmensdeszkriptor táblázata és a t szegmensei. A szegmensek lehetnek teljes mértékben a program
agántulajdonában", vagy bizonyos más programkal lehetnek gosztva. A programoknak bizonyos szegmensekhez való hozzáférése enként ellenőrizhető.
Maximum hat sze
szeegysajá"mmeegy
gmens állhat rendelkezésre azonnali használatra. Ezek azok a szegmensek, amelyeknek a szegmens-szelektorai a szegmensregiszterekbe vannak betöltve. Más szegmensekhez a szegmens szelektoraik szegmens regiszterbe való betöltésével lehet hozzáférni. (Lásd a 3.23 ábrát). Minden egyes szegmens egy különálló címtartomány. Mindamellett, hogy megengedett a fizikai memória egymással szomszédos blokkjaiba betölteni őket, a szegmentáló mechanizmus meggátolja, hogy egy szegmens tartalmához hozzáférhessünk egy másik szegmens határát átlépő olvasással. Minden memóriát érintő műveletnél ellenőrizve van annak a szegmensnek a határa (limit), amelyet a művelet
135
Általános CPU programozási információk
használ. A szegmens határát túllépő memóriacímzési próbálkozás általános védelmi hiba kivételt eredményez. A szegmentáló mechanizmus csak a szegmens deszkriptorban
eghatározott címtartomány betartását követeli meg. Az operációs
lefocím sek használata. Például, egy rendszer
OM-jában tárolva lehet kód is, adat is. Kódszegmens deszkriptort
ada
mrendszer feladata minden egyes szegmensnek különálló címtartományokat
glalni. Elképzelhető olyan eset is, amelyben szükséges lehet közös tartományt megosztó szegmen
Rhasználunk, ha a ROM-ban utasításelérést végzünk. Ha a ROM-ot
tként olvassuk, adatszegmens deszkriptort használunk.
CS
SS
DS
ES
FS
GS
FIZIKAIDESZKRIPTOROK
SZEGMENSEGISZTEREK MEMÓRIA
SZEGMENSR
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
HOZZÁFÉRÉS HATÁR
BÁZISCÍM
3.23. ábra: Multiszegmens modell
136
A védett üzemmód felépítése, működése
3.6.3.
Egy logikai cím a szegmenst jelölő 16 bites szegmens 2 bites ofszetből áll. A
gikai címek a hozzáférési jog és a tartomány szempontjából kerülnek a teszteknek, a logikai címeket a
rocesszor lineáris címekre fordítja le, az ofszetet hozzáadva a szegmens báziscí h rból származik, ami egy memór a ns méretéről, helyzetéről és
ozzáférési adatairól szolgáltat információt. A szegmensdeszkriptort két
ns áll rendelkezésére. Ez az hat szegmens, amelyeknek a szegmens szelektora fel van töltve a
processzorba. A szegmens szelektor a logikai cím megfelelő lineáris címmé alakítására használatos információkat tartalmazza. Minden memória hivatkozás típusnak (kód tartományra, verem tartományra és adat tartományra), külön szegmensregisztere van a processzorban. Ezek az aktuálisan használat alatt álló szegmensek szegmensszelektorjait tartalmazzák. Más szegmensekhez való hozzáférés szükségessé teszi a szegmensregiszterek feltöltését a MOV utasítás különböző formáinak segítségével. Legtöbb négy adat tartományt lehet egyszerre elérni, ami tehát összesen hat szegmensregisztert jelent. Mikor egy szegmensszelektor betöltésre kerül, a báziscím, a szegmenshatár és a hozzáférési jogot ellenörző információk is betöltődnek a szegmensregiszterbe. A processzor addig nem nyúl a memóriában levő deszkriptor táblázathoz, ameddig egy új szegmens szelektor nem kerül betöltésre. A processzorban eltárolt információk
2. Szegmensfordítás szelektorból, valamint a szegmensen belüli 3loellenőrzés alá. Ha megfelel ezeknekp
mé ez. A báziscím a szegmensdeszkriptoiáb n tárolt adatstruktúra, és a szegme
htáblázat valamelyikéből kaphatjuk meg. Vagy a globális deszkriptor táblázatból (GDT), vagy a lokális deszkriptor táblázatból (LDT). A rendszerbeli összes programnak egyetlen GDT táblázata van, és egy-egy különálló LDT táblázata minden egyes futó programnak. Ha az operációs rendszer megengedi, különböző programok osztozhatnak ugyanazon LDT-n. A rendszert úgy is konfigurálhatjuk, hogy egy LDT táblázatot se tartalmazzon. Ebben az esetben minden program a GDT-t fogja használni. Minden logikai címhez egy szegmens van rendelve (még akkor is, ha az operációs rendszer minden szegmenst ugyanabba a címtartományba képez le). Annak ellenére, hogy egy programnak sok ezer szegmense lehet, azonnali alkalmazásra csak hat szegmea
137
Általános CPU programozási információk
lehetővé teszik számára a címek lefordítását anélkül, hogy plusz buszciklusokra lenne szüksége. Az olyan rendszerekben, amelyekben több processzornak van hozzáférési lehetősége ugyanazon deszkriptortáblázatokhoz, a software köteles a szegmensregisztereket újratölteni, valahányszor a deszkriptor táblázatokat módosítástja. Ha ez nem így történik, fennáll az a lehetőség, hogy egy szegmens regiszterben eltárolt régi szegmens deszkriptor kerül alkalmazásra, miután a memóriarezidens változata már megváltozott. A szegmensszelektor a deszkriptortáblázatok egyikének egy 13 bites indexét tartalmazza. Az index, egy nyolcas skálatényezővel való beszorzás után (ennyi Byte található egy szegmensdeszkriptorban) a deszkriptor táblázat 32 bites báziscímével adódik össze. A báziscím vagy a globális deszkriptortáblázat regiszterből (GDTR), vagy a lokális deszkriptortáblázat regiszterből (LDTR) származik. Ezek a regiszterek tartalmazzák a deszkriptortáblázatok kezdetének lineáris címét. Amint azt 3.24. ábra is mutatja, a szegmensszelektor egyik bitje határozza meg,
hogy a processzor ma
elyik táblázatot használja.
GLOBÁLISDESZKRIPTOR
TÁBLÁZATDE
LOKÁLISSZKRIPTOR
TÁBLÁZAT
TI
TI=0 TI=1
HATÁRBÁZISCÍM
HATÁRBÁZISCÍM
SZELEKTOR
GDTR LDTR
SZEGMENS
SZELEKTOR
138
A védett üzemmód felépítése, működése
3.24. ábra: TI BIT - A deszkriptor tábla kiválasztása A lefordított cím a lineáris cím, amint az a 3.25 ábrán is látható.
Ha nem haszná Ha a lapozás geng
lunk lapozást, ez egyben a fizikai cím is.
me edett, egy második szintű címfordítás adja meg a fizikai címet. Ezzel a típusú fordítással a fejezet későbbi részében foglalkozunk.
0015 31Logokai cím
Deszkriptor tábla
Szelektor Ofszet
031Lineáris cím
3.25. ábra: Szegmens fordítás
3.6.3.2.1. Szegmensregiszterek
Szegmensdeszkriptor
Bármely memóriahozzáférés típushoz egy szegmensregiszter van mre, illetve adatra vonatkozó hivatkozások
a által kijelölt szegmenseket ezik
rendelve. A kódra, vere
indegyike a szegmensregisztereik tartalmmcím meg. További szegmensek tehetők elérhetővé, ha a program végrehajtása közben a szegmens-szelektorjaikat betöltjük ezekbe a regiszterbe. A 3.26 ábrának megfelelően, minden egyes regiszternek van egy "látható" és egy "láthatatlan" része. A szegmensregiszterek látható részének feltöltésére a MOV utasítás különböző formái ismeretesek. A láthatalan részt a processzor tölti fel.
139
Általános CPU programozási információk
Azok a műveletek, amelyek ezeket a regisztereket feltöltik, utasítások a felhasználói programok számára. Két fajta ilyen utasítás létezik: 1. közvetlen betöltő utasítások, mint amilyenek a MOV, POP, LDS, LES, LSS, LGS és LFS utasítások. Ezek
az utasítások expliciten a szegmensregiszterekre vonatkoznak. 2. közvetett betöltő utasítások, mint amilyenek a CALL és JMP
utasítások "far" változatai. Ezek az utasítások a CS regiszter tartalmát működésük implicit részeként módosítják.
Amikor a fenti utasítások egyike végrehajtódik, egy szegmensszelektor betöltődik a szegmensregiszter látható részébe. A processzor automatikusan feltölti a szegm
Látható rész Láthatatlan rész
Szelektor Bázis cím, határ, stb. CSSSDSESFSGS
3.26. ábra: Szegmens regiszterek
ens regiszter láthatatlan részét a eszkriptor táblázatból kiolvasott információkkal (például a áziscímmel). Minthogy az utasítások legnagyobb része azokra a
elyek szelektorai már be vannak töltve a egmens regiszterekbe, a processzor teljesítmény veszteség nélkül képes
nsszelektorai a szegmensregisztereket foglalják el egy adott pillanatban. Ez azt jelenti, tehát, hogy a program a MOV utasítás különböző formáinak segítségével lecserélheti ezen regiszterek tartalmát, mikor új szegmensre van szüksége. Egy szegmensszelektor meghatároz egy szegmens deszkriptort, egy deszkriptortáblázat és a táblázaton belüli deszkriptor megjelölésével.
dbszegmensekre vonatkozik, amsza logikai cím ofszetjét a szegmens báziscímével összeadni. 3.6.3.2.2. Szegmensszelektorok A szegmensszelektor egy szegmens deszkriptornak nevezett, szegmens definiáló információra mutat. Egy programnak lehet több szegmense azon a haton kívül, amelyek szegme
140
A védett üzemmód felépítése, működése
A felhasználói programok számára a szegmens szelektorok egy pointer áltozó részeként jelennek meg, de a szelektorok értékeit általában a
g aders) határozzák meg, illetve módosítják, és nem a felhasználói
programok. A 3.27. ábra egy szelektor formátumát mutatja be.
: 8192 deszkriptor közül kiválaszt egyet a
atból. A
Táblázat mutató bit: Meghatározza, hogy melyik táblázat kerül alkalmazásra. 0-ás bit a
lis LDT-t szelektálja.
génye
inditványozza egy lemezen tárolt
vkapcsolóprogram (link editor) vagy kapcsoló töltőprogramok (linkinlo
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
IN
Index
DEX TI RPL deszkriptortábláz
processzor beszorozza az index értékét egy 8-as skálatényezővel (egy szegmensdeszkriptorban ennyi Byte van) és az eredményt összeadja a deszkriptortáblázat báziscímével (amelyet a GDTR vagy az LDTR regiszter tárol).
Tábla kijelölő0=GDT1=LDT Privilégium szint kérő
00 = Legmagasabb szint11 = Legalacsonyabb szint
3.27. ábra: Szegmens szelektor
GDT-t, 1-es bit az aktuá Í lt privilegizálási szint (RPL): Ha ez a mező egy nagyobb értékű
privilégium szintet jelöl, mint a program szintje (tehát kevésbé privilegizált), akkor egyszerűen felülírja a program privilegium szintjét minden olyan hozzáférés esetén, amely ezt a szelektort használja. Ha egy program egy kevésbé privilegizált szegmensszelektort alkalmaz, a memória hozzáférések az alacsonyabb privilegizálási szinten mennek végbe. Ezt az eljárást annak a védelem sértésnek az elhárítására használják, amely akkor lépne fel, amikor egy kevésbé privilégizált program egy privilégizáltabb programot próbálna arra felhasználni, hogy levédett adatokhoz férjen hozzá.
Például a rendszer kezelő programok vagy a periféria meghajtók (device driver) magas privilégium szinten kell fussanak ahhoz, hogy elérhessék a védelemmel ellátott területeket, mint például a periféria interfészek kontroll regisztereit. Ugyanakkor elkerülendő más, levédett területtel az összeakadás, még akkor is, ha egy kevésbé privilegizált
rogram ezt kérné. Ha egy programp
141
Általános CPU programozási információk
szektor memóriába töltését egy privilegizáltabb program, például az perációs rendszer által elfoglalt helyre, az RPL felhasználható egy
általános védelmi hiba kiváltására a kevésbé privilegizált egmensszelektor használatának pillanatában. Ez a kivétel még akkor is
lső bejegyzésére mutató szelektort) "null szelektorként" használhatunk. processzor nem generál kivételt, ha egy (CS-től illetve DS-től
tort töltünk. Ugyanakkor, ha egy ull szelektort tartalmazó regiszterrel végzünk memória hozzáférést,
.6.3.2.3. Szegmens deszkriptorok A szegmens deszkriptorok a memóriában elhelyezkedő adatstruktúrák, amelyek a szegmens méretét, helyét illetve a vezérlő- és státusinformációkat szolgáltatják a processzor számára. A deszkriptorokat általában a fordítóprogramok, kapcsolóprogramok, betöltőprogramok vagy az operációs rendszer hozzák létre, de semmi esetre sem a felhasználói programok. A deszkriptorok általános formátumát a 3.28. ábra mutatja be. Bármely típusú deszkriptor ennek az alapformátumnak a változatait használja.
o
szlétrejönne, ha a szegmens szelektort használó program privilégium szintje elégséges volna ahhoz, hogy a műveletet egymagában elvégezze. Mivel a GDT legelső bejegyzését a processzor nem használja, egy 0-ás indexel és 0-ás táblázat mutatóval ellátott szelektort (tehát a GDTeAkülönböző) regiszterbe egy null szeleknkivétel keletkezik. Ezt a lehetőséget használaton kívüli szegmens regiszterek inicializálására lehet alkalmazni. 3
142
A védett üzemmód felépítése, működése
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Báziscím 31-24 Báziscím 23-16
Báziscím 15-0 Szegmens határ 15-0
L 19-16
+0
TípusGB
0AV
Szegmenshatár P SDPL +4
D/B - Alap szegmens operandus méret (0 - 16 bites, 1 - 32 bites)A
anDPL - Deszkriptor privilégium szintS
címtartománybeli helyzetét. A processzor összeteszi a három báziscím mezőt és így képezi az egy, 32 bites értéket. A szegmensek báziscím
, a
kód
ezve. Megyjegyzendő,
D_
G - Szemcsézettség
VL - Rendszer program számára engedélyezett a használatP - A szegmens jelen v
- Deszkriptor típus (0 - rendszer, 1 - alkalmazás)0 - Fenntartva
3.28. ábra: Szegmens deszkriptorok
áziscím: Meghatározza a szegmens 4 GByte-os fizikai B
értékei 16 Byte-os keretekhez kell illeszkedjenek annak érdekébenhogy a programok teljesítményét maximalizálják az adatok, illetve
16 Byte-os keretekbe történő illesztésével. Felbontás (Granularity) bit: A szegmenshatár (Limit) mező értékének
4096-os (212) tényzővel való skálázását engedélyezi. Ha a bit értéke 0, a szegmenshatár értéke egy Byte-os egységekben, ellenkező esetben 4 kByte-os egységekben van értelmhogy a skálázás alkalmazása esetén a címek 12 legkevésbé értékesbitje nem kerül ellenőrzésre. Például, ha a G bit magas, egy 0-ás szegmenshatár a 0-4095 közötti tartományba helyezi a megengedett eltolási címeket. Fontos azt is megjegyeznünk, hogy ez kizárólag a szegmenshatár mezőre érvényes. A báziscím mindig Byte-os felbontású marad.
143
Általános CPU programozási információk
Sze
bites értéket. A szegmens hosszát a processzor kétféleképpen en:
gikai címek ofszetjei 0-tól szegmenshatár értékéig terjedhetnek. Más ofszetek kivételt generálnak. lefele bővülő szegmensek megváltoztatják a limit mező értelmét.
k a 0-tól a egmenshatárig terjednek (lásd a szegmenstípus mezőt a
e helyezzük, amely nem kell méretet változtasson, akkor z egy közönséges adatszegmens is lehet.
l. Adatszegmensekben a bit neve B bit, és a veremmel végzett műveletek két aspektusát elle
gmenshatár (Limit): A szegmens méretét határozza meg. A processzor összeteszi a két szegmenshatár mezőt, így kapja meg a 20
értelmezi, a felbontás (G) bit állapotának függvényéb
1. Ha G=0, a szegmens hossza egy Byte-tól egy MByte-ig terjed, 1 Byte-os növekménnyel.
2. Ha G=1, a szegmens hossza 4 kByte-tól 4 GByte-ig terjed, 4
kByte-os növekménnyel. A felfele bővülő szegmensek esetén a loaABármely ofszettel megcímezhetők, kivéve azokkal, amelyeszkövetkezőkben). Ennek az az értelme, hogy lehetővé tegye olyan szegmensek képezését, amelyeknél a szegmenshatár értékének növelésével a szegmens címtartományának alján foglalódik le új memóriaterület, és nem a szegmens tetején. A lefele bővülő szegmensek célja a verem befogadása, de használatuk nem kötelező. Ha a stack-et egy olyan szegmensbe S bit, deszkriptor típusát lelző bit: Meghatározza, hogy egy adott
szegmens rendszer szegmens vagy kód- illetve adatszegmens. Ha S=1, a szegmens vagy kódszegmens, vagy adatszegmens. Ha S=0, a szegmens egy rendszer szegmens.
D bit / B bit: Kódszegmensek esetében ennek a bitnek a neve D bit, és az
operandusok és effektív címek alapértelmezés szerinti hosszát jelöli. Ha a D bit 1-re van állítva, 32 bites operandusokat és 32 bites effektív címzésmódot határoz meg. Ellenkező esetben 16 bites operandushosszt és 16 bites címzésmódot jelö
nőrzi:
144
A védett üzemmód felépítése, működése
1. A veremmutató regiszter méretét. Ha B=1, a PUSH, POP és CALL típusú műveletek mindegyike a 32 bites ESP regisztert használja; ha B=0, a verem műveletek a 16 bites SP regisztert használják.
határ (limit) mező határozza meg a verem szegmens alsó korlátját. Ha B=1, a felső korlát FFFF_FFFFH; ha B=0, a felső korlát FFFFH.
zegmenstípus mező: ennek a mezőnek az értelmezése attól függ, hogy a sze
típus mezője meghatározza az engedélyezett szegmens hozzáférés típusát, és a szegmens növekedési irányát (lásd 3.29. ábra). Adatszegmensek
rom bitjének a következő az értelme: lefele terjedő (E - expand-down), írás engedélyezés (W - wri
Az adatszegmensek lehetnek csak olvasható, illetve ható/olvasható típusuak. A veremszegmensek olyan adatszegmensek,
típusuak. Ha az SS regiszterbe ármilyen más típusú szegmens szelektora kerül betöltésre, általános delm
esetben nagyobbnak kell nnie a szegmens limit értékénél. A szegmenshatár ezen értelmezésének gfel
2. Egy lefelé bővülő verem felső korlátját. Lefelé terjedő szegmensek
esetén a szegmens
S
gmens deszkriptor egy felhasználói szegmens vagy egy rendszer szegmens deszkriptora. A rendszer szegmenseknek kissé eltérő a deszkriptor formátuma, lásd később. Egy momória deszkriptor
esetén a szegmenstípus mező legalsó há
te enable), illetve elért (A - accessed). Kódszegmensek esetén az említett három bit értelme: illeszkedő (C - conforming), olvasás engedélyezés (R - read enable), illetve elért (A - accessed).
íramelyek kötelezően írható/olvasható bvé i hiba kivétel generálódik. Ha a verem szegmens mérete változó kell legyen, akkor ez egy lefele bővülő adatszegmens lehet. A szegmenshatár értelme megváltozik a lefele bővülő szegmens esetében. A lefele bővülő szegmensekben azok a szabályos ofszet címek, anelyek a felfele növekvő szegmensekben kivételeket idéznek elő. A felfele bővülő szegmenseket csak olyan eltolási címekkel lehet megcímezni, amelyek értéke kisebb vagy egyenlő a szegmenshatárnál. A lefele terjedő szegmensekbe mutató ofszeteknek minden leme elően a szegmenshatár csökkenése a szegmens alján eredményez memória foglalást, ami a veremszegmens esetében helyes, ugyanis a verem az alacsonyabb címek irányába terjed. Ha a veremnek egy fix
145
Általános CPU programozási információk
méretü szegmenst foglalunk le, ez a szegmens nem kell feltétlenül lefele növekvő legyen.
146
A védett üzemmód felépítése, működése
Típus 11 10
E 9 W
8 A
Deszkriptor típus
Meghatározás
0 0 0 0 0 Adat Csak olvasható 1 0 0 0 1 Adat Csak olvasható, hozzáférhető 2 0 0 1 0 Adat Írható - olvasható 3 0 0 1 1 Adat Írható - olvasható,
hozzáférhető 4 0 1 0 0 Adat Csak olvasható, lefelé
növekvő 5 0 1 0 1 Adat Csak olvasható, hozzáférhető,
lefelé növekvő 6 0 1 1 0 Adat Írható, olvasható, lefelé
növekvő 7 0 1 1 1 Adat Írható, olvasható,
hozzáférhető, lefelé növekvő Típus 11 10
C 9 R
8 A
Deszkriptor típus
Meghatározás
0 1 0 0 0 Kód Csak végrehajtható 1 1 0 0 1 Kód Csak végrehajtható,
hozzáférhető 2 1 0 1 0 Kód végrehajtható, olvasható 3 1 0 1 1 Kód végrehajtható, olvasható,
hozzáférhető 4 1 1 0 0 Kód Csak végrehajtható, illeszkedő 5 1 1 0 1 Kód Csak végrehajtható,
hozzáférhető, illeszkedő 6 1 1 1 0 Kód végrehajtható, olvasható,
illeszkedő 7 1 1 1 1 Kód végrehajtható, olvasható,
hozzáférhető, illeszkedő
3.29. ábra: Alkalmazási szegmens típusok A kódszegmensek lehetnek végrehajtható/olvasható, illetve csak végrehajtható típusuak. Egy végrehajtható/olvasható szegmens hasznos
147
Általános CPU programozási információk
lehet például abban az esetben, ha egy ROM-ba az utasításkóddal együtt onstansokat is elhelyeztek. Ebben az esetben a konstansok kiolvashatók
dményez, ha nem használunk taszkkaput. Azok a rendszer kezelő rogramok, amelyek nem férnek hozzá levédett területekhez, mint milyenek az adat konverziót végző eljárások (pld. EBECDIC/ASCII
matikai könyvtár) és egyes ivételtípusok (például: Osztási hiba, INTO által detektált túlcsordulás és
b letesztelve a software követni tudja a szegmens felhasználást. Például,
almazás összes szegmensének A bitjeit. Ha az alkalmazás kiakad, lehetővé vállik ezen bite
neáris címek helyességére.
szegmens elérésekor, ég akkor is, ha a hozzáférés egy olvasási ciklus. Ha a deszkriptor
nben a ciklus soha sem fejeződne be. A hardware zen tulajdonságai szükségesek, ha ROM-ra alapozott deszkriptor
táblázatokat használunk a 386-os processzorban, amely beállítja az A bitet valahányszor egy szegmens deszkriptor. betöltésre kerül. A 486 és
kvagy egy CS fölülíró prefixel ellátott utasítással, vagy egy kódszegmensre vonatkozó szegmens szelektornak egy adatszegmens regiszterbe történő betöltésével. A kódszegmens lehet illeszkedő (conforming), vagy nem illeszkedő (non-conforming). A vezérlés átadása egy privilegizáltabb, illeszkedő szegmensnek megtartja a CPL értékét. Egy nem illeszkedő szegmensnek eltérő privilégium szinten átadott vezérlés általános védelmi hibát erepafordítás, Huffman kódolás/dekódolás, matekBOUND típusú tartomány átlépés) tölthetők csak az illeszkedő kódszegmensekbe. A szegmenstípus (Type) mezőbeli A (accessed) bitet a processzor állítja
be azzal a céllal, hogy jelezze egy szegmens szegmensregiszterbe való töltését. Az A bitet 0-ás kezdeti értékre állítva, majd későb
egy programfejlesztő rendszer kitörölheti egy alk
k állapota alapján az alkalmazás által elért összes szegmens feltérképezése. A hibakereső mechanizmus által biztosított töréspontokkal ellentétben (lásd 2. kötet), a felhasználtsági információ inkább a szegmensek használatára vonatkozik, mintsem a li
A processzor aktualizálhatja a Type mezőt amtáblázatok a ROM-ban vannak elhelyezve, szükségessé vállhat a hardware részére, hogy az írási ciklus ideje alatt megelőzze a ROM adatbuszra való csatlakozásának engedélyezését. Ugyanakkor egy ROM-ba író ciklus esetén szükség lehet a READY# jel processzorba történő visszajuttatására, külöe
148
A védett üzemmód felépítése, működése
Pentium processzorok ellenben csak akkor állítják 1-re az A bitet, ha az előzőleg még nem volt beállítva. A ROM-ba elhelyezett deszkriptortáblázatokba való írás megelőzhető, beállítva minden egyes deszkriptor A bitjét. DPL (Descriptor Priviledge Level) a deszkriptor privilégiumszintje. A
szegmens privilégiumszintjét határozza meg, a már leírt védelmi mechanizmus alkalmazásával.
A szegmens jelenlétét jelző bit: Ha ez a bit értéke 0, a processzor egy
"betöltetlen szegmens" kivételt generál, amikor a deszkriptor szelektora betöltődik egy szegmens regiszterbe. Ezt az időközben elérhetetlenné vállt szegmensekhez való hozzáférés felismerésére használják. Egy szegmens akkor vállhat elérhetetlenné (unavailable), mikor az operációs rendszernek szabad memória területet kell létrehoznia. A memóriában helyet foglaló, alkalmazáson kívüli struktúrák, mint például a fontok vagy periféria meghajtók által elfoglalt hely felszabadításra kerül. Egy struktúra helye a szegmens "betöltetlen" megjelölésével szabadítható fel (ezt a szegmens jelenlétét jelző bit 0-ra állításával lehet elérni). Ezt követően a szegmens által eddig lefoglalt területet felhasználhatjuk más célra. A legközelebbi alkalommal, mikor a felszabadított struktúrára szükség van, a "betöltetlen szegmens" kivétel fogja jelezni, hogy a szegmenst újra be kell tölteni a memóriába. A mem.szervezés ezen a felhasználói programok számára áttetsző formáját virtuális memóriának nevezzük. Egy operációs rendszer a fizikai memóriánál sokkal nagyobb mennyiségü virtuális memóriát képes fenntartani azzal, hogy minden pillanatban csak néhány szegmenst tárol egyszerre a fizikai memóriában.
A 3.30 ábrán egy olyan deszkriptor formátumát láthatjuk, amelyben a szegmens jelenlétét jelző bit törölve van. Ha ez a bit 0, az operációs rendszernek engedélyezve van az "Elérhető" (Available) mezőben eltárolni a saját adatait, mint például a hiányzó szegmens helyét tekintő információkat.
149
Általános CPU programozási információk
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
TípusP SDPL +4
+0Elérhető
Elérhető Elérhető
3.30. ábra: Szegmens deszkriptor (a szegmens nincs jelen)
3.6.3.2.4. Szegmensdeszkriptor-táblázatok Két fajta deszkriptortáblázat létezik:
• a globális deszkriptortáblázat (GDT) • a lokális deszriptortáblázat (LDT)
A taszkoknak van egyetlen egy, közös GDT-je, illetve minden egyes aktív taszknak külön-külön van egy LDT-je. A deszkriptor táblázat egy szegmens deszkriptorokból álló tömb, amint azt a 3.31. ábra mutatja. Egy deszkriptor táblázat hossza változó, és legtöbb 8192 (213) deszkriptort tartalmazhat. A processzor nem használja a GDT legelső deszkriptorát. Erre a "null deszkriptorra" mutató szegmens szelektor, adat szegmens regiszterekbe (DS, ES, FS vagy GS-be) töltve, nem generál kivételt, viszont minden olyan esetben kivételt eredményez, amelyben megkísérelünk egy memória hozzáférést ezzel a deszkriptorral. Inicializálva a szegmensregisztereket ezzel a szegmensszelektorral, garantálhatjuk, hogy a használaton kívüli szegmensregiszterekre való véletlen hivatkozások kivételt idézzenek elő.
150
A védett üzemmód felépítése, működése
GLOBÁLISDESZKRIPTOR
TÁBLÁZAT TÁBLÁZAT
LOKÁLISDESZKRIPTOR
+32
+40
+48
+56
+32
+40
+48
+56
+16
+24
HATÁRBÁZISCÍM
HATÁRBÁZISCÍM
GDTR regiszter
Az első deszkriptor aGDT-ben nem használt +0
+8
HOZZÁFÉRÉS
LDT deszkriptor(GDT belépési pont #2)
+0
+8
+16
+24
Ezek a regiszterek tartalmazzák a táblázatok 32 bites
y olyan címre, amelynek 4-el való osztási maradéka 2). Így a rocesszor egy illesztett szót, és azt követően egy illesztett duplaszót
ormális esetben nem tárolnak s-ellenőrzési hiba kiváltásának
hetős
3.31. ábra: Deszkriptor táblázatok 3.6.3.2.5. Deszkriptortáblázat bázisregiszterek A processzor a GDTR és IDTR regiszterek alapján találja meg a globális deszkriptor táblázatot (GDT), illetve a megszakítások
eszkriptorát (IDT).dlineáris címtartománybeli címeit. Ezenkívül tárolják még a táblázatok méreteinek 16 bites határ értékét. Valahányszor az IDTR és GDTR regiszterek betöltésére vagy elmentésére kerül sor, egy - a 3.32 ábrán látható - 48 bites "pszeudódeszkriptor"-ra történik memóriahivakozás. A felhasználómódbeli (3. privilégiumszint) illeszkedési hibák elkerülése végett ajánlatos a pszeudódeszkriptort páratlan szó címre elhelyezni
agyis eg(vptárol. A felhasználó-módbeli programok n
szeudó-deszkriptorokat, de egy illeszkedéple ége elkerülhető a pszeudódeszkriptorok ilyen típusú illesztésével.
151
Általános CPU programozási információk
A cache vonal feltöltés teljesítményének maximalizálása érdekében célszerű a GDT és IDT báziscímeit egy nyolc Byte-os kerethez illeszteni. A GDT, illetve IDT határértékei Byte-okban vannak
kifejezve. Csakúgy, mint a szegmensek es
47 16 15 0
Báziscím Határ
3.32. ábra: Pszeudó deszkriptor formátum
tében, itt is a határ (limit) rtékét a báziscímmel összeadva kapjuk meg az utolsó, érvényes Byte
ét.
ki.
or tábla a lokális deszkriptortáblázat (LDT). Egy 16 t onosítja, amelyet az LDTR regiszter tárol. A ziscímét és határér T (GDT-ből kio s nal feltöltés (cache
ne fill) teljesítményének maximalizálása érdekében ajánlatos az LDT-t
.6.3.3. Lapfordítás
lás mentes ímtartománybeli 32 bites címet értünk. Ez a címtartomány lehet egy
émi lemezterület gítségével. Ha lapozást használunk, a lineáris cím vagy a neki egfel
p mezreküldésének kíséretében), majd újraindítsa a kivételt előidéző
écím Ha a határ értéke 0, pontosan egy érvényes Byte-ot határoz meg. Minthogy a szegmens deszkriptorok hossza minden esetben nyolc Byte, a határ értéke mindíg eggyel kevesebb kell legyen mint nyolc egész számú sokszorosa (tehát 8N-1). Az LGDT és SGDT utasítás feltölti, illetve kiolvassa a GDTR regisztert, a LIDT és SLDT utasítás pedig az IDTR regisztert tölti fel, illetve olvassa
A harmadik deszkript bi es szegmens szelektor azz LDTR regiszter ezen kívül tartalmazza az LDT bá
tékét, de ezeket a processzor tölti be automatikusan az LDlva ott) szegmens deszkriptorából A cache vo
liegy nyolc Byte-os kerethez illeszteni. 3 Lineáris cím alatt egy egyenletes, szegmentáckiterjedt fizikai címtartomány (például több GByte-nyi RAM-ból képezett), ugyanakkor a lapozás segítségével szimulálható ez a címtartomány, egy kis mennyiségű RAM és nsem elő fizikai címre fordítódik, vagy egy kivétel generálódik. A kivétel biztosítja az operációs rendszernek azt a lehetőséget, hogy beolvassa a lapot a lemezről (valószínűleg egy másik laleutasítást.
152
A védett üzemmód felépítése, működése
A lapozás abban tér el a szegmentálástól, hogy fix méretű lapokat használ. A szegmensekkel ellentétben, amelyeknek hossza általában megegyezik a bennük foglalt kód- vagy adatstruktúrák méretével, a lapoknak rögzített méretük van. Abban az esetben, ha a szegmentálás a címfordítás egyedüli felhasznált módja egy, a fizikai memóriában jelen
vő adatstruktúrának minden része a memóriában található. Ha lapozást gy része a memóriában, másik része a
ely vagy a lineáris címeket térképezi
Lookaside uffer) nevet viselik. A TLB a legtöbb laptáblázat olvasásra irányuló
kérésnek eleget tesz. A felesleges buszciklusok csak akkor jelennek meg, am -ben nin t. Ez általában akkor történik, amikor egy laphoz szú ideje nem ozzáférés. 3.6.3.3 Lapozási op lapozás megengedett, ha a CR0 . bitje magasra van állítva. t a bitet álta az operáció ware inicializ s idején. Ha zás engedé ek lineáris címekk lakításához a dításnak eg zintjét alkalmazzuk. Ha a lapozás nem engedélyezett, a lineá s. A PG bit 1 kell legyen, ha az operációs rendszer egynél több programot futtat virtuális 8086-os üzemmódban, vagy az igényeknek megfelelően lapozható (demand-page) virtuális memór
lehasználunk, az adatstruktúra e
mezen lehet. Az az információ, amlele fizikai címekre, vagy kivételeket vált ki, egy memóriában tárolt, laptáblázat néven ismert adatsruktúra. Csakúgy, mint a szegmentálás esetében, ez az információ is egy processzoron belüli gyorsítótárba (cache) kerül, a címfordításra szükséges buszciklusok számának minimizálása érdekében. A szegmentálással ellentétben, a címfordító gyorsítótárak teljesen áttetszőek a felhasználói programok részére. A processzor által címfordításra felhasznált információkat tároló
yorsítótárak a "fordítási segédpuffer" (TLB - Translation gB
ikor TLBa hos
c las talá volt h
.1. ciók
A regiszter 31Ez lában s rendszer állítja be a softálá a lapo lyezett, a fizikai cím
é a címfor y második sris cím egyben fizikai cím i
iát használunk.
153
Általános CPU programozási információk
3.6.3.3.2. Lineáris cím A 3.33 ábrán egy 4 kByte-os lap lineáris címének formátumát láthatjuk.
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Lapcímtár Táblázat Ofszet
izsgál lapcímtár, táblázat, és fszet me
használja használja la tal kijelölt laptáblázatban. Az ofszet mezőt a laptáblázat által mhasznája.
6 Byte-nyi adatot tartalmaz, vagy legtöbb 1
Két szegcím el. Egy pcímtár m xim
laptáblázatocímez meg f Teh1 MByte (220 en egyes lap 4 kByte (212GByte-nyi
Byte-nál na tű lapok használatának támogatásáról a ggelékben olvashatunk.
3.33. ábra: A lineáris cím formátuma
A 3.34. ábra bemutatja, hogy a processzor a laptáblázatokat va, miként fordítja le egy lineáris címv
o zőit fizikai címre. A címzőmechanizmus a lapcímtár mezőt indexként egy lapcímtárban. A táblázat mezőt indexként
pcímtár álaeghatározott lapon belüli operandusok címzésére
3.6.3.3.3. Laptáblázatok A laptáblázat egy 32 bites bejegyzéseket tartalmazó tömb. Maga a laptáblázat is egy lap, és 409kByte 32 bites bejegyzést. A négy kilóByte-os oldalak, beleértve a lapcímtárakat és a laptáblázatokat is, 4 kByte-os keretekhez illeszkednek.
inten elhelyezett táblázatokat alkalmazunk egy memória lap zéséhez. A legkülső szinten a lapcímtár helyezkedikm
la a um 1024 bejegyzést tárol, amelyek a második szintű kat címezik meg. Egy laptáblázat legtöbb 1 kByte-nyi lapot
izikai memóriában.a
át egyetlen lapcímtár által megcímzett laptáblázatok összesen ) 4 kByte-os lapot képesek megcímezni. Ha mind
) Byte-ot tartalmaz, egyetlen címlaptár laptáblázatai 4 (220x212=232) lineáris címtartományt képes átfogni. A 4
gyobb mérekfü
154
A védett üzemmód felépítése, működése
Lapcímtárbejegyzés
Lap táblázat
Fizikai cím
Lap directory
Lap táblázat
Lap keret
bejegyzés
Lapcímtár Táblázat Ofszet
3.34. ábra: Lapfordítás Az aktuális lapcímtár fizikai címe a CR3-as regiszterben van eltárolva, amelyet még a lapcímtár báziscím regiszterének (PDBR) is nevezünk. A memóriaszervező software dönti el, hogy az összes taszk egy lapcímtárat használ-e, vagy minden egyes taszk rendelkezik egy külön lapcímtárral, esetleg a két megoldás valamilyen kombinációját használja. 3.6.3.3.4. Laptáblázat bejegyzések A laptáblázatok és lapcímtárak bemenőpontjai, 4 kByte-os lapok esetén, a 3.35 ábrán látató formátumok egyikével rendelkeznek. A 4 kByte-nál nagyobb lapok laptáblázat- és lapcímtár formátumáról további információk a függelékben találhatók.
155
Általános CPU programozási információk
10
23
10
78
1415
19
31
456789
10
14
19
31
111213
15161718
2021222324252627282930
10
23456Piszkos
HozzáférhetőCache tiltott
ÁtíróFelhasználó
ÍrhatóJelen van
7
14
19
31
0
31-122021222324252627282930
Lapkeret
cím2021222324252627282930
89
10111213
0
Hozzáférhetőa programozó
számára
15161718
23456
910111213
161718
10
789
10
1415
19202122
31
0
programozószámára
ÍrhatóJelen van
31-12
Lapméret (0=4k)
Laptáblázatbejegyzés
Lapcímtárbejegyzés
3.35. ábra: A lapcímtár formátuma és a laptáblázatok elemei a 4K-s .
szintű ptáblázatban a lapkeret cím annak a négy kByte-os lapnak a címe, ely a
móriába, és laptáblázat bejegyzés fennmaradó része az operációs rendszer
2324252627282930
Lapkeret
cím
161718
111213
Hozzáférhetőa
23456
HozzáférhetőCache tiltott
ÁtíróFelhasználó
0
lapokhoz 3.6.3.3.5. Lapkeret cím A lapkeret cím a lap fizikai kezdőcímét határozza meg. A lapcímtárakban a lapkeret cím egy laptáblázat címe. Egy másodiklaam keresett operandust, illetve utasítást tartalmazza. 3.6.3.3.6. A Present (betöltött, jelenlevő) bit A P bit megmutatja, hogy egy lapkeret a fizikai memóriában jelenlevő lapra mutat-e. Ha a Present bit törölve van, a lap nincs betöltve a mearendelkezésére áll, hogy abba tárolhassa például a hiányzó lap hollétéről
156
A védett üzemmód felépítése, működése
szóló információt. A 3.36 ábrán látható a laptáblázat bejegyzés formátuma abban az esetben, ha a Present bit értéke 0. 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
0H o z z á f é r h e t ő
3.36. áb mátuma nem jelenlévő lapoknál
Ha zintjén a P bit törölve van, egy ptáblázat bejegyzés használatát célzó kisérlet laphiba kivételt
ről a fizikai memóriába.
Az
. A kivételt előidéző program ezek után újraindítódik.
ra: Laptáblázat bejegyzés for
a laptábálzatok bármely slaeredményez. Az igényeknek megfelelően lapozható (demandpage) virtuális memóriát támogató rendszerekben,a tárgyalt esetben a következő eseménysorozat jelentkezik: 1. Az operációs rendszer betölti a lapot a lemez 2. operációs rendszer bejegyzi a lapkeret címét a laptáblázatba és
beállítja annak P bitjét. Más bitek, mint például a piszkos (dirty) illetve a hozzáfért (accessed) bitek is beállítódhatnak.
3. Minthogy egy fordítási segédpuffer (TLB) még mindég tartalmazhatja
a régi laptáblázat bejegyzés másolatát, az operációs rendszer érvényteleníti azokat. A fordítási segédpufferek (TLB-k) érvénytelenítésének mikéntjét a fejezet későbbi része tárgyalja.
4 Megjegyzendő, hogy a lapcímtárnak mint olyannak, nincs Present bitje a CR3-ban. A lapcímtár betöltetlen is lehet, amíg a hozzárendelt taszk felfüggesztett állapotban van, de az operációs rendszernek biztosítania kell azt, hogy a CR3-nak egy folyamat TSS-ében levő képe által kijelölt lapcímtár, jelen legyen a fizikai memóriában, még mielőtt a folyamat megkapná a vezérlést. A lapcímtárnak ezenkívül mindaddig a memóriában kell maradnia, amíg a taszk aktív.
157
Általános CPU programozási információk
3.6.3.3.7 Hozzáfért (accessed) és "piszkos" (dirty) bitek Ezen bitek szolgáltatnak adatokat a laphasználatról a laptáblázatok
indkét szintjén. Az Accessed bit a lapokhoz, vagy egy második szintü ptáblázathoz történő olvasási vagy írási hozzáférések jelzésére használt.
zzáférés jelzésére használatos. Ezeket a iteket a hardware állítja be, bár a processzor impiciten egyik bitet sem
sra, a processzor nem használja a lapcímtár D bitjét.
z operációs rendszer ellenőrizheti, hogy a laphoz olt-e írás-hozzáférés. Ha a lapnak létezik a lemezen egy másolata, és
mlaA Dirty bit egy lapba való írási hobtörli ezek közül. A processzor az A bitet a laptáblázatok mindkét szintjén beállítja, még a lapot olvasó illetve író műveletek előtt. A processzor még egy, az illető laptáblázat bejegyzés által megjelölt címre író művelet előtt beállítja a D bitet. Kizárólag a második szintü laptáblázat Dirty bitje kerül felhasználá Az operációs rendszer felhasználhatja az Accessed bitet, amikor némi szabad tárterületet kell létrehoznia egy lap vagy egy második szintü laptáblázat lemezre küldésével. A laptáblázatok A bitjének periódikus törlésével ellenőrizheti, hogy melyek az utoljára használt lapok. A használatlan lapok esélyesek a lemezreküldésre. Az operációs rendszer felhasználhatja a Dirty bitet, amikor egy lapot visszaküld a lemeztárra. A lap memóriába töltésének pillanatában törölve a Dirty bitet, avnem történt írás-hozzáférés a memóriában levő példányhoz, nem szükséges a diszk memória szerinti frissítése. A könyv második kötetéből megtudhatjuk, hogy a multiprocesszoros rendszerekben a processzor hogyan újítja fel az Accessed és Dirty biteket. 3.6.3.3.8. Írás/olvasás illetve felhasználó/felügyelő bitek A Read/Write és User/Supervisor biteket a processzor lapvédelem ellenőrzésre használja fel, amit a címfordítással egyidőben végez. A védelemről bővebb információ a fejezet későbbi részében található.
158
A védett üzemmód felépítése, működése
3.6.3.3.9. Lapszintű cache-vezérlő bitek A PCD és PWT biteket lapszintű cache szervezésre alkalmazzák. A software-ek ezen bitek segítségével kontrolálhatják az önálló lapok vagy a második szintű laptáblázatok cache használatát. A cache
asználatról bővebb információ egy későbbi fejezetben található.
znált laptáblázat bemeneteket a processzor a hip-be épített cache tárakban, az úgynevezett fordítási segédpufferekben,
tasítás cache memóriáknak különálló fordítási segédpufferei vannak. A
memhajttart (amoperációs rendszerek programozóinak azonnal érvényteleníteni kell a
rdítási segédpuffereket (elvetve ezekből a laptáblázat bemenőpontokat)
bit ker k nem tartják számon a
áltozásokat, és ennek következtében az ezt követő laptáblázat-
érvegy
pld.: MOV CR3,EAX
h 3.6.3.3.10. Fordítási segédpufferek A legutoljára hasc(más néven TLB) tárolja. A Pentium mikroprocesszorban az adat- és ulapozások legjelentősebb hányada a TLB-k tartalmát használja fel. A
óriában található laptáblázatok elérésére csak abban az esetben ódnak végre buszciklusok, amikor a fordítási segédpufferek nem almazzák a kért lap fordítási információit.
A TLB-k áttetszőek a felhasználói programok számára elyeknél PL>0), de az operációs rendszerek számára (PL=0) nem. Az
fovalahányszór a laptáblázat bemenetek módosúlnak (akkor is, ha a Present
értéke 0). Ha ez nem így történik, akkor címfordításkor felhasználásra ülhetnek olyan régebbi adatok, amelye
vhivatkozások helytelenek lehetnek.
Az operációs rendszer a CR3-as regiszter feltöltésével énytelenítheti a TLB-ket. A CR3-as regiszter a következő két eljárás ikével tölhető fel:
1. Explicit feltöltés a MOV utasítás alkalmazásával, mint
159
Általános CPU programozási információk
2.
utasítás csak egyetlen TLB bemenetet rvénytelenít; bár egyes esetekben az INVLPG teljes egészében
érvényteleníti az utasítás-cache TLB-t.
.6.3.4. Szegmens- és lapfordítás keverése
sszefoglalja a logikai ímek fizikai címekre való fordításának mindkét stádiumát, a lapozás
Ha a 32 bites processzor szegmensek nélkül megírt software-eket áló képességének
ikapcsolása. A 32 bites processzoroknak nincs szegmentálás letiltó m
adattar a való leképezésével. 32 bites processzorutasítások által használt 32 bites ofszetek 4 GByte-
Ha lapozást használunk, a szegmensek a teljes lineáris
artlapozócímtart
Implicit feltöltés taszkkapcsolással, amely megváltoztatja a CR3-as regiszter tartalmát (Lásd később, taszkkapcsolás).
Amikor egy önálló lap leképezése (mapping) változik meg, az operációs rendszernek az INVLPG utasítást kell használnia. Ha lehetséges, az INVLPGé
3 A 3.37. ábra egyesíti a 3.36 és 3.34 ábrákat, és öcengedélyezése esetében. A címfordítás mindkét stádiumában létező opciók számtalan különböző memória szervezési mód támogatására alkalmazhatók. 3.6.3.4.1. A sík modell futtat, szükséges lehet a processzor szegmentküzem ódot kapcsoló bitje, de ugyanaz a hatás érhető el a verem-, kód- és
tományok ugyanazon lineáris címtartományrAnyi lineáris címtartományt takarnak le.
címt ományra leképezhetők. Ha egyszerre, egynél több program fut, a
mechanizmus segítségével minden egyes programnak önálló omány biztosítható.
160
A védett üzemmód felépítése, működése
3.6.3.4.2 Több lapot átfogó szegmensek A processzor architektúrája megengedi olyan szegmensek használatát, amelyek hossza meghaladja egy lap méretét. Például egy kiterjedt adatsruktúra lapok ezreit foghatja át. Ha a lapozás nem lenne engedélyezett, az adatstruktúra bármely részéhez való hozzáférés megkövetelné a teljes adatstruktúra jelenlétét a fizikai memóriában. Lapozás esetén csak a hozzáfért részt tartalmazólapnak kell a memóriában lennie. 3.6.3.4.3. Több szegmenst átfogó lapok A szegmensek ugyanakor lehetnek a lapoknál rövidebbek is. Ha egy ilyen szegmens egy, más szegmensekkel nem megosztott lapon kap helyet, a fennmaradó tárterület "parlagon marad". Például egy kis méretű adatstruktúra, mint amilyen egy 1 Byte-os szemafor, elfoglal 4 kByte-nyi helyet, ha egy lapra egyedül kerül elhelyezésre. Ha több szemafort használunk, sokkal gazdaságosabb ugyanarra az egy lapra pakolni őket. 3.6.3.4.4. Nem illeszkedő lap- és szegmenshatárok Az architektúra nem tesz kötelezővé a lapok és a szegmensek határa közt semmilyen megfeleltetést. Egy lap tartalmazhatja egyik szegmens végét, illetve egy másik szegmens elejét. Hasonlóan, egy szegmens tartalmazhatja egy lap végét, illetve egy másik lap elejét.
.6.3.4.5 3 . Illeszkedő lap- és szegmenshatárok A memória szervező software egyszerűbb és hatékonyabb lehet, ha bizonyos mértékben megköveteli a lapok illetve a szegmenshatárok közti illeszkedést. Például, ha egyetlen lapra elférő szegmens két lapra kerül elhelyezésre, kétszer több lapozási műveletre lehet szükség a
egmens eléréséhez. sz
161
Általános CPU programozási információk
Szelektor Ofszet
LOGIKAI CÍM15 0 31 0
Deszkriptor táblázat
Szegmensdeszkriptor
ORTartalomjegyzék Táblázat Ofszet
4k-s Lapkeret
Tartalomjegyzék Ofszet
Lineáris cím
Lineáris cím (4k-s lapoknál)
Operandus
Laptáblázat
Laptáblázatbejegyzés
Lapcímtár
4k-s tartalomjegyzékbejegyzés
4M-s tartalomjegyzékbejegyzés
4M-s Lapkeret
OperandusCR3
(4M-s lapoknál)
lapcím fordítás
3.37. ábra: Kombinált szegmens- és
162
A védett üzemmód felépítése, működése
3.6.3.4.6. Egy laptáblázat elhelyezése szegmensenként A lapozás és szegmentálás együttes használatának egyik lehetséges megközelítése - amely leegyszerűsíti a memória szervező software-t - az, hogy minden egyes szegmensnek saját laptáblázata legyen
iztosítva, ahogyan azt a 3.38. ábra mutatja. Ez a megoldás a egme
bsz nsnek egyetlen lapcímtár bejegyzést biztosít, amely a szegmens lapozásához szolgáltatja a hozzáférést ellenőrző információkat.
Lokálisdeszkriptor
táblázat LaptáblázatokLapkeretek
Lapcímtár
Lapcímtár
Laptáblázatbejegyzés
Laptáblázatbejegyzés
bejegyzésDeszkriptor
Deszkriptor
Laptáblázatbejegyzés
Laptáblázat
bejegyzés
Lapcímtárbejegyzés
bejegyzésLaptáblázat
Laptáblázatbejegyzés
3.38. ábra: minden egyes szegmensnek biztosítani kell saját laptáblázatot
163
Általános CPU programozási információk
3.7. Védelemi mechanizmusok A védelem egy megbízható multitaszking számára elengedhetetlen. A védelem célja az, hogy a taszkok egymásba történő beavatkozását kiküszöbölje. Például, a védelem megakadályozhatja az egyik taszkot abban, hogy egy másik taszk utasításait vagy adatait felülírja. Programírás közben a védelmi mechanizmus egy tisztább képet
megjelenését.
védelmi mechanizmus megóvhat a felderítetlen program hibák által okozott hiba lehetőségétől (a rejtevédeni lik a diagnosztizálás és
egkísérelhető az automatikus helyreállítás.
meghatározó bit, amellyel a védelmi mechanizmust ki lehetne apcsolni, ugyanaz a hatás érhető el azzal, hogy minden egyes szegmens
, illetve azok adataira gyakorolt eavatkozásának mennyiségét korlátozni lehessen. A védelem egy értékes
adhat a program összeakadásairól. Ha egy program váratlan hivatkozást tesz egy nem megfelelő tárterületre, a védelmi mechanizmus meggátolhatja az eseményt, illetve visszajelezheti annak
A végfelhasználói rendszerekben a
tt hibák sosem maradnak rejtve). Az operációs rendszert meg lehet a sérülésektől, ezáltal lehetővé vá
m A védelem lapokra és szegmensekre alkalmazható. A processzor egyik regiszterében található két bit meghatározza az aktuálisan futó program privilegizálási szintjét (más néven aktuális privilégium szint, vagy CPL). A CPL ellenőrzése a szegmentálási és lapozási címfordítás ideje alatt történik. Annak ellenére, hogy nem létezik egy vezérlőregiszter vagy egy üzemmód kszelektorhoz, szegmens deszkriptorhoz, illetve laptáblázat bejegyzéshez nullás privilégium szintet (a legmagasabb privilegizáltsági szintet) rendelünk 3.7.1. Szegmens szintű védelem A védelem biztosítja annak lehetőséget, hogy egy helytelenül működő program más programokrab
164
Védelmi mechanizmusok
segítőeszköze a software írásnak, mivel megengedi különböző software akereső, stb.) számára, hogy sértetlenül
egmaradjanak a memóriában. Mikor egy felhasználói program elakad, a
a helyreállító eljárások elindítására.
en egyes memóriahivatkozás esetén ellenőrződik, hogy a védelmi feltételeknek. Minden ellenőrzés a memóriaciklus
be; bármely szabálytalanság meggátolja a ciklus s kivételt eredményez. Minthogy az ellenőrzések a
ímfordítással párhuzamosan történnek, nincs teljesítménykiesés. Öt édelm
artományt érintő megszorítások 4. Az procedúrák bemenőpontjait érintő megszorítások 5. Az utasításkészletet érintő megszorítások
A védelem megszegése kivételt eredményez. A kivétel mechanizmus magyarázatát lásd a fejezet későbbi részében Ezen rész azokat a védelem megszegéseket írja le, amelyek kivételekhez vezetnek. 3.7.2. A szegmens deszkriptorok és a védelem A 3.39. ábra a szegmens deszkriptor azon mezőit mutatja be, melyeket a védelmi mechanizmus használ. A "Típus" mező különböző
bitjei az általuk ellátott funkciókkal vannak elnevezve.
étrehoz egy deszkriptort, beállítja nnak védelmi paramétereit is. Általános esetben a felhasználói
éterekkel törődniük.
szegme szor betölti mind a szegmens báziscímét,
eszközök (operációs rendszer, hibmrendszer képes diagnózis üzeneteket megjelenteni, illetve a hida esetleges helyreállítására. A gyártási fázisban a védelem megbízhatóbbá teszi a software-eket azzal, hogy lehetőséget biztosít az operációs rendszer számára Mindeleget tesz-ekezdete előtt indul elkezdését écv i ellenőrzés típus létezik:
1. Típus ellenőrzés 2. Határ (limit) ellenőrzés 3. A megcímezhető t
a
Amikor az operációs rendszer laprogramok íróinak nem szükséges a védelmi param Amikor egy program betölt egy szegmensregiszterbe egy
ns szelektort, a proces
165
Általános CPU programozási információk
mind a védelmi információkat. Minden szegmensregiszter láthatalan részében hely van biztosítva a báziscím, limit, típus és privilégium szint tárolására. Amíg ez az információ a szegmensregiszterben rezidens, az ugyanarra a szegmensre irányuló, egymást követő védelmi ellenőrzések teljesítmény kimaradás nélkül végezhetők. 3.7.2.1. Típusellenőrzés A felhasználói kód- és adatszegmensek deszkriptorain kívül, a processzornak rendszerszegmens- és kapudeszkriptorai is vannak. Ezek olyan adatstruktúrák, amelyek taszkok, illetve kivételek és megszakítások szervezésére használatosak. A 3.40. ábra felsorolja a rendszer szegmensek és kapuk minden definiált típusát. Megjegyzendő, hogy nem minden deszkriptor határoz meg egy szegmenst; a kapudeszkriptorok a procedúrák bemenőpontjaira mutató pointereket tartalmaznak.
Típus Meghatározás Decimális Bináris
0 0000 Fenntartva 1 0001 Hozzáférhető 16 bites TSS 2 0010 LDT 3 0011 Foglalt 16 bites TSS 4 0100 16 bites Call kapu 5 0101 Taszk kapu 6 0110 16 bites megszakítás kapu 7 0111 16 bites csapda kapu 8 1000 Fenntartva 9 1001 Hozzáférhető 32 bites TSS 10 1010 Fenntartva 11 1011 Foglalt 32 bites TSS 12 1100 32 bites Call kapu 13 1101 Fenntartva 14 1110 32 bites megszakítás kapu 15 1111 32 bites csapda kapu
3.40. ábra: Rendszer szegmens- és kapu típusok
166
Védelmi mechanizmusok
Az adat- és kódszegmens deszkriptorok típus mezői olyan biteket tartalmaznak, amelyek meghatározzák a továbbiakban a szegmens célját (lásd 3.39. ábra) • Az Írható (Writable) bit egy adatszegmens deszkriptorban
meghatározza, hogy a programok írhatnak-e a szegmensbe. • Az Olvasható (Readable) bit egy kódszegmens deszkriptorban
iszterekbe) olvasva a deszkriptor egy szelektorát.
A típusellenőrzés felhasználható olyan programozási hibák felderítésére, amelyek megkísérelnék a szegmenseket a programíró számára nemkívánatos módon alkalmazni. A processzor két alkalommal ellenőrzi a típusinformációt: 1. Mikor egy deszkriptor szelektora betöltődik egy
szegmensregiszterbe. Bizonyos szegmensregiszterek csak meghatározott deszkriptorokat tartalmazhatnak; például:
• A CS regisztert csak végrehajtható szegmens szelektorával
szabad feltölteni. • A végrehajtható de nem olvasható szegmensek szelektorai
nem tölthetők be az adatszegmens regiszterekbe. • Csak írható adatszegmensek szelektorai tölthetők az SS
regiszterbe.
meghatározza, hogy a programok olvashatnak-e egy szegmensből (például a kódtartományban tárolt konstansokat). Egy olvasható kódszegmens kétféleképpen olvasható:
1. A CS regiszter segítségével, a CS fölülíró prefixet
használva 2. Az adatszegmens regiszterbe (DS, ES, FS, vagy GS
reg
167
Általános CPU programozási információk
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Báziscím 31-24 Báziscím 23-16
Báziscím 15-0 Szegmens határ 15-0
G BAVL
Szegmenshatár
19-161 1DPL +4
+0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Báziscím 31-24 Báziscím 23-16
Báziscím 15-0 Szegmens határ 15-0
G DAVL
Szegmenshatár
19-161 1DPL +4
+0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Báziscím 31-24 Báziscím 23-16
Báziscím 15-0
Típus
Szegmens határ 15-0
GSzegmens
határ19-16
1 0DPL +4
+0
0
0 1 C R A
0 E W A0
A - HozzáférhetőB - NagyC - IlleszkedőD - AlapbeállításDPL - Deszkriptor privilégium szintE - lefelé növekvőG - SzemcsézettségR - OlvashatóW - Írható
3.39. ábra: Védett módban használt deszkriptor mezők
168
Védelmi mechanizmusok
2. Mikor az utasítások olyan szegmensekhez férnek hozzá, amelyek
deszkriptorai már be vannak töltve a szegmensregiszterekbe. Egyes szegmenseket az utasítások csak bizonyos előre
atnak; például:
• Egyetlen utasítás sem írhat egy végrehajtható szegmensbe.
m olvashat egy végrehajtható
asható (Readable) bit nincs beállítva.
.7.2.2. Határ (limit) ellenőrzés
Egy szegmens deszkriptor limit mezője meggátolja a programokat bban, hogy a szegmensen kívülre címezhessenek. A határ gyakorlati
it állapotától. Adatszegmensek esetén a s. Az E bit a Típus mező egyik
ens deszkriptorra vonatkozik.
zegmens Byte-okban
meghatározott módon használh
• Egyetlen utasítás sem írhat egy adatszegmensbe ha az
Írható (Writable) bit nincs beállítva.
• Egyetlen utasítás seszegmensből, ha az Olv
3 aértéke függ a G (Granularity) bhatár függ az E (Expansion) bit értékétől ibitjének megnevezése, ha adatszegm Ha a G bit törölve van, a határ a deszkriptor 20 bites Limit mezőjének értéke. Ebben az esetben a határ a 0-tól F_FFFFH értékig terjed (220 - 1 vagy 1 MByte). Ha a G bit értéke 1, a processzor beszorozza a limit mező értékét egy 212 skálatényezővel. Ebben az esetben a határ a 0FFFH-tól (212- 1 vagy 4 kByte) egészen FFFF_FFFFH-ig (232-1 vagy 4 GByte) terjed. Jegyezzük meg, hogy a skálatényező használatakor a cím alsó tizenkét bitje nem kerül limit ellenőrzés alá; ha a G bit 1-re van állítva és a szegmenshatár értéke 0, a szegmensen belüli érvényes ofszetek 0-tól 4095-ig terjednek. Minden szegmenstípus esetén, kivéve a lefele bővülő szegmenseket, a limit értéke egyel kevesebb mint a s
169
Általános CPU programozási információk
kifejezett hossza. A processzor általános védelmi hibát idéz elő a következő esetek bármelyikében:
• Egy olyan memóriabeli Byte elérésére tett kísérlet, amelynek a címe > limit
• Egy olyan memóriabeli szó elérésére tett kísérlet, amelynek a címe > (limit-1)
• Egy olyan memóriabeli duplaszó elérésére tett kísérlet, amelynek a címe > (limit-3)
• Egy olyan memóriabeli négyes szó elérésére tett kísérlet, amelynek a címe > (limit-7)
A lefele bővülő adatszegmensek esetében a határnak ugyanaz a funkciója van, csak másképpen van értelmezve. Ebben az esetben az érvényes ofszetek tartománya a (limit+1)-től a 232-1 -ig terjed, ha B=1, illetve 216-1-ig, ha B=0. Egy lefele bővülő szegmensnek akkor van maximális hossza, ha a szegmenshatár értéke 0. A limit ellenőrzés olyan programhibákat "fedez fel", mint milyenek a "kiszaladó" indexek, illetve az érvénytelen mutató
számítások. ktálódnak, záltal a kiváltó ok megtalálása egyszerűbb. Limit ellenőrzés nélkül ezek
tani, és jelezni forrásukat.
amely nem használatos. Annak ellenére, hogy ezt a
aEzek a hibák a megjelenésük pillanatában dete
ea hibák felülírhatnának kritikus tárterületeket egy másik modul belsejében, és az említett hibák létezése mindaddig nem lenne kimutatható, amíg a sérült modul össze nem esne, ez egy olyan esemény lévén, amely jóval a tulajdonképpeni hiba után következne be. A védelem képes ezeket a hibákat elhárí A szegmenshatár ellenőrzés mellett létezik még a deszkriptortáblázatok limit ellenőrzése is. A GDTR, LDTR, és az IDTR regiszterek tartalmaznak egy-egy 16 bites limit értéket. Ezeket a processzor arra használja, hogy meggátolja a programokat abban, hogy egy deszkriptortáblázaton kívül eső szegmens deszkriptort szelektáljanak. A deszkriptortáblázat határértéke a táblázat utolsó érvényes Byte-ját határozza meg. Minthogy minden deszkriptor 8 Byte-nyi hosszú, egy N deszkriptort tartalmazó táblázat határértéke 8N-1 kéne legyen. Egy szelektornak az értéke lehet 0 is. Ez a deszkriptor a GDT legelső elemére vonatkozik,
170
Védelmi mechanizmusok
deszkriptort be lehet tölteni egy szegmensregiszterbe, bármely olyan
ok alacsonyabb rivilégiumszintet jelentenek. Ha minden egyéb védelmi ellenőrzés ki van
gyanaz hatás érhető el minden privilegizálási szintnek 0-s értéket rendelve. (A
bit; a végrehelérhet ód nem engedélyezett, a processzor valós
zemmódban dolgozik, amelyben egy gyors, kiterjesztett 8086-os
megbízhatóságának javítására lehet felhasználni. Az operációs
ndszernek a legmagasabb privilegizáltságot (számozás szerinti
program al megsérüljön. Ha egy program sszeomlik, az operációs rendszernek megadatik ezáltal a lehetőség arra,
y dkísérelsoftwaprogram ra. Abban az esetben, ha egy kezelőprogram (device
river) fagyna le, az operációs rendszer képes kell, hogy legyen egy
Egy kezelőprogram
próbálkozás, amely ezzel a deszkriptorral hivatkozna a memóriára, általános védelmi hibát váltana ki. 3.7.3. Privilégium szintek A védelmi mechanizmus négy privilégium szintet ismer, számozásuk 0-tól 3-ig történik. A nagyobb számpelégítve, egy általános védelmi hiba generálódik, valahányszor egy program megkísérel egy szegmenshez hozzáférni a szegmenshez rendelt privilégium-szintnél kevésbé privilegizált szinten (nagyobb privilégium számmal). Annak ellenére, hogy nem létezik a védelmi mechanizmus kikapcsolását szolgáló vezérlőregiszter vagy üzemmód-váltó bit, uaCR0 regiszter PE bitje nem csak a védelmi mechanizmust engedélyező
védett üzemmód engedélyezésére használt, vagyis a program-ajtás egy olyan módjának, amelyben a teljes 32 bites architektúra ő. Ha a védett üzemm
üprocesszornak tűnik.)
A privilégium-szinteket az operációs rendszerek
relegkisebb privilegizálási szintet) biztosítva megvédhető attól, hogy más
okban előforduló gubancok áltöhog iagnózis-üzenetet generálhasson, illetve helyreállító eljárásokat
jen meg. Egy újabb privilegizálási szint állapítható meg a rendszer-re egyéb részei, mint például a periféria-eszközöket kezelő
ok számáddiagnózis-üzenetet küldeni, tehát van értelme az operációs rendszert megvédeni a kezelőprogramok gubancaitól.
171
Általános CPU programozási információk
ugyanakkor fontos perifériát kezelhet, mint például egy lemezegységet. Ha a felhasználói program akad el, a kezelőprogramnak nem szabad a lemez könyvtárstruktúráját módosítania. A kezelőprogram számára célszerű egy köztes privilegizálási szintet biztosítani az operációs rendszer és a felhasználói programok között. A felhasználói programok a legalacsonyabb privilegizálási szintet (számozás szerinti legnagyobb szintet) kapják. A 3.41. ábra bemutatja, hogy miként értelmezhetők ezek a privi-legizálási szintek mint védelmi gyűrűk. A középpont jelképezi a legkritikusabb software-t, általában egy operációs rendszer magját (kernel) tartalmazó szegmenseket. A külső gyűrűk a kevésbé kritikus software-eket jelképezik.
A következő adatstruktúrák tartalmaznak privilegizálási szinteket:
A CS szegmens-regiszter legalsó két bitje tartalmazza az aktuális priv
r a vezérlés átadódik egy eltérő privilegizálási szinttel rendelkező kód
ilegizálási szint.
A szegmens-szelektorok tartalmaznak egy "szükséges privilegizálási élja, hogy a szelektort
létrehozó procedúra privilegizálási szintjét jelképezze. Ha az RPL kev
• ilégium-szintet (CPL). Ez az aktuálisan futó program
privilegizálási szintje. Az SS regiszter legalsó két bitje is tárolja a CPL egy másolatát. Normális esetben a CPL értéke megegyezik annak a kódszegmensnek a privilegizálási szintjével, amelyből az utasítás-elérés történik. A CPL értéke megváltozik, valahányszo
szegmensnek. • A szegmens-deszkriptorok tartalmaznak egy "deszkriptor-
privilegizálási szint"-nek nevezett mezőt (DPL). A DPL a szegmenshez rendelt priv
•
szint"-nek nevezett mezőt (RPL). Az RPL c
ésbé privilegizáltabb a CPL-nél, akkor fölülírja a CPL-t. Amikor egy privilegizáltabb program egy kevésbé privilegizált programtól kap egy szegmens-szelektort, az RPL teszi azt, hogy a memória-hozzáférés a kevésbé privilegizált szinten menjen végbe.
172
Védelmi mechanizmusok
A privilegizálási szintek akkor kerülnek ellenőrzés alá, amikor egy deszkriptor szelektora betöltődik egy szegmens-regiszterbe. Az adathozzáférés esetén alkalmazott ellenőrzések eltérnek a végrehajtható szegmensek közötti vezérlésátadáskor alkalmazott ellenőrzésektől; ebből kifolyólag az elkövetkező alfejezetekben a két hozzáférés-típus külön-külön kerül bemutatásra. Operációs rendszer KERNEL
0. szint
Op. rendszer kezelõprogramokEszközmeghajtók, stb.
Alkalmazások
1. szint
2. szint
3. szint
3.41. ábra: Védelmi gyűrűk
egy aregisztellenőrszelektmutatjaellenőr
3.7.4. Az adathozzáférések korlátozása
Ahhoz, hogy a memóriában levő operandusokat megcímezzük, datszegmens szelektorát be kell tölteni egy adatszegmens-erbe. (a DS, ES, FS, GS, vagy SS regiszterekbe). A proceszszor zi a szegmens privilegizálási szintjeit. Az ellenőrzés a szegmens-or betöltésének pillanatában történik. Amint azt a 3.42. ábra , három különböző privilegizálási szint kerül ilyen típusú zés alá.
173
Általános CPU programozási információk
A háro
. A program CPL-je (aktuális privilegizálási szintje). Ezt a CS regiszter két legalsó helyértékű bitje tárolja
s des rának L-je
r-privilegizálási szintje).
ens m ére nált ilegizá tje). az ensregiszter (az SS, DS, ES,
t az op dus
m ellenőrzött privilegizálási szint a következő:
1.
2. Az operandust tartalmazó szegmen(deszkripto
zkripto DP
3. Az operandust tartalmazó szegm
szelektor RPL-je (szükséges privoperandus elérésére felhasznált szegm
egjelöléslási szin
haszEzt
FS, vagy GS regiszterek) két legalsó bitjea veremszegmensben van, az RPL megegyezik a CPL értékével.
árolja. Ha eran
174
Védelmi mechanizmusok
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 3 268 7 5 4 1 0
DPL +4
+0
Operandus szegmens deszkriptor
szter
Operandus szegmens szelektor
Aktuális kódszegmens regi
CPL - Aktuális privilégium szintPL - Deszkriptor privilégium szint
Privilégiumellenőrzés
CPL
RPL
DRPL - Igényelt privilégium szint
3.42. ábra: Privilégium ellenőrzés adathozzáféréseknél
Az utasítások csak abban az esetben tölthetnek fel egy szegm nsregisztert, ha a szegmens DPL-je kisebb vagy egyenlő privi izálási szintű (nagyobb privilégium szám) mint a CPL és a
eleg
ány a CPL változásával ódosul. Ha a CPL=0, bármely privilegizálási szintű adatszegmens
ő; ha a CPL=1, csak az 1-től 3-ig terjedő privilégiumszintű
szelektor RPL-je közül a legkevésbé privilegizáltnál.
Egy taszk által megcímezhető tartom mhozzáférhet
175
Általános CPU programozási információk
adatszegmensek érhetők el; ha a CPL=3, csak a 3-as privilegizálási szintű datszegmensek érhetők el.
nsekbeli adatok elérése
Szü abban tben, ROM típusú tárban vannak megadva.
nsokat; nem r, ha
kódszegme adatok elérésére a következő módszerek
Egy ő (non ens
Egy ő (con rehajtható szegmens szelektorával.
3. Egy fix alkalmazása egy olyan k
szel iszterbe van töltve.
Az első esetre az adatszegmens hozzáférésre vonatkozó, ásodik eset mindig érvényes, mivel
gy olyan kódszegmens privilegizálási szintje, amelynek Conforming
.7.5. Vezérlésátadások korlátozása
aAzok a rendszerek, amelyek a lehetséges négy privilegizálási szint közül csak kettőt használnak, a 0-s és a 3-as szinteket kell alkalmazzák. 3.7.4.1. Kódszegme kséges lehet a kódszegmensben adatokat tárolni, példáulaz ese ha a kód és az adatok is A kódszegmensek szabályszerűen tárolhatnak konstalehetséges kódszegmensként definiált szegmensbe írni, csak akkougyanarra a címtartományra egy adatszegmenst is leképezünk. A
nsekbeli lehetségesek:
1. adatszegmens-regiszter feltöltése egy nemilleszkedconforming), olvasható, végrehajtható szegm
szelektorával. 2. adatszegmens-regiszter feltöltése egy illeszked
forming), olvasható, vég
kódszegmens-fölülíró preolvasható, végrehajtható szegmens írása céljából, amelyne
ektora már a CS reg ugyanazon szabályok érvényesek. A me(illeszkedő) bitje 1-re van állítva, a DPL értékétől függetlenül, gyakorlatilag megegyezik a CPL értékével. A harmadik eset mindig érvényes, minthogy a CS regiszter által kijelölt kódszegmens DPL-je maga a CPL. 3
176
Védelmi mechanizmusok
A vezérlésátadásokat a JMP, CALL, RET, INT, és IRET
Ez a rész csak a JMP, CALL és RET utasításokkal glalkozik.
utasítások "near" formái a program
limit-e téve. A processzor ellenőrzi, hogy a JMP,
aktuáli atárát. Ez a limit a CS regiszterbe van "cache-lve", így a "near" típusú vezérlésátadások esetén a védelmi ellenőrzések em ro
szelektálja.
utasítások, valamint a kivétel- és megszakítás-mechanizmusok biztosítják. A kivételek és a megszakítások speciális esetek, amelyeket egy későbbi fejezet tárgyal.fo
A JMP, CALL és RETvezérlését az aktuális kódszegmensen belül adják át, ezért ezek csak a
llenőrzésnek vannak kiCALL illetve RET utasítások rendeltetési helyei nem haladják-e meg az
s kódszegmens hen ntják a teljesítményt. A JMP és CALL utasítások "far" változatainak operandusai más szegmensekre vonatkoznak, ezért a processzor privilégium-ellenőrzést végez. A JMP és CALL utasítások kétféleképpen vonatkozhatnak egy másik szegmensre: 1. Az operandus egy másik végrehajtható szegmens deszkriptorát
2. Az operandus egy call-kapu deszkriptorát szelektálja. Amint azt a 3.43. ábra mutatja, az olyan vezérlésátadások esetén, amelyek nem használnak call-kaput, két különböző privilegizálási szint lesz alávetve a privilégium-ellenőrzésnek: 1. A CPL (aktuális privilegizálási szint). 2. A cél kódszegmens deszkriptorának DPL-je.
177
Általános CPU programozási információk
Cél kód-szegmens deszkriptor
31 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 030 29
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
DPL +4
+0
Típus
1 C R A1
Aktuális kódszegmens regiszter
Operandus szegmens szelektor
CPL - Ak lis privilégium sziDPL - De riptor privilégium C - Illeszkedés bit
RPL
tuá ntszk szint
CPL
Privilégiumell senőrzé
3.43. áb Privilégiu lküli vezé dásoknál Normális esetben nnak a szeg ek a DPL értékével, amelyet a processzor éppen végrehajt. Ennek ellenére a CPL lehet a DPL értékénél nagyobb (kevésbé privilegizált), ha az aktuális kódszegm s egy szegmens nt azt a szegmen szkriptorának utatja). Egy illeszkedő (conforming) szegmens a hívó procedúra privilegizálási szintjén szalad. A proces érték ltérhet az aktuális kódszegmens deszkriptorában tárolt DPL értékétől.
m ellen kapu néra: őrzés taszk rlésáta
aa CPL megegyezik mensn
en illeszkedő (conforming) (amisde típusmezője m
szor a CS regiszterben tárolja a CPL egy másolatát; ez az e
178
Védelmi mechanizmusok
A processzor csak abban az esetben engedélyezi a JMP és CALL utasításokkal egy másik szegmensbe történő direkt hívást, ha a következő két privilégium szabály közül valamelyik teljesítve van:
• A szegmens DPL-je egyenlő a CPL-el. • A szegmens egy illeszkedő (conforming) kódszegmens, és a DPL-
je kisebb (privilegizáltabb) a CPL-nél. Az illeszkedő szegmensek olyan programok esetén használatos, mint például a matematikai könyvtárak, illetve néhány kivétel kiszolgáló procedúra esetén, amelyek támogatják ugyan az alkalmazásokat, de nincs szükségük hozzáférni védett rendszer-szolgáltatásokhoz. Amikor a vezérlés egy "conforming" típusú szegmensnek kerül átadásra, a CPL értéke nem változik meg, még akkor sem, ha a szegmens megcímzésére
asznált szelektornak eltérő az RPL-je. Ez az egyedüli olyan feltétel, amely esetében a CPL különbözhet az aktuális kódszegmens DPL értékétől. A kódszegmensek legtöbbje nem illeszkedő (nonconforming). Ezen szegmensek esetén a kapu nélküli vezérlésátadás csak ugyanazzal a privilegizálási szinttel rendelkező kódszegmensek között lehetséges. Ugyanakkor néha szükséges a vezérlés átadása magasabb privilegizálási szintekre. Ez a CALL utasítás segítségével megy végbe, call-kapudeszkriptorok alkalmazásával, amelyek a későbbiek folyamán lesznek elmagyarázva. A JMP utasítás soha nem adhatja át a vezérlést egy olyan nem illeszkedő (nonconforming) szegmensnek, amelynek DPL értéke nem egyenlő a CPL értékével. 3.7.6. Kapudeszkriptorok A különböző privilegizálási szinten levő végrehajtható szegmensek közötti vezérlésátadás védelmének biztosítása érdekében a processzor kapudeszkriptorokat használ. Négy fajta kapudeszkriptor létezik:
h
179
Általános CPU programozási információk
- call-kapuk - trapkapuk
megsz
egyik formája. ltérő privilegizálási szintek közötti vezérlésátadásra vannak alkalmazva.
en gynél több privilegizálási szint kerül alkalmazásra. A 3.44. ábra egy call-
pu fo
- akításkapuk - taszkkapuk A call-kapuk a védett üzemmódbeli vezérlésátadás ECsak azokban a rendszerekben szükséges a használatuk, amelyekbeka rmátumát illusztrálja. 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 030 29
DPL +4110 0 0 0 00DWORDszámlálófszet a szegmensben 31-16 P
+0Ofszet a szegmensben 15-0Szegmens szelektor
O
.
gy call-kapudeszkriptor a GDT-ben vagy az LDT-ben foglalhat helyet, de a megszakításdeszkriptor-táblázatban (IDT-ben) nem.
3.44. ábra: Call kapu Egy call-kapunak két fő funkciója van: 1. Megjelölni egy procedúra bemenőpontját. 2 Meghatározni a procedúrába való belépéshez szükséges
privilegizálási szintet. A CALL és JMP utasítások ugyanolyan módon használják a call-kapudeszkriptorokat, mint a kódszegmens deszkriptorokat. Amikor a hardware felismeri, hogy a cél szegmens-szelektora egy kapudeszkriptorra utal, az utasítás által végrehajtott művelet a call-kapu tartalma által lesz meghatározva. E
180
Védelmi mechanizmusok
Egy kapu szelektor és ofszet mezői egy procedúra bemenőpontjára
utató
y még rosszabb esetben egy tasítás közepébe ). A vezérlésátadást végrehajtó utasítás argumentuma em a
m pointert képeznek. A call-kapu garantálja azt, hogy minden egyes más szegmensnek történő vezérlésátadás egy érvényes bemenőpontra történik, és nem a procedúra közepébe (vagun szegmens-szelektor illetve procedúra bemenőpontját mutató szegmensen belüli ofszet. Ehelyett, a szegmens-szelektor egy kapudeszkriptorra mutat, és az ofszet használaton kívül marad. A 3.45. ábra bemutatja a címzésnek ezen formáját.
031015Szelektor A szegmensen belüli ofszet
Nem használt
Cél cím
Deszkriptor táblázat
OfszetSzelektor
DPL Száml.Ofszet
Kapu deszkriptor
BázisBázis
DPL Bázis Kód szegmensdeszkriptor
EljárásBelépési pont
3.45. ábra: A call kapu mechanizmusa
181
Általános CPU programozási információk
Amint azt a 3.46. ábra mutatja, egy call-kapun keresztül történő
lási szint) . A call-kapu megjelölésére használt szegmens-szelektor RPL
(szükséges privilegizálási szint) értéke. deszkriptor privilegizálási szint) értéke.
. A cél kódszegmensdeszkriptorának DPL értéke.
gmensen belül ámos olyan eljárás lehet, amelyek különböző privilegizálási szintről rténő
izálási szintre lehet felhasználni (bár az ugyanarra a szintre
rténő vezérlésátadásokkor nem szükségesek). Kizárólag a CALL
t lkalmazni, vagy egy ugyanakkora, illetve nagyobb privilegizáltsággal ndelkező illeszkedő (conforming) kódszegmensnek történő
vezérlésátadás érvényességének ellenőrzésére négy különböző privilegizálási szint van felhasználva. Egy call-kapun keresztül történő vezérlésátadás alkalmával ellenőrzött privilegizálási szintek a következők: 1. A CPL (az aktuális privilegizá2
3. A kapudeszkriptor DPL (4 A kapudeszkriptor DPL mezője határozza meg, hogy milyen privilegizálási szintekről használható a kapu. Egy kódszesztö felhasználásra vannak rendeltetve. Például, egy operációs rendszernek lehet néhány olyan szolgáltatása, amelyeknek az a rendeltetése, hogy úgy az operációs rendszer, mint a felhasználói program által alkalmazva legyenek, mint például a karakter ki- és bevitelt kezelő rutinok, miközben más szolgáltatások csak az operációs rendszer általi használatra vannak tervezve, mint például a kezelőprogramokat inicializáló rutinok. A kapukat magasabb, vagy ugyanazon privilegtörténő vezérlésátadásra töutasítások képesek a kapukat magasabb privilegizálási szintre való vezérlésátadásra felhasználni. A JMP utasítás csak egy ugyanolyan privilegizáltság kódszegmensnek való vezérlésátadásra képes a kapuarevezérlésátadásra.
182
Védelmi mechanizmusok
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
DPL +4
+0
Cél kód-szegmens deszkriptor
Operandus szegmens szelektor
CPL - Aktuális privilégium szintDPL - Deszkriptor privilégium szintRPL - Igényelt privilégium szint
Aktuális kódszegmens regiszter
RPL
CPL
Privilégiumellenőrzés
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 13 12 11 10 9 68 7 5 4 3 2 1 014
DPL
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
+4
+0
Call kapu
3.46. ábra: Privilégium ellenörzés call kapuval történő vezérlésátadásnál
183
Általános CPU programozási információk
Egy nem illeszkedő szegmensre ugró JMP utasítás esetén az itt
övetkező mindkét privilégium-szabály be kell legyen tartva; különben
MAX(CPL,RPL) <= a kapu DPL-je
. Megváltoztatja a CPL-t.
rmálisan lytatódik tovább. Mikor a processzor visszatér (return), az elmentett giszterek tartalma visszaállítják az eredeti vermet.
káltalános védelmi hiba kivétel generálódik. - -A cél kódszegmensének DPL-je = CPL Egy CALL utasítás (vagy egy illeszkedő szegmensre ugró JMP utasítás) esetén az itt következő mindkét privilégium-szabály be kell legyen tartva, különben általános védelmi hiba kivétel generálódik. - MAX(CPL,RPL) <= a kapu DPL-je -A cél kódszegmensének DPL-je <= CPL 3.7.6.1. Veremváltás Egy privilegizáltabb szintre történő procedúra-hívás a következőket végzi el: 12. Átadja a vezérlést (a végrehajtást) 3. Taszkkapcsolást végez Mindegyik belső védelmi gyűrűnek (a 0-s 1-es és 2-s privilegizálási szintek) megvan a saját veremtára, a kevésbé privilegizált szintekről történő kérések fogadására. Ha a veremterületet a hívó biztosítaná, és a verem túl kicsi lenne, a meghívott procedúra elakadhatna, a nem elégséges veremterület miatt. Ehelyett a processzor megakadályozza a kevésbé privilegizált programokat abban, hogy privilegizáltabb programokat megsérthessenek, mégpedig egy új verem létrehozásával a privilegizáltabb szintre való kérés pillanatában. Az új verem létrejön, a régi stack-ből átmásolásra kerülnek a paraméterek, a regiszterek tartalma elmentődik, és az utasítás-végrehajtás nofore
184
Védelmi mechanizmusok
A processzor a taszk-állapot-szegmens (TSS) segítségével találja meg a vermek létrehozásának szükséges helyet, amint azt a 3.47. ábra
utatja
kezdeti rtékéből (egy szegmensen belüli kezdeti ofszetből) áll össze. A kezdeti eremmutatók szigorúan csak olvasható típusú értékek lehetnek. A
a taszk futása közben. Ezeket a eremmutatókat kizárólag azzal a céllal használja, hogy egy magasabb
lkalommal, amikor a procedúra újra meghívásra kerül, a ezdeti veremmutató segítségével új verem lesz létrehozva.
m . Minden taszknak megvan a saját TSS-e. A TSS a belső védelmi gyűrűk kezdeti veremmutatóit tartalmazza. Az operációs rendszer a felelős azért, hogy minden egyes TSS-t létrehozzon és inicializálja azok veremmutatóit. (Ha az operációs rendszer nem használ TSS-eket a multitaszking megvalósításához, még akkor is le kell foglalnia legalább egy TSS-t az említett, veremmel összefüggő cél érdekében). Egy kezdeti veremmutató egy szegmens-szelektorból és az ESP regiszter egyévprocesszor nem módosítja őket vprivilegizálási szintre történő hívás esetén új veremtárakat hozzon létre. Ezek a vermek a meghívott procedúra visszatérése pillanatában eltűnnek. A következő ak
SS0
SS1
SS2ESP2
1
32 bites Taszk állapot szegmens
0
812162024
3.47. ábra: Kezdeti stack pointerek egy TSS-ben
ESP0
ESP
031100
4
185
Általános CPU programozási információk
Valah privilégium gváltoztatása egy call-ka törté T c lt ve ül létrehozásra. zor a cél kód PL értékét (a )
l a gy a 0 s vag pri sz eti veremmutatóját kiválassza.
Az ú gmens DPL- kell legyen az új CPL a SS-hiba generálódik. Az operációs
n a lá letv rem . a
e t ú l h ll
n l y a E er á té t,
c z é s
n e .
éter lódnak az új A meghívott procedúrán elül a pa int
elyeke zámláló ount) mezője jelzi a proceszszornak, hogy hány duplaszót (maximum
ébe. Ha
A különböző privilegizálási szintek közötti procedúrahíváskor a
ányszor a -szint mepuval nik, a SS-ből egy ím betö ésével új rem ker
A process szegmens D z új CPL-thasználja fe rra, ho -s, 1-e y 2-es vilegizálási int kezd
j veremsze je egyenlő
értékével; hrendszer feladata, hogy m
ez nem így van, egy Tinde lkalmazott
-s sdprivilegizá si szintnek
A létrehozza aszegmensdeszkriptoruk típusm
v ileremét, e a ve zegmen eszkriptorátfeltüntetet
vermekzőjében eg
módone eírható/olvash
tartalmazzanak, a Limat usó típ ak kell
it mezőkyenek. Elegendő
elően, hoglyet k
ek megfee
magukbefoglalhassák
illetve a mea s z SS é SP regiszt
edúrának sk tartalm t, a viszsza
amétereket rési cím
ghívott pro ükséges par s ideigleneváltozókat. Amihívásokat ill
p zedig a ugyanazonúra paraméterei a verem
a leg privi izálási szibe kerülnek
te nőn törtéeti, a procedek átmáso
lhelyezésreA paramb
verembe. raméterek ugyanazon relatív címeket használva érhetők el, mt a veremváltás nélkül kéne alkalmazni. Egy call-kapu sam
(c31-et) másoljon át a hívó vereméből a meghívott procedúra verema számláló értéke 0, egy paraméter sem lesz átmásolva. Ha 31-nél több duplaszót kell a meghívott procedúrának átadni, a paraméterek egyike egy adatstruktúra mutatója lehet, vagy az SS és ESP regiszterek elmentett értékeit a régi veremterületről való paraméter-hozzáféréshez lehet felhasználni. processzor a következő veremmel kapcsolatos műveleteket végzi: 1. Ellenőrzi, hogy a meghívott procedúra veremének mérete elég
nagy legyen ahhoz, hogy befogadja a paramétereket és a
186
Védelmi mechanizmusok
regiszterek elmentett tartalmát; ha ez nincs teljesítve, veremkivételt generál.
2. Az SS és ESP regiszterek régi tartalmát két duplaszóként lenyomja
a meghívott procedúra veremébe (a 16 bites SS regiszter 0-s bitekkel van 32 bitre kiegészítve, a legfelső, 0-s kitöltésű kiegészítő szó az Intel által lefoglalt; használata nem ajánlott).
3. A paramétereket a hívó procedúra vereméből a meghívott
procedúra veremébe másolja át. 4. A CALL utasítást követő utasításra mutató pointert (A CS és EIP
regiszterek régi értékeit) lenyomja az új verembe. A hívás után az SS és ESP regiszterek a veremben erre a viszszatérési pointerre mutatnak.
A 3.48. ábrán látható a veremkeret egy sikeres szintek közti procedúrahívás és visszatérés előtt, közben és után.
Parm1Parm2Parm3 ESP
ESP
Parm1Parm2Parm3
Régi SSRégi ESP
Régi CSRégi EIP
Régi stackÚj stack Régi stack
hívás előtthívás után,visszatérés előtt
RET FAR N-el valóvisszatérés után (N=3)
ESP
3.48. ábra: Stack keret szintek közötti hívás alatt A TSS-ben a 3-as privilegizálási szintnek nincs veremmutatója, ugyanis egy 3-as privilegizálási szintű procedúrát nem hívhat meg egy kevésbé privilegizált procedúra sem. A 3-as privilegizálási szint verme az
187
Általános CPU programozási információk
SS és EIP regiszterek tartalma által van eltárolva, aeghívott privilegizálási szint veremében vannak elm
melyek a 3-as szintről entve.
térési címet emeli le (pop). ormális körülmények között, a visszatérési mutató érvényes, mivelhogy
egy CALL vagy INT utasítás hozta létre. Mégis a processzor elvégzi a priv lehetőség, hogy az aktuális pro hatta a mutató értékét, vagy nem sikerült me A viszszatérési utasítás által a veremről
emelt kódszegmens-szelektor RPL értéke meg kell egyezzen a hívó
tabb szintek ányába. Ha a RET utasítás talál egy olyan elmentett CS értéket,
lynCPL, pilyen tí 1.
m Egy call-kapus hívás nem ellenőrzi az új verembe másolt szavak értékeit. A meghívott procedúrának kell ellenőriznie minden paraméter helyességét.. Egy későbbi részben található magyarázat arra, hogy miként lehet az ARPL, VERR, VERW, LSL, és LAR utasítások segítségével a mutatók értékeit ellenőrizni. 3.7.6.2. Visszatérés egy procedúrából A RET utasítás "near" formái csak az aktuális kódszegmensen belül végeznek vezérlésátadást, ezért csak a limit-ellenőrzésnek vannak alávetve. A CALL utasítást követő parancs ofszetje a veremből lesz leemelve és az EIP-be töltve. A processzor ellenőrzi, hogy ez az ofszet nem haladja-e meg az aktuális kódszegmens határát. A RET utasítás "far" formája egy korábbi "far" típusú CALL utasítás által a veremre lenyomott visszaN
ilégium-ellenőrzést, mivel fennáll az a cedúra megváltoztatgtartania helyesen a vermet.
leprocedúra privilegizálási szintjével. Egy másik szegmensbe való visszatérés megváltoztathatja a privilegizálási szintet, de csakis a kevésbé privilegizálirame ek az RPL-je számszerint nagyobb (kevésbé privilegizált) mint a
rivilegizálási szintek közötti visszatérés (return) megy végbe. Egy pusú visszatérés a következő lépéseket teszi meg:
A 3.49. ábrán bemutatott ellenőrzéseket végzi el, és a CS, EIP, SS és ESP regisztereket feltölti a verembe elmentett előző értékeikkel.
188
Védelmi mechanizmusok
2. Az SS és ESP regiszterek régi tartalmát (az aktuális verem tetején)
. A DS, ES, GS szegmensek tartalmát ellenőrzi. Ha ezen regiszter
privilegizáltabb szegmensekhez férjen hozzá.
A kivétel típusa
Hibakód
a RET utasítás által meghatározott számú Byte-tal kiigazítja. A keletkező ESP értéket nem veti alá veremszegmens határ ellenőrzésnek. Az a tény, hogy az ESP értéke a határon kívülre esik, nem vevődik észre mindaddig, amíg a következő verem-műveletre sor nem kerül. ( A visszatérő procedúra SS és az ESP regisztereinek tartalma nincs eltárolva; normális esetben ezek értékei megegyeznek a TSS által tartalmazott értékekkel.)
3közül bármelyik egy olyan szegmensre vonatkoznak, amelynek DPL-je kisebb mint az új CPL (kivéve az illeszkedő szegmenseket), a szegmensregiszterbe a nullás szelektor töltődik be (Index=0, TI=0). A RET utasítás egymagában ilyen esetben nem jelez kivételeket; ugyanakkor bármely következő memóriahivatkozás, amely nullás szelektort tartalmazó szegmensregisztert alkalmaz, általános védelmi hiba kivételt eredményez. Ez meggátolja a kevésbé privilegizált kódot abban, hogy egy privilegizáltabb procedúra által a szegmensregiszterben hagyott szelektorok segítségével
Az ellenőrzés típusa
A verem teteje + 7 a veremszegmens határán belül kell legyen
Stack 0
A visszatérő kódszegmens RPL-je nagyobb kell legyen mint a CPL
Védelmi CS
A visszatérő kódszegmens szelektora nem lehet nullás szelektor
Védelmi CS a A visszdeszkroptor-táblázat határán belül kell lennie
atérő kód szegmensdeszkriptorának a Védelmi CS
189
Általános CPU programozási információk
A visszatérést végző szegmensdeszkriptor kódszegm
Védelmi CS ensre kell vonatkozzon
A visszaté k memóriában (present)
Szegmens nincs jelen
CS rő ódszegmens jelen kell legyen a
A sszatérő, nem illeszkedő (nonconfokell legyen a v
elektorának RPL értékével, illetve a
kódszelegyen
elektorának RPL értékével.
Védelmi CS virming) kódszegmens DPL-je egyenlő
isszatérő kód szegmens-szvisszatérő, illeszkedő (conforming)
gmens DPL-je kisebb vagy egyenlő kell a visszatérő kód szegmens-
sz
ESP + N + 15 * a veremszegmens határán belül kell legye
Stack hiba 0 n
Az ESP +szelektor nem
N + 12 * helyen található szegmens- lehet nullás szelektor
Védelmi SS
Az ESP + +szegmensdeszhatárán belül k
N 12 * helyen található kriptornak a deszkriptor-táblázat ell lennie
Védelmi SS
A veremsz gm tor írható/olvasható kell legyen
Védelmi SS e ensdeszkrip
A veremszegmmemóriában (p
ens jelen kell legyen a resent)
Stack hiba SS
A régi veremsgyen a régi k
zegmens DPL-je egyenlő kell ódszegmens RPL értékével
Védelmi SS le A régi veremszegmens-szelektor RPL-je egyenlő kell legyen a régi veremszegmens DPL értékével
Védelmi SS
190
Védelmi mechanizmusok
* N a RET utasítást követő közvetlen operandus
3.49. ábra: Szintek közötti visszatérés ellenőrzés 3.7.7. Az operációs rendszer számára lefoglalt utasítások Azokat az utasításokat, amelyek a védelmi mechanizmust érinthetik, vagy amelyek befolyásolhatják a rendszer általános teljesítményét, csak megbízható procedúrák használhatják. A proceszszornak két ilyen utasításcsoportja van: 1. Privilegizált utasítások - amelyek a rendszer vezérlésére
használatosak 2. Érzékeny (sensitive) utasítások - amelyek az I/O, illetve az I/O-
függő műveletekre használatosak 3.7.7.1. Privilegizált utasítások Azok az utasítások, amelyek a védett szolgáltatásokat érinthetik, csak akkor hajthatók végre, ha a CPL értéke 0 (legprivilegizáltabb). Ha ezen utasítások közül bármelyik 0-tól eltérő CPL mellett hajtódik végre, általános védelmi hiba kivétel generálódik. Ezen utasítások közé tartoznak a következők: CLTS Clear Task-Switched Flag - taszkváltásjelző bit törlése HLT Halt Processor - leállás INVD Invalidate Cache - belső cache érvénytelenítése
VLPG Invalidate TLB Entry - TLB bejegyzés érvénytelenítése GDT Load GDT Register - a globális deszkriptortáblázat-regiszter
betIDT
INL
öltése L Load IDT Register - a megszakítás
deszkriptortáblázatregiszter betöltése LLDT Load LDT Register - a lokális deszkriptortáblázat-regiszter
betöltése LMSW Load Machine Status Word - a gépi állapotszó betöltése LTR Load Task Register - taszkregiszter betöltése
191
Általános CPU programozási információk
MOV to/from CRn - Move to Control Register n - adatmozgatás a CRn vezérlőregiszterbe
MOV to/from DRn - Move to Debug Register n - adatmozgatás a DRn nyomkövetőregiszterbe
WBINVD Write Back and Invalidate Cache - Cache-be való visszaírás és érvénytelenítés
.7.7.2. Érzékeny utasítások
éges, ogy védve legyenek, ugyanakkor az is szükséges, hogy az olyan
procedúrák is használják őket, amelyek a 0-tól eltérő privilegizálási szinten futnak. Az I/O műveletek védelmi mechanizmusát a második kötet részletezi.
ző pésekből áll:
végzi az tasítás végrehajtása pillanatában, az első ellenőrzés elvégzéséhez a
LAR (Load Access Rights) - hozzáférési jogot tartalmazó Byte betöltése
3 Az I/O műveletekkel foglalkozó utasítások számára szüksh
3.7.8. Mutatók érvényességét ellenőrző utasítások A mutatók érvényességét ellenőrző utasítások. a privilegizálási szintek közötti szigeteltség fenntartására szükséges. A követkelé 1. Annak ellenőrzése, hogy a mutatót szolgáltatónak van-e joga a
szegmenshez hozzáférni. 2. Annak ellenőrzése, hogy a szegmens típusa kompatibilis-e a
felhasználási céljával. 3. Annak ellenőrzése, hogy a mutató ofszetje nem haladja-e meg a
szegmenshatárt. Bár a processzor a 2. és 3. ellenőrzést automatikusan elusoftware segítsége szükséges. E cél érdekében adott az ARPL utasítás. A software is alkalmazhatja inkább a 2. és 3. lépést, ahelyett, hogy egy kivétel megjelenésére várakozna. Ezen célt szolgálják a LAR, LSL, VERR, és VERW utasítások.
192
Védelmi mechanizmusok
A LAR utasítás annak ellenőrzésére használatos, hogy a mutató kompatibilis privilegizálási szintű és típusú szegmensre vonatkozik-e. A LAR utasításnak egyetlen operandusa van: azon deszkriptor szegmens-szelektora, amelynek a hozzáférési jogát vizsgálja. Az illeszkedő (conforming) kódszegmensek bármely privilegizálási szintről hozzáférhetők. Bármely más szegmensdeszkriptor olvasható kell legyen a CPL-nél, illetve a szelektor RPL értékénél számszerint nagyobb (kevésbé privilegizált) privilégiumszinten. Ha a deszkriptor olvasható, a LAR
tasítás kiválasztja a deszkriptor második dupla-szavát, lemaszkolja ezt az rtéket 00FxFF00H-val, eltárolja az eredményt a meghatározott 32 bites
llítja a ZF bitet. (Az x azt mutatja, hogy a rolt érték megfelelő négy bitje határozatlan.) A betöltés után a
nt a DPL értéke, vagy ha a szegmensszelektor átlépné a eszkriptortáblázat határát, a visszaadott érték 0 lesz és a ZF bit törlődik.
l a eszkriptorokkal lehetséges, amelyek szegmenseket írnak le (adat, kód,
zegmensek (veremszegmensek), más típusú egmensektől eltérő módon kezelik a határt. Úgy a LAR, mint a LSL
uécélregiszterbe, és magasra átáhozzáférési jogok azonnal tesztelhetők. Bármely érvényes deszkriptortípust lehet a LAR utasítással tesztelni. Ha az RPL vagy CPL nagyobb mid LSL (Load Segment Limit) a szegmenshatár betöltése Az LSL utasítás lehetővé teszi a software számára, hogy egy szegmensdeszkriptor határát tesztelje. Ha egy (memóriában vagy egy regiszterben levő) szegmens-szelektor által meghatározott deszkriptor a CPL mellett olvasható, az LSL utasítás feltölti a megadott 32 bites regisztert egy 32 bites, Byte-felbontású határral, amelyet az összeillesztett limit mezők és a deszkriptor G bitje alapján számít ki. Ez csak azokkadtaszk-állapot, és lokális deszkriptortáblázat); a kapudeszkriptorok nem érhetők el. (A 3.50. ábra részletesen felsorolja, hogy melyek az érvényes típusok, és melyek nem.) A limit értelmezése a szegmens típusától függ. Például, a lefele bővülő adatsszutasítások esetén a ZF bit akkor van magasra állítva, ha a betöltés sikeres, ellenkező esetben a ZF bit törlődik.
Típus kód Deszkriptor típus Érvényes? 0 fenntartva nem 1 fenntartva nem
193
Általános CPU programozási információk
2 LDT igen 3 fenntartva nem 4 fenntartva nem 5 Taszk kapu nem 6 fenntartva nem 7 fenntartva nem 8 fenntartva nem 9 Lehetséges 32 bites TSS igen A fenntartva nem B Foglalt 32 bites TSS igen C 32 bites call kapu nem D fenntartva nem E 32 bites megszakítás kapu nem F 32 bites trap kapu nem
3.50. ábra: Érvényes deszzkriptor típusok LSL műveletekhez
Egy újabb ellenőrzés, az illeszkedés-ellenőrzés (alignment check) alkalmazható a CPL=3 esetén. Amikor úgy a CR0-beli AM bit, mint az AC flag is 1-re van állítva, a nem illesztett (unaligned)
emóriahivatkozások kivételeket generálnak. Ez azon programok számára hasznos, amelyek a mutatók alsó két bitjét használják az általuk megcímzett adatstruktúra típusának azonosítására. Például, egy matematikai könyvtár szubrutinja elfogadhat numerikus adatstruktúrákra mutató pointereket. Ha e struktúra típusához az 10 (bináris) kódot társítjuk az erre a típusra mutató pointer legalsó két bitjén, a matematikai szubrutinok kijavíthatják a típuskódot -10 (bináris) eltolás hozzáadásával. Abban az esetben, ha a szubrutin helytelen mutatótípust kapna, egy illesztetlen (unaligned) hivatkozás jönne létre, amely kivételt generálna. Az illeszkedés-ellenőrzés felgyorsítja a szimbolikus feldolgozású (azaz a mesterséges intelligencia) nyelvekben megírt programok feldolgozását, mint amilyen a Lisp, Prolog, Smalltalk és a C++. A pointer-végek típus-ellenőrzésének felgyorsítására lehet használni.
m
194
Védelmi mechanizmusok
3.7.8.1. Deszkriptor érvényességének ellenőrzése A processzor két olyan utasítással rendelkezik, a VERR és VERW utasításokkal, amelyek megállapítják, hogy a szegmens-szelektor a jelenlegi CPL mellett írható vagy olvasható szegmensre mutat. Egyikük sem okoz védelmi hibát, ha a szegmens nem hozzáférhető. VERR (Verify for Reading) a szegmens olvashatóságának ellenőrzése A VERR utasítás olvasásra ellenőrzi a szegmenst és ha a CPL mellett a szegmens olvasható, beállítja a ZF bitet. A VERR utasítás a következőket ellenőrzi: • Hogy a szegmens-szelektor a GDT vagy az LDT határain belüli
szegmensdeszkriptorra mutat-e. • Hogy a szegmens-szelektor egy kód- vagy adatszegmens deszkriptort
indexel. • Hogy a szegmens olvasható, és egy kompatibilis privilegizálási szintje
van-e.
Az adatszegmensek és a nem illeszkedő (nonconforming) ensek privil gálja, hogy a DPL
evésbé privilegizált sz
a eVERWazt vizsgálja, hogy az deszkriptor a határok között van-e, hogy szegme
rivileg CPL-hez, akár a szelektor RPL értékéhez
ódsz
kódszegm égium-ellenőrzése azt vizs
int legyen akár a CPL-hez, akár a szelektor RPL kértékéhez viszonyítva. Az illeszkedő (conforming) szegmensek nem kerülnek privilégiumszint-ellenőrzés alá. VERW (Verify for Writing) a szegmens írhatóságának ellenőrzése A VERW utasítás ugyanazokat a képességeket nyújtja a szegmens írásr llenőrzéséhez, mint a VERR utasítás Akárcsak a VERR utasítás, a
parancs is beállítja a ZF bitet, ha a szegmens írható. Az utasítás
nsdeszkriptor legyen, írható-e, illetve hogy a DPL-je kevésbé izált szint legyen akár ap
viszonyítva. Attól függetlenül, hogy illeszkedők (conforming) vagy sem, a k egmensek soha sem írhatók.
195
Általános CPU programozási információk
3.7.8. mutatóomlasz
Erre egy közönséges például az FREAD (fájl_azonosító, Byte-ok áma, puffer mutató) rendszerprocedúra. Ez a képzeletbeli procedúra egy
y pufferbe, fölülírva bármit, ami ár benne található. Az alkalmazások szintjén futó programok kéréseit
szolgálja ki, de privilegizált módon kell szaladjon annak érdekében, hogy lvashasson a rendszer I/O pufferéből. Ha a felhasználói program egy
hibás puffermutató egy olyat, amely rivilegizált címtartományban levő kritikus kódra vagy adatra mutatna - a rocedúra a rendszer összeomlásához vezető kárt okozhatna.
megenga privikell lepéldában az RPL annak a felhasználói programnak a CPL-je volna, melyik meghívta a rendszerszintű procedúrát. A processzor
toma
Annak érdekében, hogy ki legyen használva a processzor által elvégzett RPL-ellenőrzés előnye, a meghívott procedúrának csak azt kell ellenőriznie, hogy minden neki átadott szegmens-szelektornak az eredeti hívó CPL-jének megfelelő, vagy annál kevésbé privilegizált RPL értéke van. Ez garantálja azt, hogy a szegmens-szelektorok nem privilegizáltabbak a forrásaiknál. Ha a szelektor egy olyan szegmenshez való hozzáférésre van használva, amelyet a forrás nem lenne képes közvetlenül elérni, tehát az RPL a szegmens DPL értékénél kevésbé privilegizált, általános védelmi hiba kivétel keletkezik amikor a szelektor a szegmensregiszterbe kerül. ARPL (Adjust Requested Privilege Level) - a szelektor RPL mezőjének beállítása
2. Mutatók integritása és az RPL
A szükséges privilegizálási szint (RPL) megelőzheti az olyan k balesetszerű használatát, amelyek kevésbé privilegizált szintről tanák össze a privilegizáltabb kódot.
szlemezen levő fájlból adatokat olvas be egm
ot adna át ennek a procedúrának -
pp
Az RPL használata képes megelőzni ezt a problémát. Az RPL edi egy privilégium-fölülíró hozzárendelését egy szelektorhoz. Ez
légium-fölülíró annak a kódszegmensnek a privilegizálási szintje gyen, amely a szegmens-szelektort létrehozta. A fennemlített
aau tikusan ellenőriz minden szegmensregiszterbe betöltött szegmens-szelektort, hogy megállapítsa: az RPL je megengedi-e a hozzáférést.
196
Védelmi mechanizmusok
Az ARPL utasítás egy szegmens-szelektor RPL értékét beállítja az eredeti érték, és egy általános regiszterben tárolt szegmensszelektor RPL mezőjének értéke közül a nagyobbik (kevésbé privilegizált) értékre. Az RPL mező a szegmens-szelektor és a regiszter két legjelentéktelenebb bitje. Az utóbbi általában a hívó CS regiszterének verembeli másolata. Ha a beállítás megváltoztatja a szelektor RPL-jét, a ZF bit beállítódik (set); ellenkező esetben a ZF bit törlődik. 3.7.9. Lapszinti védelem A védelem úgy szegmensekre, mint lapokra is vonatkozik. Ha a memóriaszegmentálás sík modelljét használjuk, a lapszinti védelem meggátolja a programokat abban, hogy egymást zavarják. Minden egyes memóriahivatkozás megvizsgálás alá kerül annak érdekében, hogy meg lehessen állapítani: eleget tesz-e a védelmi feltételeknek. Minden ellenőrzés a memóriaciklus elindítása előtt kerül elvégzésre; bármely szabálysértés meggátolja a ciklus elkezdését és kivételt eredményez. Minthogy az ellenőrzések a címfordítással párhuzamosan történnek, nincs teljesítmény-kiesés. Két lapszintű védelmi ellenőrzés létezik: 1. A megcímezhető tartományt érintő megszorítások 2. Típusellenőrzés
A véde tt üzemmódú ivétel-mechanizmus magyarázatárol majd később lesz szó. Ez a rész zokat a védelem-megszegéseket írja le, amelyek kivételekhez vezetnek.
laphozzáférést kontrollálják. A védelmi ellenőrzések mind az első-, mind második szintű laptáblázatokra is hivatkoznak.
lem megsértése kivételt eredményez. A véde
ka 3.7.9.1. A laptáblázat bemenetek által tartalmazott védelmi paraméterek A 3.51. ábra a laptáblázat bemenet azon mezőit emeli ki, amelyek a
a
197
Általános CPU programozási információk
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 029
Phozzáf. 0 0 D A C WSD T W
Lapkeret cím 31-12P R
_P U
_
3.51. ábra:
i szintet ülönböztetünk meg, a 0-tól 3-ig. A lapok esetében két privilegizálási
özmeghajtó ogramok), illetve védett rendszeradatok (mint amilyenek
i számára.
, minden lap hozzáférhető. Ha a processzor felhasználói inten fut, csak a felhasználói szint lapjai érhetők el.
R/W - Írható/olvasható
U/S - User/supervisor
Egy laptáblázat bejegyzés védelmi mezői 3.7.9.1.1. A megcímezhető tartományt érintő megszorítások A privilégium lapok esetében a szegmensekhez képest eltérő módon értelmezett. A szegmensek esetében négy privilegizáláskszint létezik: 1. Felügyelő-szint (U/S=0) - az operációs rendszer, más
rendszersoftware-ek (mint például az eszkkezelőpra laptáblázatok) részére.
2. Felhasználói szint (U/S=1) - az alkalmazások kódja és adata
A szegmentálásra használt privilegizálási szintek a lapozásnál használt privilegizálási szintre vannak leképezve. Ha a CPL értéke 0, 1, vagy 2, a processzor felügyelő-szinten dolgozik. Ha a CPL=3, a processzor felhasználói szinten működik. Amikor a processzor felügyelő-szinten dolgoziksz
198
Védelmi mechanizmusok
3.7.9.1 A véde
. Csak-olvasási hozzáférésű (R/W=0)
WP bitolvashaprocesstartozómegjelszintű nem ol iba kivétel
enerálódik bármely védelmi szabály megsértésére tett kísérlet esetén.
processlegyenbitjéne a felhasználói
int lapjainak írásvédettsége iránti " fogékonyságát".
másolálehet, afel új taszkok létrehozására. Egy új taszk létrehozásakor lehetséges a
ülő szegmens címtartományának teljes lemásolása. Ez a származtatott
lapszeton-wriszegmemint acsak akbit alkalapra v
.2. Típusellenőrzés
lmi mechanizmus csak két típusú lapot ismer fel:
12. Írási/olvasási hozzáférésű (R/W=1).
Amikor a processzor felügyelőszinten szalad és a CR0-s regiszter je 0-s (a reset inicializálást követő állapota), minden lap írható és tó is egyben (az írás-védettség figyelmen kívül marad). Ha a zor felhasználói szinten fut, csak azok a felhasználói szinthez lapok írhatók, amelyek írási/olvasási hozzáférésre vannak ölve. Az írható/olvasható, illetve a csak-olvasható felhasználói lapok olvashatók. A felügyelő-szintű lapok sem nem írhatók, sem vashatók felhasználói szintről. Egy általános védelmi h
g
A 386-os processzorral ellentétben, a 486-os és Pentium zorok megengedik, hogy a felhasználói szintű lapok írásvédettek
ek a felügyelő módbeli hozzáférések ellen. A CR0 regiszter WP k magasra állítása engedélyezi a felügyelő-szintnek
sz
A felügyelő-ellenes írásvédelem lehetősége az ún. "írás közbeni s" (copy-on-write) stratégiájának implementálása esetén is hasznos melyet némely operációs rendszer, mint például a UNIX, használ
sztaszk számára egy komplett másolatát nyújtja a szülő szegmens- és
tjének. Egy alternatív stratégia, az "írás közbeni másolás" (copy-te) tárterületet és időt takarít meg azzal, hogy a gyermek taszk nseit és lapjait ugyanazokra a szegmensekre és lapokra képezi le,
melyeket a szülő taszk is használ. A lapnak egy egyedi másolata kor kerül megteremtésre, amikor a taszkok egyike a lapra ír. A WP lmazásával a felügyelőprogram detektálhatja a felhasználói-szintű
aló írási kísérletet, és ugyanakkor átmásolhatja is a lapot.
199
Általános CPU programozási információk
3.7.9.1.3. A védelem kombinálása a laptáblázatok mindkét szintjén Bármely lap esetén, a lapcímtárbeli bejegyzésének (első szintű laptáblázat) védelmi attribútumai különbözhetnek a második szintű laptáblázat bemeneteinek attribútumaitól. A processzor úgy ellenőrzi egy
p védelmét, hogy a lapcímtárban (első szintű laptáblázat), mint a ásodi
van.
SS és IDT).
lam k szintű laptáblázatban megadott védelmi információt is tanulmányozza. A 3.52. ábra bemutatja a védelmi attribútumok lehetséges kombinációiból adódó védelmet, akkor, ha a WP bit törölve 3.7.9.1.4. A lapvédelem fölülírói Némely hozzáférés úgy van leellenőrizve, mintha a 0-s privilegizálási szinten végbemenő hozzáférések volnának, a CPL bármely értéke esetén: • Hozzáférés a szegmensdeszkriptorokhoz (LDT, GDT, T • Hozzáférés a belső veremhez, egy CALL utasítás, vagy kivételek és
megszakítások közben, ha a privilegizálási szint megváltozik.
Lapcímtár bejegyzés Laptáblázat bejegyzés Kombinált effektus Privilé- gium
hozzáfér- hetőség
Privilé- gium
hozzáfér- hetőség
Privilé- gium
hozzáfér- hetőség
User Csak User Csak User Csakolvasható olvasható
olvasható
User olvasható
Írolvasható
User Csak tó
Csak User ható/ olvasha
User Csolvasható
User Csak olvasható
Írható/ olvasható
User ak
Userasható
Írolvasható
User Írható/ sható
Írható/ olv
User ható/ olva
User isor Csaolvasható
Supolvasható
Csak olvasható
Superv k ervisor Írható/
User Csak olvasha
Supervisor Írható/ Supervisor Írható/ olvasható tó olvasható
200
Védelmi mechanizmusok
Usertó
Csaolvasható
Supolvasható
Írható/ olvasha
Supervisor k ervisor Írható/
User Írhaolvasható
Supolvasható
Írható/ olvasható
Supervisor tó/ ervisor Írható/
Supervisor Csak User Csak olvasható
Supervisor Írható/ vasható olvasható ol
Supervisor Csak User Írható/ olvasható
Supvasható olvasható
ervisor Írható/ ol
Supervi User Csak olvasható
Supvasható
sor Írható/ olvasható
ervisor Írható/ ol
Supervisható
Írható/ olvasható
Supolvasható
sor Írható/ olva
User ervisor Írható/
Su vi r Csaolvasható
Supolvasható
per sor Csak olvasható
Superviso k ervisor Írható/
Su vi r Írhaolvasható
Sup
per sor Csak Supervisoolvasható
tó/ ervisor Írható/ olvasható
Supervisor Írható/ Supervisor Csak olvasható
Supervisor Írható/ vasható olvasható ol
Supervi rvisor Írható/ olvasható
Supolvasható
sor Írható/ olvasható
Supe ervisor Írható/
pcímtár és laptáblázat védelem
3 . ensvédele omb engedélyezett, a processzor először a szegmens-, m a i. Ha a proce r véd el akár a s szintjén, a művelet nem hajtódik végre, ehelyett egy kivétel keletkezik. Ha a szegmentálásnál kivétel generálódik, a művel hiba kivételt.
Például, adatszegmenst efiniálni, amelynek vannak egyes csak-olvasható, illetve más,
ázat) bejegyzéseinek U/S és R/W bitjei az írási ozzáférés letiltását határoznák meg, a lapcímtár-bemenet által kijelölt
3.52. ábra: Kombinált la
.7.9 2. Lap- és szegm
Ha a lapozás
m k inálása
ajd lapvédelmet értékeli kzegmensek, akár a lapok
et nem vált ki lap
sszo elemsértést fedez f
lehetőség van egy olyan kiterjedt
dírható/olvasható részei is. Ebben az esetben, a csak-olvasható részek lapcímtár- (vagy laptáblh
201
Általános CPU programozási információk
lapok számára (vagy a második szintű laptáblázatban megadott egyedi sználni például, egy olyan
amelynek bizonyos részei csak-lvasha tok, vagy ROM-ban tárolt konstansok setén). Ez, egy sík adattartományt, egyetlen, óriási szegmensként
ugyanavirtuáliterülete
lapok számára). Ezt a technikát fel lehetne hakiterjedt adatszegmens definiálására, o tó típusúak (közös adaedefiniál, amely sík tartomány hozzáféréséhez sík mutatók szükségesek,
kkor védelem alá helyezve a közös adatokat, a megosztott, s címterületre leképezett állományokat, illetve a felügyelőprogram it.
202
Védett üzemmódú multitaszking
3.8. tt üz A Pentium processzor bizt ltitaszking számára szükséges hardware támogatást. A taszk egy olyan program, amely éppen
r on m n végreh alatt. m k , vagy egy call utas eg. Két különböző típusú, taszkokra vonatkozó deszkriptor létezik, amelyek egy deszkriptor-táblázatban me k: taszk-állapot-szegmens deszkriptorok és a taszkkapuk. A s á deszkriptortípus bárm k-kapcs letkezik. A taszkkapcsolás t egy procedúrahívás,
zo ációt tárol el. A taszkkapcsolás átadja a vezérlést egy teljesen új környezetnek, egy taszk környezetének. Ehhez
ro em eré e, A és
procedúrákkal ellentétben a taszkok ató A taszkkapcsolás nem be. A processzor ll emóriában tárolt adatsruktúrába, az ún. taszk-llap ató gi
otát nnak érdekében, hogy a taszkot folytatni lehessen. A processzor
akítások és kivételek taszkkapcsolásokat okozhatnak (ha
Véde emmódú multitaszking
osítja a mu
fut, vagy amely arajtás
a vár, hogy fussEgy taszkot egy
ítás hív m
, miközben egyegszakítás, egy
ásik program vaivétel, egy ugrás
gjelenhetnemikor a vezérlé
olás ketadódik a két elyikének, tasz
olyan, mincsak több process r-állapotinform
szükség van a pideértve az EFL
cesszor majdnGS regisztert
összes regiszt a szegmensregisztereket is. A
nek elmentésér
nem újraindíthmit a verem
k (re-entrant). nyom le sem
áá
apotinformáció a mot-szegmensbe lesz elmentve. A multitaszkingot támog
szterek és adatstruktúrák a következők: re
• taszk-állapot-szegmens • taszk-állapot-szegmensdeszkriptor • taszkregiszter • taszkkapudeszkriptor
A felsorolt struktúrák segítségével, a processzor átadhatja a
ezérlést egyik taszktól a másiknak, elmentve az eredeti taszk állapvaezenkívül két további taszk-szervező lehetőséget is felkínál: 1. A megsz
ez szükséges a rendszerben). A processzor nemcsak a megszakítások és kivételek kezelésére képes taszkkapcsolást végrehajtani, hanem automatikusan vissza is tud kapcsolni, amikor a megszakítás vagy kivétel visszatér (return). Ez a mechanizmus képes a megszakítás-taszkok alatt megjelenő megszakítások kezelésére.
203
Általános CPU programozási információk
2. Minden egyes taszkkapcsoláskor, a processzor egy új LDT-re is
képes váltani. Ez arra használható, hogy minden taszknak egy különálló logikai cím - fizikai cím megfeleltetést lehessen biztosítani. Ez egy plusz védelmi lehetőség, ugyanis így a
eg lehet előzni azt, hogy egymással ősszeakadjanak. A PDBR regiszter is újratöltődik.
i a taszkok egymás közötti elszigetelésének biztosítására.
alkalmprogramkülönö lmentésére szükséges idő túl hosszú lehet. Az ilyen helyzetekben egy
adatstr meg. Ez hetővé teszi egy kisebb terjedelmű processzor állapotinformáció menté
bizonyos típusú szegmensbe vannak elmentve, melyet taszk-állapot-szegmensnek, vagy TSS-nek nevezünk. A 3.53.
ja be (a 16 ites, 80286-os processzor taszkjaival való kompatibilitást egy más típusú
ikus mezők, amelyeket a processzor minden taszkkapcsoláskor felfrissít. Ezek a mezők a következőket
• Az általános regisztereket (EAX, ECX, EDX, EBX, ESP, EBP, ESI, és EDI).
taszkokat el lehet egymástól szigetelni, és m
Ez a tény megengedi, hogy a lapozómechanizmust is fel lehessen használn
A multitaszking-mechanizmus használata opcionális. Egyes
azások esetén lehet, hogy nem a legjobb módja a végrehajtás megszervezésének. Ahol a megszakításokra
sen gyors válaszra van szükség, ott a processzor állapotánakelehetséges kompromisszum az, hogy használjuk a taszkokra vonatkozó
uktúrákat, de a taszkkapcsolást software úton valósítsuk leel sét. Ez a technika egyike lehet azon optimizálásoknak, amelyek a teljesítmény növelésére alkalmazhatók. 3.8.1. Taszk-állapot-szegmens Egy taszk visszaállításához szükséges processzor-állapotinformációk egyaábra a 32 bites CPU-kra írt taszkok TSS formátumát mutatbTSS biztosítja, de erről a második kötetben lesz részletesebben szó). Egy TSS mezői két fő kategóriába oszthatók: 1. Dinam
tárolják:
204
Védett üzemmódú multitaszking
• A szegmensregisztereket ( ES, CS, SS, DS, FS, és GS). • A flag regisztert ( EFLAGS)
• Az utasításmutatót (EIP) • Az előző taszk TSS-ének szelektorát (csak akkor frissíti
fel, amikor egy return várható). 2. Statikus mezők, amelyeket a processzor olvas, de nem módosít.
Ezek a mezők a taszk létrehozásakor lesznek beállítva. Ezen mezők a következőket tárolják:
• A taszk LDT-jének szelektorát. • A taszk PDBR-jét (CR3). • A 0-s, 1-es és 2-es privilegizálási szintek vermeinek
logikai címét. • A T bitet (debug trap bit), amely ha 1-re van állítva, arra
készteti a processzort, hogy valahányszor egy taszkkapcsolás jelenik meg, debug-kivételt hozzon létre. ( A hibakeresésről több információ található a második kötetben.)
• Az I/O engedélyező bittérkép és a megszakítás átírányitó
bit-térkép báziscímét. Ha jelen vannak, ezek a bittérképek a TSS magasabb címeire kerülnek eltárolásra. A báziscím az I/O térkép elejére, illetve a 32 Byte-os megszakítás térkép végére mutat. (A megszakítás-átirányításról további információk szintén a második kötetben találhatók).
205
Általános CPU programozási információk
0 0 00 0 0 0 0 0 0 0 0 0 T
0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A taszk LDT szelektora
FSGS
DSSSCSES
EDIESIEBP 60
646872768084889296
ESP
SS1
SS0ESP0 4
8121620
36
56
1000
azon rtaszkkarészébejelen le
I/O térkép bázis cím1531
EBXEDXECXEAX
EFLAGS40444852
EIPCR3 (PDBR)
SS2ESP2
242832
ESP1
LINK (régi TSS szelektor) 0
3.53. ábra: 32 bites taszk állapot szegmens
Ha a lapozás használt, fontos megelőzni a laphatároknak a TSS észébe történő elhelyezését, melyekből a processzor olvas a pcsolás idején (az első 104 Byte). Ha egy laphatár a TSS ezen kerül, a határ mindkét oldalán található lapoknak egyidőben kell nniük. Azonfelül, ha a lapozás engedélyezett, a kimenő taszk TSS-
206
Védett üzemmódú multitaszking
ének mtábláza illetve írható/olvashatónak kell
egjelölni. Visszaállíthatatlan hiba, ha azután érkezik be egy laphiba,
TSS ol 3.8.2.
egfelelő lapokat, az új taszk TSS-ét, és mindezek deszkriptor-t bemenetét jelenlévőnek,
mvagy egy általános védelmi hiba kivétel, miután a processzor megkezdte a
vasását.
A TSS deszkriptor Mint minden más szegmenst, a taszk-állapot-szegmenst is egy deszkriptor határoz meg. A 3.54. ábra bemutatja a TSS deszkriptor formátumát.
TSS Deszkriptor
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Báziscím 31-24 Báziscím 23-16
Báziscím 15-0 Szegmens határ 15-0
GAVL
Szegmenshatár
19-16DPL +4
+0
00 P 0 1 0 B 1
Típus
31
- A rendszer software számára elérhetőAVL- Foglaltság bit-
BPL
a 11-es (decimális) érték foglalt taszkot ent.
Deszkriptor privilégium szint- Szemcsézettség- A szegmens jelenlétét jelző bit
DGP
3.54. ábra: TSS Deszkriptor
A típusmező Foglalt (Busy) bitje jelzi, hogy a taszk foglalt-e. Egy foglalt taszk éppen fut, vagy arra vár, hogy futhasson. Ha a típusmező értéke 9, inaktív taszkot jelöl, jel A taszkok nem rekurzívak. A processzor arra használja a Foglalt bitet, hogy a megszakított taszkok hívására tett kísérleteket detektálja.
207
Általános CPU programozási információk
(Granu zegmens
eszkriptorokbeli szerepükkel azonos funkciójuk van. A Limit mezőnek
keveseáttérés,generászüksélimit ér
Egy TSS deszkriptorhoz hozzáférő procedúra kiválthat egy
mezőinek értéke 3-nál kisebbnek kell lennie, hogy csak a privilegizált softwa proceddeszkrimemórA TSS deszkriptornak egy szegmensregiszterbe való töltése kivételt
enerál. A TSS deszkriptorok csak a GDT-ben tartózkodhatnak. Egy TSS ozzáférésére tett olyan kísérlet, amely egy magasra állított TI bittel
rendelkező szelektort alkalmaz (ami az aktuális LDT-t jelöli), kivételt eredményez. 3.8.3. Taszkregiszter A taszkregiszter (TR) az aktuális TSS megtalálását szolgálja. A 3.55. ábra azt az utat mutatja, amit a processzor megtesz a TSS eléréséhez. A taszkregiszternek van egy látható része (tehát egy olyan része, amelyet a software olvasni és módosítani képes), és egy láthatatlan része (azaz egy olyan része, amelyet a processzor tárol, illetve amely a software számára elérhetetlen). A látható részben levő szelektor egy TSS deszkriptor GDT-beli indexe. A processzor a TR láthatatlan részét a TSS
A Bázis, Limit, és DPL mezőknek, illetve a Felbontás larity) és Jelenlevő (Present) biteknek az adats
d67H-nál nagyobb vagy egyenlő értéke kell legyen, ami egy Byte-tal
bb egy taszk-állapot minimális méreténél. Egy olyan taszkra való amelynek a TSS deszkriptor-limitje kevesebb mint 67H, kivételt l. Egy I/O engedélyező bittérkép használatakor nagyobb limitre van g. Az operációs rendszernek akkor is szüksége lehet egy nagyobb tékre, ha a TSS-ben a rendszer kiegészítő adatokat tárol.
taszkkapcsolást. A rendszerek többségében a TSS deszkriptorok DPL
re-ek végezhessenek taszkkapcsolást.
A TSS deszkriptorhoz való hozzáférés nem adja meg a úrának azt a képességet, hogy olvashassa vagy módosíthassa a ptort. Az olvasás vagy a módosítás csak az ugyanarra a iaterületre leképezett adat deszkriptor alkalmazásával lehetséges.
gh
208
Védett üzemmódú multitaszking
deszkriptorból származó báziscím és limit értékének tárolására használja. Ezeknek az értékeknek a megtartása a taszk végrehajtását sokkal hatékonyabbá teszi, mivel a processzornak nem kell ezeket az értékeket a memóriából elérnie, azért, hogy az aktuális taszk TSS-ét megcímezze. Az LTR és STR utasítások a taszkregiszter látható részének módosítására és olvasására használatosak. Mindkét utasításnak egyetlen operandusa van, egy memóriában elhelyezett 16 bites szegmens-szelektor, vagy egy általános regiszter. Az LTR (Load Task Register) utasítás feltölti a taszkregiszter látható részét az operandussal, amely a GDT-ben levő egyik TSS deszkriptorhoz kell index legyen. Az LTR utasítás ugyanakkor feltölti a láthatatlan részt is a TSS deszkriptorból vett információkkal. Az LTR utasítás egy privilegizált utasítás, csak akkor hajtható végre, ha CPL=0. Az LTR utasítást általában a rendszerinicializálás alkalmával használják arra, hogy egy kezdeti értéket tegyenek a taszkregiszterbe. Ezt követően, a TR regiszter tartalma a taszkkapcsolást előidéző események által módosul. Az STR (Store Task Register) utasítás egy általános regiszterbe, vagy a memóriába menti el a taszkregiszter látható részét. Az STR utasítás szintén privilegizált. A taszk kapudeszkriptor egy taszkhoz biztosít indirekt, védett referenciát. A 3.56. ábra egy taszkkapu formátumát illusztrálja. A taszkkapu szelektor mezője index egy TSS deszkriptorhoz.
használt.
A taszkkapu DPL-je szabályozza a taszkkapcsolás deszkriptorhoz aló hozzáférését. Egy procedúra nem szelektálhat egy taszkkapu
deszkriptort anélkül, hogy a szelektor RPL-je és a procedúra CPL-je numerikusan kisebbek, vagy egyenlők lennének a deszkriptor DPL értékével. Ez meggátolja a kevésbé privilegizált procedúrákat abban, hogy taszkkapcsolást idézzenek elő. Amikor egy taszkkapu kerül alkalmazásra, a cél TSS deszkriptor DPL értéke nem lesz felhasználva.
Ennek a szelektornak az RPL értéke nem v
209
Általános CPU programozási információk
Taszk állapot szegmens
TSS Deszkriptor
NGlobális deszkriptor táblázat
Szelektor Bázis cím Szegmens határLáthatatlan részLátható rész
TR
0
3.55. ábra: Taszk regiszter
Egy taszkkapuhoz hozzáférugyanúgy, taszkkapuk, melégítsenek ki:
Foglalt bit tárolva van a TSS deszkriptorban, minden taszknak csak egyetlen ilyen deszkriptora lehet. Ennek ellenére, létezdesz ri
2. A t
teljesítés a T
ő procedúra taszkkapcsolást válthat ki mint egy TSS deszkriptorhoz hozzáférő procedúra. Úgy a
int a TSS deszkriptorok célja az, hogy három követelményt
1. Egy taszknak csupán egyetlen Foglalt (Busy) bitje legyen. Minthogy a
het számtalan olyan taszkkapu, amely ugyanazt az egy TSS ptort szelektálja. k
aszkokhoz szelektív hozzáférést biztosítsanak. A taszkkapuk ik ezt az elvárást, ugyanis helyet foglalhatnak egy LDT-ben SS deszkriptor DPL értékétől eltérő DPL-jük lehet. Egy
210
Védett üzemmódú multitaszking
olyan szintje a GDT-beli TSS deszkriptor használatához (amelynek a DPL értéke általában 0), még mindég meghívhat egy másik
r leszűkítheti a taszkkapcsolást bizonyos taszkokra.
.8.4. Taszk kapudeszkriptorok
procedúra, amelynek nincs meg a kellő privilegizálási
taszkot, ha hozzáférhet annak LDT-jében levő taszkkapuhoz. A taszkkapuk segítségével az operációs rendsze
3
TSS Kapudeszkriptor
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
TSS szegmens szelektor +0
DPL +4P 0 0 1 0 1
Típus
Fenntartva Fenntartva
Fenntartva
- Deszkriptor privilégium szintens jelenlétét jelző bit
DPLP - A szegm
3 k kapudeszkriptor
3. y megszakítás vagy kivétel taszkkapcsolást eredményezzen. A
zkkapuk a amely lehetővé teszi a gszakítások és kivételek számdményezze tás vagy egy kivétel egy zkkapura m tat, a proceszszor átkapcsol a ett taszkra
.56. ábra: Tasz
Egtas z IDT-ben is lehetnek, me ára, hogy taszkkapcsolás
nek. Amikor egy megszakíeretas utató vektort szolgáljelz .
211
Általános CPU programozási információk
.57. ábra t, ahogyan mind az LDT-ben levő taszkkapu, mi IDT-ben helyet foglaló taszkkapu azonos ugyanazt a
A 3 bemutatja azt a módond pedig az
ítja taszkot.
Lokális deszkriptor táblázat Globális deszkriptor táblázat Taszk státusz szegmens
apu tor
négy eset bármelyikében:
Taszk k TSS deszkrip
Megszakítás deszkriptor táblázat
Taszk kapu
3.57. ábra: Taszkokra jellemző taszk kapuk 3.8.5. Taszkkapcsolás A processzor átadja a vezérlést egy másik taszknak a következő
212
Védett üzemmódú multitaszking
1. Az aktív taszk egy JMP vagy CALL utasítást hajt végre egy TSS
Egy megszakítás vagy egy kivétel akkor vált ki taszkkapcsolást,
egszakítás kiszolgáló rutin mindíg visszaadja a vezérlést a egszakított procedúrának, amely esetenként más taszkban is lehet. Ha az T bit törölve van, normális visszatérés következik. Ha az NT magasra
ó taszk a
ghat
deszkriptorra. 2. Az aktív taszk egy JMP vagy CALL utasítást hajt végre egy
taszkkapura 3. Egy megszakítás vagy egy kivétel az IDT-ben levő egyik
taszkkapura mutat. 4. Az aktív taszk egy IRET utasítást hajt végre, miközben az NT flag
magasra van állítva. A JMP, CALL és IRET utasítások, csakúgy mint a megszakítások és kivételek, a processzor közönséges mechanizmusai, melyeket olyan körülmények között is használni lehet, amelyekben nem jön létre taszkkapcsolás. A deszkriptor típusa (amikor a taszk call hívást kap), illetve az NT bit (ha a taszk visszatér) különböztetik meg a standard mechanizmust attól a formától, amely egy taszkkapcsolást okoz. A JMP vagy CALL utasítások, annak érdekében, hogy taszkkapcsolást hozzanak létre, átadhatják a vezérlést akár egy TSS deszkriptornak, akár egy taszkkapunak. Mindkét esetben az eredmény ugyanaz: a processzor átadja a vezérlést a megadott taszknak. ha az IDT-ben levő egyik taszkkapura mutat. Ha egy IDT-beli megszakítás vagy trap kapura indexel, taszkkapcsolás nem megy végbe. Egy mmNvan állítva, taszkkapcsolás jön létre. A taszkkapcsolást fogad
egszakításkezelő rutin TSS-ében levő TSS szelektor által van mme ározva.
gy taszkkapcsolás a következő lépések szerint történik: E
213
Általános CPU programozási információk
1. Ellenőrzi azt, hogy az aktív taszk átkapcsolhat-e az új taszkra. Az adat-hozzáférési privilégiumszabályok a JMP és CALL
nyes limitje van-e (nagyobb mint 67H). A hibák visszaállítják a processzor állapotában végzett bármely változtatást, ha kísérlet történik a hiba-generáló utasítás
-kiszolgáló rutin
regiszterek átmásolásra kerülnek az aktuális TSS-be (az EAX,
szegmensregiszterek ES, CS, SS, DS, FS valamint a GS. Az ebben a lépésben detektált bármely hiba, megjelenik a bejövő taszk
utasításokra vonatkoznak. A TSS deszkriptor és a taszkkapu DPL-je számszerint nagyobb (tehát alacsonyabb privilegizálási szinten) vagy egyenlő kell legyen a kapuszelektor CPL és RPL értékével. A megszakítások, kivételek és az IRET utasítás számára megengedett a taszkkapcsolás, függetlenül a cél taszkkapu, vagy a TSS deszkriptor DPL értékétől.
2. Ellenőrzi azt, hogy a bejövő taszk TSS deszkriptora jelenlevőként
van-e megjelölve, illetve érvé
végrehajtására. Ez a tény megengedi a kivételszámára, hogy a visszatérési cím a hiba-kiváltó utasításra mutasson, és nem az ezt követő utasításra. A kivétel-kiszolgáló rutin kijavíthatja azt az okot, amely a hibát előidézte, és újraindíthatja a taszkot. A kivétel-kiszolgáló rutin beavatkozása teljesen áttetsző lehet a felhasználói program számára.
3. Elmenti az aktuális taszk állapotát. A processzor megtalálja a
taszkregiszterben az aktuális TSS báziscímét. A processzor
ECX, EDX, EBX, ESP, ESI, EDI, ES, CS, SS, DS, FS, GS és EFLAGS regiszterek, valamint az utasításmutató).
4. A TR regisztert feltölti a bejövő taszk TSS deszkriptorára
vonatkozó szelektorral, beállítja a bejövő taszk Foglalt bitjét, illetve a CR0 regiszter TS bitjét. A szelektor vagy egy CALL, illetve JMP utasítás operandusa, vagy egy taszkkapuból származik.
5. Betölti az új taszk állapotát a megfelelő TSS-ből, és folytatja a
végrehajtást. A betöltött regiszterek a következők: az LDTR regiszter; a PBDR (CR3); az EFLAGS regiszter; az általános regiszterek EIP, EAX, ECX, EDX, EBX, ESP, ESI, EDI és a
214
Védett üzemmódú multitaszking
környezetében. Egy kivétel-kiszolgáló rutin számára úgy tűnik, mintha az új taszk első utasítása nem lett volna végrehajtva.
Fontos, hogy taszkkapcsolás esetén a kimenő taszk állapota
nkez tben következett volna. A regiszterek azokra z értékekre lesznek visszaállítva, amelyeket a megállásuk pillanatában rtalmaztak.
Minden taszkkapcsolás magasra állítja a CR0 regiszter TS (Task
A TS bit azt mutatja, hogy a lebegőpontos egység környezete
17. rutinok rekurzív
ívások alanyai lehetnek, ha megkísérelik a kivételt létrehozó szegmens-
első privilegizálási szintje között nincs összefüggés. Minthogy a taszkokat lszigetelik egymástól a független címtartományaik és taszkállapot-
elleA bpriv
épés Állapot ellenörzés Kivétel1 Hibakód
mi dig elmentődik. Ha a taszk folytatódik, a vezérlés azzal az utasítással
dődik, amely normális eseata Switched) bitjét. A TS bit a rendszersoftware számára hasznos az integer és a lebegőpontos egységek műveleteinek koordinálására. eltérhet az aktív taszk környezetétől.
A taszkkapcsolások által okozott kivételeket (a 3.58. ábra 5.-től -ig terjedő pontjaiból adódó kivételeket) kezelő
hszelektort újra betölteni. A kivétel okát (vagy a többszörös okok közül az
t) meg kell szüntetni, mielőtt a szelektor újratöltődne.
A kimenő taszk privilegizálási szintje és a bejövő taszk
eszegmenseik, és mivel a TSS-hez való hozzáférést privilégium szabályok
nőrzik, a taszkkapcsoláshoz nincs szükség a privilégium vizsgálatára. ejövő taszk a CS regiszter új tartalmának RPL értéke által mutatott ilegizálási szinten kezd végrehajtódni, amelyet a TSS-ből tölt be.
Lhivatkozás
1van a memóriában
NP Az új taszk TSS-e A TSS deszkriptor jelen
2 A TSS deszkriptor nem foglalt
TS, GP A taszk visszakap-csolt TSS-e
215
Általános CPU programozási információk
3 A TSS szegmens határ nagyobb vagy egyenlő mint 108
TS Az új taszk TSS-e
4 A regiszterek feltöltve a TSS értékeivel 5 Az új érvényes taszk LDT TS Az új taszk LDT-
szelektora2 je 6 A kódszegmens DPL értéke TS Új kódszegmens
megegyezik a szelektor RPL értékével
7 Az SS szelektor érvényes2 TS Új verem-szegmens
8 A veremszegmens jelen van a memóriában
SF Új verem-szegmens
9 A veremszegmens DPL értéke megegyezik a CPL értékkel
TS Új verem-szegmens
10 Az új taszk LDT-je jelen TS Avan a memóriában je
z új taszk LDT-
11 A CS szelektor érvényes2 TS Új kódszegmens 12 A kódszegmens jelen van a
memóriában NP Új kódszegmens
13 A veremszegmens DPL értéke megegyezik a szelektor RPL értékével
TS Új verem-szegmens
14 A DS, ES, FS és GS szelektorok érvényesek2
TS Új adatszegmens
15 A DS, ES, FS és GS szegmensek olvashatók
TS Új adatszegmens
16 A DS, ES, FS és GS NP Új adatszegmens szegmensek jelen vannak a memóriában
17 A DS, ES, FS és GS szegmensek DPL értéke nagyobb vagy egyenlő a CPL értékével
TS Új adatszegmens
3.58. ábra: Taszkváltás alatti ellenörzés
216
Védett üzemmódú multitaszking
Megjegyzések: A jövőbeli Intel processzorok az ellenőrzéseket eltérő sorrendben végezhetik. 1. NP= a szegmens nincs jelen kivétel,
= védelmi hiba kivéteS= le
SF= veremhiba k
. Egy szelektor akkor érvényes, ha egy kompatibilis típusú táblázatban van (például egy LDT szelektor nem lehet bármilyen más táblázatban a GDT-n kívül), a táblázat szegmenshatárán belüli cím el deszkriptorra utal (pél r k abban az esetben érvényes, ha egy utat, a deszkriptor típusa a típusme
3.8.6. Taszkok visszafelé kapcsolása (LINKING)
m hogy az előző utatja, hogy az
éppen végrehajtás alatt azva egy másik taszkba, és az aktív taszk TSS-ének ő taszk TSS szelektorát tárolja, ha létezik ilyen. (lásd a 3.59. ábrát).
GP általános lek, T "érvényte n TSS" kivétel,
ivétel.
2
et foglal dául a CS
, és egy kompatibilis típusúktor csaegiszterben levő szele
kódszegmens deszkriptorra mzőben van megadva).
A taszknak visszaszolgáltassa a vezérlést. Az NT flag m
TSS Link ezője és az NT jelzőbit célja, egm
álló taszk be van-e ág magasabb szinten lev
y Link mezője a
217
Általános CPU programozási információk
TSS TSS TSSLegfelső szintű taszk Beágyazott taszk Mélyebben beágyazott tasz
LINK LINK LINK
NT=0 NT=1 NT=1
k Jelenleg futó taszk
EFLAGS
NT=1
TR regiszter
3.59. ábra: Beágyazott taszkok Amikor egy megszakítás, kivétel, jmp vagy call taszkkapcsolást eredményez, a processzor bemásolja az aktuális taszk-állapot-szegmens
elektorát az új taszk TSS-ébe, és beállítja az NT bitet. Az NT flag azt jelzi, hogy a TSS Link mezőjébe egy elmentett TSS szelektor került
etöltésre. Az új taszk egy IRET utasítás végrehajtásával adja vissza a vezé alá
erül. Ha ez 1-re van állítva, a processzor taszkkapcsolást végez az előző
sz
brlést. Az IRET utasítás végrehajtásakor az NT bit ellenőrzés
ktaszkra. A 3.60. ábra összefoglalja azon TSS mezők szerepét, amelyeket a taszkkapcsolás érint.
Mező Az ugrás hatása A CALL utasítás vagy
megszakítás hatása
Az IRET utasítás hatása
Az új taszk Busy bitje
A bit beállítva (előtte töröltnek
kell lennie)
A bit beállítva (előtte töröltnek
kell lennie)
Nem változik, 1-nek kell lennie
A régi taszk Busy bitje
A bit törölt Nem változik A bit törölt
218
Védett üzemmódú multitaszking
Az új taszk NT flagje
Nem változik A flag beállítódik
Nem változik
A régi taszk NT Nem változik Nem változik A flag törölt flagje
Az új taszk Link mezője
Nem változik A szelektorral betöltve
Nem változik
A régi taszk Link mezője
Nem változik Nem változik Nem változik
3.60. ábra: A taszkváltások hatása a Busy, NT és LINK m
ezőkre
Megjegyzendő, hogy az NT flaget bármely privilegizálási szinten
z NT bitet és végrehajtson egy IRET utasítást, aminek az olna a következménye, hogy meghívásra kerülne az aktuális taszk TSS-
éne l megjelölt taszk. Annak érdekében, hogy a hamis taszkkapcsolások ne járjanak sikerrel, az operációs rendszernek inic en egyes általa létrehozott TSS Link mezőjét.
(foglalt) bit megelőzi a hurkok ialakulását
A TSS deszkriptorának B (foglalt) bitje megakadályozza az újraindított taszkkapcsolást. Csak egyetlen egy elmentett taszk-környezet létezik, a TSS-ben eltárolt környezet, ezért egy taszkot csak egyszer szabad meghívni mielőtt befejeződne. A felfüggesztett taszkok lánca bármilyen hosszúra megnőhet, a többszörös megszakításoknak, kivételeknek, ugrásoknak és hívásoknak köszönhetően. A B bit megakadályozza, hogy a taszkot meg lehessen hívni, ha ebben a láncban található. Egy újrahívott taszkkapcsolás felülírná a taszk régi TSS-ét, ami felbontaná a láncot. A processzor a következőképpen kezeli a Busy bitet: 1. Mikor átkapcsol egy taszkra, a processzor beállítja a bejövő taszk
B bitjét
futó software módosíthatja. Egy program számára adott az a lehetőség, hogy beállítsa av
k Link mezője álta
ializálnia kell mind 3.8.6.1. A Busy k
219
Általános CPU programozási információk
2. Mikor visszakapcsol egy taszkról, a processzor letörli a kimenő
taszk B bitjét, ha azt a taszkot nem kell a láncba helyezze (ha tehát a taszkkapcsolást előidéző utasítás egy JMP vagy CALL utasítás). Ha a taszk a láncba kerül, a B bitje továbbra is 1-re marad állítva.
3. Ha az új taszk Busy bitje már be van állítva, taszkkapcsolás esetén
a processzor egy általános védelmi hiba kivételt generál. Eképpen a processzor meggátolja, hogy egy taszk saját magára kapcsolhasson, vagy a lánc bármely más taszkjára, ezzel megakadályozva az újraindított (re-entrant) taszkkapcsolást. A B bitet multiprocesszoros konfigurációban is lehet használni, mivel a processzor buszlezárást (bus lock) indítványoz amikor beállítja, vagy törli a B bitet. Ez megakadályozza, hogy két processzor ugyanazt a taszkot hívhassa meg. 3.8.6.2. A taszk visszakapcsolások módosítása Annak érdekében, hogy a megszakított taszkokat, az őket megszakító taszkok előtt folytatni lehessen, szükségessé válhat a felfüggesztett taszkok láncának módosítása. Ennek egy megbízható módja a következő: 1. A megszakítások letiltása. 2. Elsőként, a megszakító taszk TSS-ének Link mezőjét kell
megváltoztatni, majd a láncból kiemelt taszk TSS deszkriptorának B bitjét kell törölni.
3. A megszakítások engedélyezése.
220
Védett üzemmódú multitaszking
3.8.7. Taszkok címtartománya Az LDT szelektor és a TSS PDBR (CR3) mezője felhasználható
aját laptáblázat gyűjteménye, a lineáris ímeknek fizikai címekre való leképezése végett.
z az LDT-je legyen.
3.8.7.1. Taszkok által lineárisról- fizikai címre végzett képzés
ical mapping) ét általános kategóriába sorolhatók:
áris-fizikai leképzés. Ha a lapozás nincs engedélyezve, ez az egyedüli lehetőség.
meghaladhatja a rendelkezésre álló fizikai tartományt, ha
arra, hogy minden taszkhoz saját LDT és laptáblázat legyen rendelve. Minthogy a lokális deszkriptor-táblázatokban (LDT) levő szegmens-deszkriptorok képezik a taszkok és a szegmensek közötti kapcsolatot, minden egyes taszknak önálló LDT-t lehet biztosítani, ezen kapcsolatok fölötti egyéni kontroll létrehozása érdekében. Bármely meghatározott szegmenshez való hozzáférés hozzárendelhető bármely egyéni taszkhoz, a szegmens szegmens-deszkriptorának a megfelelő taszk lokális deszkriptor-táblázatába való helyezésével. Ha a lapozás engedélyezett, minden taszknak lehet egy sc Az is lehetséges, hogy a taszkoknak ugyana
z egy egyszerű és memóriatakarékos módja annak, hogy bizonyos Etaszkoknak engedélyezni lehessen, hogy egymás között kommunikáljanak, illetve egymást vezéreljék, anélkül, hogy a teljes rendszer védelmi korlátait ejteni kéne. Mivel mindegyik taszk hozzáférhet a GDT-hez, az a lehetőség is adott, hogy ezen táblázaton belüli szegmensdeszkriptorokkal elérhető
egosztott szegmenseket hozzunk létre. m
le A taszkok lineáris-fizikai leképzései (linear-to-physk 1. Minden taszk által megosztott, egyetlen line
Lapozás hiányában minden lineáris cím az identikus fizikai címekre van leképezve. Ha engedélyezett a lapozás, a lineáris-fizikai leképzés e formája úgy valósítható meg, hogy minden taszk egyetlen közös lapcímtárat használ. A lineáris tartomány
221
Általános CPU programozási információk
támogatott az igényeknek megfelelően lapozható (demand-paged) virtuális memória használata.
2. Független lineáris-fizikai leképzés minden egyes taszknak. A leképezés e formája abból adódik, hogy minden egyes taszk különálló lapcímtárat használ. Mivel minden taszkkapcsoláskor a PDBR (a lapcímtár bázisregisztere) a TSS-ből kerül betöltésre, mindegyik taszknak különálló lapcímtára lehet.
A különböző taszkok lineáris címtartománya teljesen eltérő fizikai címekre képezhető le. Ha a különböző lapcímtárak bemenetei különböző laptáblázatokra mutatnak, és a laptáblázatok a fizikai memória különböző lapjaira mutatnak, akkor a taszkok egyetlen közös fizikai címen sem osztoznak. A taszk-állapot-szegmensnek egy minden taszk számára elérhető tartományban kell helyet foglalnia, azért, hogy a TSS címek leképezése taszkkapcsolás közben ne változzon, mialatt a proceszszor a TSS-ét olvassa, illetve újraírja. A GDT által leképzett lineáris tartomány egy
egosztott fizikai tárterületre is le kell legyen képezve, ellenkező esetben a GDT zössé
telével két taszk lineáris tartománya miként fedi át egymást a fizikai
.8.7.2. A taszkok logikai címtartománya
yba való képezés (mapping) nem engedi meg a taszkok közötti adatmegosztást.
A GDT szegmensdeszkriptorain keresztül. Minden taszk hozzá tud férni a GDT-ben levő deszkriptorokhoz. Ha ezek a deszkriptorok
m célját veszti. A 3.61. ábra bemutatja, hogy laptáblázatok kö
tétárterületben. 3 Egymagában az átfedett, lineárisról-fizikai tartománleAhhoz, hogy adatokat tehessenek közössé, a taszkoknak egy közös logikairól-lineáris tartományba való leképezésre is szükségük van. Magyarán olyan deszkriptorokhoz is hozzá kell férhessenek, amelyek egy megosztott (közössé tett), lineáris címtartományra mutatnak. Három módja van a megosztott, logikairól fizikai címtartományba való leképezések megteremtésének: 1.
222
Védett üzemmódú multitaszking
egy olyan lineáris címtartományra mutatnak, amely az összes ezve, akkor
a taszkok közössé tehetnek adatokat, illetve utasításokat.
is tartományt címeznek meg, megosztott (shared) fizikai memóriát
eteket tegyenek közössé. Ezeknek a deszkriptoroknak a közönséges neve: alias. A jelen eljárás még inkább szelektívebb, mint a fentebb felsoroltak, ugyanis az LDT
t, lineáris címtartományokra mutathat.
taszk számára közös fizikai címtartományra van lekép
2. Közössé tett LDT-ken keresztül. Két, vagy több taszk használhatja
ugyanazt a lokális deszkriptor-táblázatot (LDT-t), ha a TSS-ükben található LDT szelektorok ugyanazt a LDT-t szelektálják a címfordításhoz. Az LDT-beli szegmensdeszkriptorok, amelyek átfedett (overlapping) fizikai tartományra leképezett lineár
szolgáltatnak. 3. Ugyanarra a lineáris címtartományra leképező LDT-beli
szegmensdeszkriptorokon keresztül. Ha a szóban forgó taszk lap-leképezése a lineáris címtartományt ugyanarra a fizikai címtartományra képzi le, ezen deszkriptorok lehetővé teszik a taszkok számára, hogy címterül
többi deszkriptora független, nem megosztot
223
Általános CPU programozási információk
PTE
A taszklapja
aszk TSS-e Lapcímtárak Laptáblázatok Lapkeretek
PDBR PDE
PTE
PTE
lapja
Megoszt.lap
PTE
B taszk
A t
B taszk TSS-e
MegosztottPDE
PTE
A taszk
A taszklapja
lapja
B taszk
Megoszt.lap
Laptáblázatok
i memóriában
PDBR PDE PTE
PDE PTE lapja
3.61 ábra: Lineáris átfedés a fizika
224
Védett üzemmódú kivételek és megszakítások
3.9. Védett üzemmódú kivételek és megszakítások
sok hajtódnak végre. Általános setben, a megszakítások és kivételek szervizelése a felhasználói rogramok számára áttetsző módon megy végbe. A megszakítások, a
semények, mint például a periféria-eszközök iszolgálási kéréseinek kezelésére használatosak. A kivételek, a
szakítások
p. A maszkolható megszakítások addig nem keletkeznek, amíg a megszakítás-engedélyező flag (IF)
• Nem maszkolható megszakítások, amelyek a processzor NMI (NonMaskable Interrupt) vonalán érkeznek be. A processzor nem rendelkezik egy olyan mechanizmussal, amelyik meggátolná a nem maszkolható megszakításokat.
. Kivételek
• A processzor által detektált kivételek. Ezek tovább
rálhatnak. Ezeket az utasításokat gyakran nevezik "software-
A kivételek és megszakítások egy taszknak vagy egy procedúrának történő erőltetett vezérlésátadása. A taszkot, vagy a procedúrát "kiszolgáló rutinnak" nevezzük (handler). A megszakítások véletlenszerűen jelennek meg egy program végrehajtása közben, a hardware-jelzésekre adott válaszként. A kivételek akkor jelennek meg, amikor kivételeket előidéző utasítáepprocesszoron kívüli ekprocesszor által az utasítások végrehajtása alatt észlelt feltételeket kezelnek, mint például a nullával való osztást. A megszakításoknak és a kivételeknek két-két forrása van: 1. Meg
• Maszkolható megszakítások, amelyeket a CPU az INTR bemenetére ka
nincs 1-re állítva.
2
bonthatók hibákra (faults), csapdákra (traps) és abortokra. • Programozott kivételek. Az INTO, INT 3 , INT n és
BOUND utasítások kivételeket gene
225
Általános CPU programozási információk
megszakításoknak", de a processzor kivételekként kezeli őket.
A jelen rész a processzor azon adottságait mutatja be, amelyek
ontrollálják a megszakításokat, és válaszolnak azokra.
Az NMI megszakításhoz és a kivételekhez a 0-tól 31-ig terjedő
has et közülük. E tartomány szabad vektorai egy setleges jövőbeli felhasználásra fenntartottak ezért ne használjuk a
A provekterj a
ivétel- és megszakítás-vektorok kirendelését mutatja.
V
k 3.9.1. Kivétel- és megszakításvektorok A processzor minden egyes megszakítás- vagy kivételtípushoz rendel egy azonosító számot. Ezt a számot "vektor"-nak nevezzük. tartományból vannak a vektorok rendelve. A processzor jelenleg nem
ználja mindegyikehozzárendeletlen vektorokat.
A maszkolható megszakítások vektorait a hardware determinálja. külső megszakítás-vezérlők, (mint például az 8258A jelzésű
gramoztó megszakítás-vezérlő) a processzor buszára helyezik a tort, ennek megszakítás-elismerő ciklusa idején. A 32-től 255-ig edő tartományból bármely vektorok alkalmazhatók. A 3.62. ábra
k
ektorszám Meghatározás 0 Osztási hiba 1 Debug kivétel 2 Nem maszkolható megszakítás 3 Töréspont 4 INTO túlcsordulást talált 5 BOUND határ túllépés 6 Nem megengedett op. kód 7 Eszköz nem elérhető 8 Dupla hiba 9 Koprocesszor szegmens túlfutás 10 Érvénytelen taszk státusz szegmens
226
Védett üzemmódú kivételek és megszakítások
11 Szegmens nincs jelen 12 Verem hiba 13 Általános védelmi hiba 14 Laphiba 15 Intel által fenntartva 16 Lebegőpontos hiba 17 Illeszkedés ellen őrzés18 Géptípus ellenőrzés
19-31 Intel által fenntartva 32-255 Maszkolható m ítások egszak
3.62. ábra: Kivételek és megszakításvektorok
* Megjegyzés: A processzortípus ellenőrzés modell-specifikus kivétel, amely csak a Pentium processzorokon létezik. A kivételeket hibákra, trapokra és abortokra oszthatjuk, annak
gy a kivételt
tően, amelyben a ivétel
ardware-hibák, vagy a ndszer táblázatokban talált összeférhetetlen, vagy szabálytalan értékek.
függvényében, hogy miként vannak jelentve, illetve, hoelőidéző utasítás újraindítását támogatják-e. Hibák (faults): A hiba egy olyan kivétel, amelyet a processzor az utasításhatáron jelent, azon utasítást megelőzően, amelyben a kivétel észlelve volt. A hiba jelentése a gépnek egy olyan helyreállított állapotában történik, amely megengedi az utasítás újraindítását. A hibakezelő rutin visszatérési címe a hibát kiváltó utasításra mutat, nem pedig az ezt követő utasításra. Csapdák (traps): A trap egy olyan kivétel, amelyet a processzor az utasításhatáron jelent, rögtön azon utasítást kövek észlelve volt. Abort-ok (aborts): Az abort egy olyan kivétel, amely nem jelenti minden esetben a kivételt előidéző utasítás helyét, és amely nem engedélyezi a kivételt kiváltó program újraindítását. Az abortok komoly hibák jelentésére használatosak, mint amilyenek a hre
227
Általános CPU programozási információk
3.9.2. Utasítások újraindítása A megszakítások és kivételek legnagyobb része esetén, a
aztak. Ez hetővé teszi az utasítások újraindítását.
gy felhasználói program hivakozhat egy olyan szegmensben ő a
megelőző értékre visszaállítani. A processzor mindezen isszaállító műveleteket a felhasználói programok számára teljesen
iba jelenik meg, az EIP regiszter úgy lesz elyreá
vezérlésátadásra mindaddig nem kerül sor, amíg az aktuális utasításnak nincs vége. Ennek az az eredménye, hogy az EIP regiszter a kivétel vagy megszakítás megjelenésének pillanatában, éppen a végrehajtás alatt álló utasítást közvetlenül követő utasításra mutat. Ha az utasításnak van egy ismétlési prefixe, a vezérlés átadása az aktuális művelet végén történik, a következő művelet elvégzésére beállított regiszterekkel. Ellenben, ha a kivétel egy hiba, a processzor regiszterei visszaállítódnak azokra az állapotokra, amelyeket az utasítás elkezdése előtt tartalmle Az utasítás újraindítást olyan kivételek kezelésére lehetfelhasználni, amelyek lezárják az operandusokhoz való hozzáférést.
éldául, ePlev datra, amely nincs betöltve a memóriába. Amikor a kivétel megjelenik, a kivétel-kiszolgáló rutinnak be kell töltenie a szegmenst (valószínűleg a lemezről), és folytatnia kell a végrehajtást a kivételt előidéző utasítással kezdődően. A kivétel megjelenésének pillanatában, az utasítás már megváltoztathatta a processzor egyes regisztereinek tartalmát. Ha az utasítás egy operandust olvasott ki a veremből, kötelező a
eremmutatót avvátlátszó módon végzi el. Mikor egy hh llítva, hogy a kivételt kiváltó utasításra mutasson. Amikor a kivétel-kiszolgáló handler visszatér, a végrehajtás ezzel az utasítással folytatódik. 3.9.3. Megszakítások engedélyezése és letiltása Bizonyos feltételek és jelzőbit-beállítások arra késztetik a processzort, hogy egyes megszakítás- és kivételtípusokat letiltson.
228
Védett üzemmódú kivételek és megszakítások
3.9.3.1. További NMI megszakítások maszkolása Amíg egy NMI megszakításkezelő rutin fut, a processzor letiltja a
egszakítást kiszolgáló procedúrához vagy taszkhoz intézett további
), az gymásbaágyazott maszkolható megszakítások letiltása céljából, ugyanis gy maszkolható-megszakítást kiszolgáló eljárásból származó IRET
Az IF flag kikapcsolhatja a processzor INTR vonalán beérkező e
me lmen kívül maradnak. Ha az IF magasra van állítva, z INTR megszakítások ki lesznek szolgálva. Egy RESET jelre
Az lear) az IF itet.
9. bitjét). Ezek az utasítások csak akkor ajthatók végre, ha a CPL szint megegyezik az IOPL értékével, vagy
A PUSHF utasítás eltárol minden flag-et a verembe, ahol ezek vizsgálhatók, illetve módosíthatók. A POPF utasítással lehet a
mhívásokat, mindaddig, amíg a következő IRET utasítás nem kerül végrehajtásra. Ezzel megelőzi azt, hogy a megszakításkezelőhöz intézett hívások felgyűljenek a veremben. Ajánlott, megszakítás kapuk alkalmazása a nem maszkolható megszakításokra (NMIeeutasítás újra engedélyezné az NMI-t. 3.9.3.2. INTR megszakítások maszkolása m gszakítások szervizelését. Ha az IF bit törölve van, az INTR
gszakítások figyeaválaszolva, a processzor, a többi flag-hez hasonlóan, törli az IF bitet is.
STI és CLI utasítás magasra állítja (set), illetve letörli (cb A CLI (Clear Interrupt-Enable Flag - megszakítés engedélyező bit törlése) utasítás és az STI (Set Interrupt-Enable Flag - megszakítás engedélyező bit beállítása) utasítás egy ismert állapotba hozza az IF flag-et (az EFLAGS regiszter hannál privilegizáltabb. Az IF bitet még a következő műveletek is befolyásolják: •
megváltoztatott formát az EFLAGS regiszterbe visszatölteni.
229
Általános CPU programozási információk
• aszkkapcsolások, illetve a POPF és IRET utasítások feltöltik az EFLAGS regisztert, tehát felhasználhatók az IF bit beállításának megváltoztatására.
A t
• A kapuzott megszakításo san törlik az IF bitet, letiltva ezzel a megszakításokat.
3.9.3.3. Debug hibák maszkolása az RF bit segítségével ató RF bi a, hogy meggátolja egy utasítás-töréspont hiba többszörös kiszolgálását. Az RF a következőképpen működik: • Miel ely hiba lőbb
beállítja az RF bitet az EFLAGS másolatá kiszolgáló rutin veremébe hel (push). No veremb i képét a software-ek kell módosí
• Ma bitet a hibakeze utin állítja r az IRETD
utasítást hajtja végre a hiba-generáló utasításra való visszatéréshez. Az IRETD veremből az EFLAGS regiszterbe. (A POPF és POPFD utasítások nem viszik át az RF másolatát az EFLAGS regiszterbe.)
• A processzor törli az RF bitet, ha mi ást siker znie,
IRET uta t, illetve a ta apcsolást elő ő JMP, y INT uta okat. Teh g beállítva rad, de
mint egy, IRET ut köve ítás
Ha RF be van állítva, arra készteti a processzort, hogy beszüntesse az utas
k automatiku
Az EFLAGS regiszterben találh t alkalmazásának célj
őtt a processzor belépne bárm kezelő rutinba, eban, amelyet aztán armális esetben, az RFyez
el nem tsák.
gát az RF lő r be, amiko
utasítás átmozgatja az EFLAGS képét a
nden utasít ült befejekivéve az sítás szkk idézCALL vag sítás át az RF fla manem több,idejére.
- az án közvetlen tkező - utas
•
ítás-töréspont hibák jelentését. Mivel az utasítás-töréspont hibák a legnagyobb prioritással rendelkező hibák, ugyanahhoz az utasításhoz kapcsolódó bármely más hibát megelőzően kerülnek bejelentésre. Az utasítás végrehajtására tett legelső kísérlet esetén RF=0, illetve RF =1 minden olyan próbálkozás
230
Védett üzemmódú kivételek és megszakítások
esetén, amely egy utasítás-töréspont hibát, vagy bármilyen más hibát követően, újraindítaná az utasítást. Ez azt biztosítja, hogy minden
tasítás-töréspont hiba csak egyszer lesz jelentve.
e-ek, amelyek gyakran kell veremszegmenst áltsanak, egy utasítás párt használnak, például:
utasítást követően, a processzor letiltja a egszakításokat, a debug-kivételeket és az egylépéses nyomkövető trap
kivételeket, amíg a következő utasítás mögötti utasításhatárt el nem éri. Általános védelmi-hibák még ekkor is generálódhatnak. Ha az SS regiszter tartalmának módosítására az LSS utasítást használjuk, ez a probléma nem jelenik meg. 3.9.4. Szimultán kivételek és megszakítások közötti prioritás Ha egy utasításhatáron egynél több kivétel, vagy megszakítás van függőben (pending), a processzor egy előre meghatározható sorrendben szolgálja ki őket. A megszakítás- és kivétel források osztályai közti prioritásokat a 3.63. ábra mutatja be. Amíg ezen osztályok közötti prioritás konzisztens az architektúra egészén, addig minden egyes osztályon belüli kivételek alkalmazás-függők, és processzoronként eltérők lehetnek. A processzor először a legmagasabb prioritással rendelkező osztályba tartozó, függőben levő kivételt, vagy megszakítást szolgál ki,
u 3.9.3.4. Egyes kivételek és megszakítások maszkolása Azok a softwarv MOV SS, AX MOV ESP, StackTop Ha egy megszakítás vagy kivétel jelenik meg miután a szegmensszelektor már fel van töltve, de még mielőtt az ESP regiszter be lenne töltve, a megszakítás- vagy kivétel-kiszolgáló rutin idejére, a veremtartományba mutató logikai címnek ezen két része összeférhetetlen. Ennek a helyzetnek az elkerülése végett, egy MOV SS-be, vagy POP SS-be típusúm
231
Általános CPU programozási információk
átadván a vezérlést a kezelő rutin első utasításának. Az aprioritású kivételeket elveti. Az alacsonyabb
ggőben maradnak. Az elvetett kivételek újra aktualizálódnak, am
lacsonyabb prioritású megszakítások
ikor a egsza
füm kítás kezelő visszaadja a vezérlést a megszakítási pontra. Prioritás Osztály Meghatározás Magas 1. osztály Trap az előző műveleten
-Töréspont -Debug trap kivétel
2. osztály Külső megszakítás -NMI megszakítás -Maszkolható megszakítás
3. osztály Hiba a következő utasításnál -Kód töréspont hiba -Kódszegmens határ túllépés -Laphiba az előolvasásnál
4. osztály Hiba a következő utasítás dekodolásánál -Érvénytelen op. kód -Műveleti kód hosszabb 15 Byte-nál -Koprocesszor nem áll rendelkezésre
Alacsony 5. osztály Hiba egy utasítás végrehajtásakor -Általános detektálás -Koprocesszor hiba -Túlcsordulás -Határellenörzés -Érvénytelen TSS -Szegmens nincs jelen -Verem kivétel -Általános védelmi hiba -Adat laphiba -Illeszkedés ellenőrzés
éte itása 3.63. ábra: Kiv lek és megszakítások egymás közötti prior
232
Védett üzemmódú kivételek és megszakítások
3 zak akítás és megszakításhoz, a hozzárendelt eseményt kiszolgáló procedúra vagy taszk deszkriptorát rendeli. Akárcsak a GDT, vagy az LDT-k, az IDT is egy 8 Byte-os deszkriptorokat tartalmazó tömb. Az IDT-be mutató in ához skálatényezővel (a deszkriptorban levő Byte-ok számával) a kivétel-, vagy megszakításvekto , az IDT nem
rtalmazhat több mint 256 deszkriptort. Kevesebb, mint 256 deszkriptort
.9.5. A megs ításdeszkriptor-táblázat
A megsz deszkriptor-táblázat (IDT) minden kivételhez
dexek formálás a processzor beszorozza egy 8-as
rt. Mivel mindössze 256 vektor vantaviszont tartalmazhat, mert deszkriptorokra csak azoknak a megszakításvektoroknak van szükségük, amelyek előfordulhatnak. Az IDT a fizikai memória bármely részén rezidens lehet. Amint azt a 3.64. ábra mutatja, a processzor az IDTR regisztert felhasználva lokalizálja az IDT-t. Ez a regiszter tartalmazza az IDT 32 bites báziscímét, valamint a 16 bites határt. A LIDT és SIDT utasítások töltik fel, illetve mentik el az IDTR regiszter tartalmát. Mindkét utasításnak egy operandusa van, amely a memóriában levő hat Byte címe.
IDT báziscím
IDTR regiszter
IDT határ
atMegszakítás deszkriptor tábláz
Kapu az N.
megszakításhoz
megszakításhoz
Kapu az 3.megszakításhoz
Kapu az 2.
Kapu az 1.megszakításhoz
233
Általános CPU programozási információk
3.64. ábra: IDT lokalizálása a memóriában az IDTR segítségével
a határon kívülre eső eszkriptorra mutat, a processzor átmegy "shutdown" módba. Ebben az emm
incs kezdeményezve. A processzor egy speciális buszciklust enerál a "shutdown" állapotba való belépés jelzésére. A software-jleszt
riába. Ez az utasítás bármely privilégium szinten égrehajtható.
3.9
tart
1. taszkkapukat
A 3.65. ábra bemutatja a taszkkapuk, megszakítás kapuk, és trap
Abban az esetben, ha egy vektor
düz ódban a processzor megszünteti az utasítás-végrehajtást, mindaddig, amíg nem észlel egy NMI megszakítást, vagy amíg egy reset inicializálás ngfe ők tisztában kell legyenek a hardware-nek erre a jelzésre adott válaszával. Például, a hardware ilyenkor kigyújthat egy fényjelzést a gép fő paneljén, generálhat egy diagnosztika-információkat felvevő NMI megszakítást, vagy kezdeményezhet reset inicializálást. A LIDT (Load IDT Register - a megszakításdeszkriptor-táblázat regisztert betöltő utasítás) feltölti az IDTR regisztert a memóriában levő operandusban tárolt báziscímmel és limit-tel. Ezt az utasítást csak akkor lehet végrehajtani, ha CPL=0. Általában az operációs rendszerek inicializáló kódja használja az IDT létrehozásához. Az operációs rendszer arra is felhasználhatja, hogy egyik IDT-ről a másikra váltson. SIDT (Store IDT Register - a megszakításdeszkriptor-táblázat regisztert eltároló utasítás) átmásolja az IDTR-ben tárolt báziscímet és limit értéket a memóv
.6. IDT deszkriptorok Az IDT a következő három típusú deszkriptor közül bármelyiket
almazhatja:
2. megszakítás kapukat 3. trap kapukat
kapuk formátumát.
234
Védett üzemmódú kivételek és megszakítások
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Fenntartva
TSS szegmens szelektor
P 0DPL +4
+0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Ofszet 31-16 P DPL Fenntartva +4
Szegmens szelektor Ofszet 15-0 +0
31 0 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 03
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Ofszet 31-16 P DPL +4
Szegmens szelektor Ofszet 15-0 +0
0 1 0 1Fenntartva
Fenntartva
0 1 1 1 0 0 0 0
Fenntartva0 1 1 1 1 0 0 0
3.65. ábra: IDT kapudeszkriptor
235
Általános CPU programozási információk
3.9.7. Megszakítás taszkok és megszakítás-kezelő
akításvektort almazza egy IDT-ben lev
ezője a kivételt vagy megszakítást kiszolgáló procedúra elejére mutat.
procedurák Amint a CALL utasítás képes egy procedúrát, vagy egy taszkot meghívni, úgy egy kivétel, vagy megszakítás is képes egy kezelőrutint, akár mint procedúrát, akár mint taszkot "meghívni". A kivételre vagy megszakításra válaszolva, a processzor a kivétel, vagy megszalk ő deszkriptor indexelésére. Ha a processzor egy megszakítás-, vagy trap kapura indexel, a call-kapura irányuló CALL utasításhoz hasonló módon hívja meg a kiszolgáló rutint. Ha a processzor egy taszkkaput talál, a taszkkapura irányuló CALL utasításhoz hasonló módon végez taszkkapcsolást. 3.9.7.1. Megszakítás-kezelő procedúrák Amint azt a 3.66. ábra mutatja, egy megszakítás-, vagy trap kapu közvetett módon címez meg egy olyan procedúrát, amely az aktív taszk kontextusában fut. A kapu szelektora egy végrehajtható szegmens GDT-beli, vagy az aktuális LDT-ben levő deszkriptorára mutat. A kapudeszkriptor ofszet m
236
Védett üzemmódú kivételek és megszakítások
IDT
Eljárás
Cél kódszegmens
Bázis cím
Szegmensdeszkriptor
Megszakítás vagytrap kapu
GDT vagy LDT
OfszetMegszakítás
vektor
Szegmens szelektor
3.66. ábra: Megszakítás procedura hívás A processzor, egy procedúrahívással majdnem azonos módon hív meg egy kivételt, vagy megszakítást kiszolgáló procedúrát. 3.9.7.1.1. A megszakítás-kezelő eljárás verme Akárcsak egy CALL utasítással történő vezérlésátadás esetén, a kivételt, vagy megszakítást kiszolgáló procedúrának való vezérlésátadás
237
Általános CPU programozási információk
is alkalmazza a vermet, a processzor állapotának elmentésére. Amint azt a 3.67. ábra mutatja, egy megszakítás, a megszakított utasítás címének stack-be való eltárolását megelőzően, lenyomja az EFLAGS regiszter tartalmát a verembe.
Nem privilégizált szintcsere hibakód nélkül
Nem privilégizált szintcsere hibakóddal
Privilégizált szintcsere hibakód nélkül
Privilégizált szintcsere hibakóddal
Régi EFLAGRégi CS
Régi EIP
Régi ESP
Új ESP
Régi ESP
Új ESP
Régi EFLAGRégi CS
Régi EIPHibakód
Nem használtRégi SS
Régi ESPRégi EFLAG
Régi CSRégi EIP Új ESP
ESPa TSS-ből
Új ESP
ESPa TSS-bőlNem használt
Régi SSRégi ESP
Régi EFLAGRégi CS
Régi EIPHibakód
3.67. ábra: Verem keret egy megszakítás vagy kivétel után
Némely kivétel típus egy hibakódot is lenyom a verembe. A kivételt kiszolgáló rutin felhasználhatja a hibakódot a kivétel diagnosztikájára. 3.9.7.1.2. Visszatérés egy megszakítás-kezelő eljárásból A megszakítás-kezelő eljárás a normális eljárásoktól az eljárásból való kilépés metódusában különbözik. Az IRET utasítás a megszakítás-kezelő procedúra elhagyására használatos. Az IRET utasítás hasonlít a RET utasításra, azzal a különbséggel, hogy négy további Byte-tal növeli az ESP regisztert, és visszaállítja az elmentett flageket az EFLAGS regiszterbe. Az EFLAGS regiszter IOPL mezőjét csak abban az esetben
238
Védett üzemmódú kivételek és megszakítások
állítja vissza, ha a CPL=0. Az IF bit csak akkor módosul, ha CPL<= IOPL. 3.9.7.1.3. A megszakítás-kezelő eljárás flag-használata A megszakítás kapukat vagy trap kapukat használó megszakítások a TF bit törlését okozzák, miután annak aktuális értékét, az EFLAGS regiszter elmentett tartalmának részeként, elmentik a verembe. Ezzel, a processzor megelőzi azt, hogy az utasítás nyomkövetés a megszakításra adott választ befolyásolhassa. Egy következő IRET utasítás visszaállítja a TF bitet az EFLAGS regiszter verembe elmentett tartalmának értékére. Egy megszakítás kapu és egy trap kapu közti különbség az IF flagre gyakorolt hatásukból adódik. Egy megszakítás kaput alkalmazó megszakítás törli az IF bitet, megakadályozva ezzel, hogy más megszakítások beavatkozzanak az aktuális megszakításkezelő rutinba. Egy következő IRET utasítás visszaállítja az IF bitet az EFLAGS regiszter verembe elmentett tartalmának értékére. Egy trap kaput használó megszakítás nem változtat az IF biten. 3.9.7.1.4. Védelem a megszakítás-kezelő eljárásokban Azok a privilégium szabályok, amelyek a megszakítás-kezelő procedúrákat irányítják, azonosak a procedúra hívásra érvényes szabályokkal: a processzor nem teszi lehetővé egy megszakításnak, hogy átadja a vezérlést egy kevésbé privilegizált (számszerint nagyobb privilegizálási szintű) szegmensben levő procedúrának. E szabály megsértésére tett kísérlet általános védelmi hiba kivételt eredményez. Minthogy a megszakítások általában nem szabályos időközönként jelennek meg, az említett privilégium szabály gyakorlatilag azokra a privilegizálási szintekre kényszeríti a megszorításokat, amelyeken a kivételt-, vagy megszakítást kiszolgáló rutinok képesek futni. A következő technikák bármelyikét fel lehet használni a privilégium szabályok megsértésének megelőzésére:
239
Általános CPU programozási információk
• A kivételt-, vagy megszakítás-kezelő rutinokat illeszkedő (conforming) kódszegmensbe lehet elhelyezni. Ezt a technikát bizonyos kivételeket (például az osztáshiba kivételt) kezelő rutinok alkalmazhatják. Ezek a kiszolgáló rutinok csak a veremben elérhető adatokat szabad használják. Ha a megszakítás-kezelőnek szüksége lenne egy adatszegmensben található adatokra, akkor az adatszegmensnek kötelezően 3-as privilegizálási szintje kéne legyen, ami védtelenné tenné azt.
• A megszakítást kiszolgáló rutin 0-s privilegizálási szintű
kódszegmensbe is elhelyezhető. Ez a handler a program CPL-jétől függetlenül, mindig futhatna.
3.9.7.2. Megszakítás-kezelő taszkok Egy IDT-beli taszkkapu közvetetten határoz meg egy taszkot, ahogyan azt a 3.68. ábra illusztrálja. A taszkkapuban található szegmens-szelektor egy GDT-beli TSS deszkriptort címez meg.
240
Védett üzemmódú kivételek és megszakítások
IDT
TSS
TSS bázis cím
TSS szegmensdeszkriptor
Taszk kapu
GDT
Megszakításvektor
TSS szelektor
3.68. ábra: Megszakítás taszkkapcsolás Amikor egy kivétel, vagy megszakítás meghív egy IDT-ben levő taszkkaput, taszkkapcsolás keletkezik. Egy megszakításnak különálló taszkkal való kiszolgálása két előnyt kínál fel: • A teljes kontextus automatikusan elmentődik
241
Általános CPU programozási információk
• A megszakítás-kezelő elszigetelhető a többi taszktól, egy különálló címtartomány hozzárendelésével. Ez, a megszakításkezelő részére egy külön LDT biztosításával valósítható meg.
Egy megszakítás okozta taszkkapcsolás ugyanúgy működik, mint a többi taszkkapcsolás. A megszakítás-kezelő taszk visszatér a megszakított taszkba, egy IRET utasítást végezve. Egyes kivételek egy hibakódot szolgáltatnak. Ha a taszkkapcsolást egy ilyen kivétel eredményezte, a processzor lenyomja a hibakódot a megszakítás-kezelő privilegizálási szintjének megfelelő verembe. Hogyha egy operációs rendszer megszakítás-kiszolgáló taszkokat használ, tulajdonképpen két taszk-elosztó mechanizmus létezik: a software ütemező (az operációs rendszer része), illetve a hardware ütemező (a processzor megszakítási mechanizmusának része). A software ütemező olyan megszakításkiszolgáló taszkokat kell készenlétbe helyezzen (accomodate), amelyek eloszthatók (dispatched), ha a megszakítások engedélyezve vannak. 3.9.8. Hibakódok Egy bizonyos szegmenshez kapcsolódó kivételek esetén, a processzor eltárol egy hibakódot a kivételkezelő vermébe (függetlenül attól, hogy az procedúra, vagy taszk). A hibakódoknak a 3.69. ábrán látható formátuma van. A hibakód hasonlít egy szegmens-szelektorhoz, ugyanakkor, az RPL mező helyett a hibakód két, egybites mezőt tartalmaz: 1. A processzor beállítja az EXT bitet, ha a programon kívüli esemény
eredményezte a kivételt. 2. A processzor beállítja az IDT bitet, ha a hibakód index része egy IDT-
beli deszkriptorra vonatkozik
242
Védett üzemmódú kivételek és megszakítások
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
Fenntartva Szelektor index TI
IDT
EXT
3.69. ábra: Hibakód Ha az IDT bit nincs beállítva (set), a TI bit mutatja meg, hogy a hibakód egy GDT-re (TI=0), vagy az LDT-re (TI=1) vonatkozik-e. A megmaradt 13 bit a szegmens szelektorának felső bitjei. Egyes esetekben a hibakód nulla (tehát az alsó szó minden bitje 0-s). A hibakód duplaszóként van a veremre helyezve. Ez azért történik így, hogy a verem olyan címekhez maradjon illesztett (aligned), amelyek négy többszörösei. A duplaszó felső része fenntartott. 3.9.9. Kivétel feltételek A következő alpontok felsorolják azokat a feltételeket, amelyek kivételeket generálnak. Mindegyik leírás hiba-, trap-, vagy abort-ként osztályozza a kivételeket. E kategorizálás azon procedúrák újraindításához szükséges információt szolgáltatja a rendszerprogramozóknak, amelyekben a kivételek megjelennek: • Hibák - A CS és EIP regiszterek elmentett tartalma a hibát kiváltó
utasításra mutat. • Csapdák - A CS és EIP regisztereknek a trap megjelenésekor
elmentett tartalma a trap-et kiváltó utasítás után végrehajtandó utasításra mutat. Ha egy vezérlést átadó utasítás ideje alatt egy trap detektálódik, a CS és EIP regiszterek elmentett tartalma tükrözi a vezérlésátadást. Például, ha egy JMP utasításban trap van detektálva, a CS és EIP regiszterek elmentett tartalma a JMP utasítás rendeltetési helyére mutat, és nem - JMP fölötti következő címen levő utasításra.
• Abortok - Az abort egy olyan kivétel, amely nem engedi meg sem a
kivételt okozó utasítás helyének pontos behatárolását, sem a kivételt
243
Általános CPU programozási információk
kiváltó program újraindítását. Az abortok komoly hibák jelentésére használatosak, mint amilyenek a hardware-hibák, vagy a rendszertáblázatokban talált összeférhetelen, vagy szabálytalan értékek.
3.9.9.1. 0-s számú megszakítás - Osztáshiba (Divide Error) Az osztáshiba egy DIV, vagy IDIV utasítás esetén jelenik meg, ha az osztó nulla. 3.9.9.2. 1-es számú megszakítás - Debug kivétel A processzor debug kivételt generál egy sor feltétel esetén. Az, hogy a kivétel hiba, vagy trap, a feltételtől függ, ahogy következik:
Utasítás cím töréspont hiba Adat cím töréspont trap Általános detektálás hiba Lépésenkénti végrehajtás trap Taszkkapcsolás töréspont trap
A processzor nem nyom le hibakódot ennél a kivételnél. A kivételkezelő rutin megvizsgálhatja a nyomkövető regisztereket, hogy megállapítsa, melyik feltétel váltotta ki a kivételt. A debugolásról és a nyomkövető regiszterekről részletes információ található a 2. kötetben. 3.9.9.3. 3-as számú megszakítás - Töréspont (Breakpoint) Az INT 3 utasítás töréspont trap-et generál. Az INT 3 utasítás egy Byte-nyi hosszú, ami leegyszerűsíti egy RAM-ban levő kódszegmensbeli műveletkód (opcode) kicserélését a töréspont műveletkódra. Az operációs rendszer, vagy egy nyomkövető eszköz alkalmazhat egy, a kódszegmens
244
Védett üzemmódú kivételek és megszakítások
fizikai címtartományára leképezett adatszegmenst, az INT 3 utasítás azon pontokra való elhelyezésére, amelyekben a debugoló meghívása szükséges. A nyomkövetők a program felfüggesztésére töréspontokat használnak, a regiszterek, változók, stb. vizsgálatához. A CS, illetve EIP regiszterek elmentett tartalma a töréspontot követő Byte-ra mutatnak. Ha a debugoló engedélyezi a felfüggesztett program végrehajtásának folytatását, a töréspont helyén az INT 3 utasítást visszacseréli az eredeti műveletkódra, és mielőtt visszaadná a vezérlést, dekrementálja az EIP regiszter elmentett tartalmát. 3.9.9.4. 4-es számú megszakítás - Túlcsordulás (Overflow) A túlcsordulás trap akkor jelenik meg, ha a processzor beállított OF flag mellett egy INTO utasítást hajt végre. Mivel úgy az előjeles, mint az előjel nélküli aritmetika ugyanazon néhány utasítást használja, a processzor nem tudja meghatározni, hogy a túlcsordulás tulajdonképpen mikor jelenik meg. Ehelyett, magasra állítja az OF bitet, ha az előjeles számokként értelmezett eredmények a tartományon kívülre esnének. Előjeles operandusokon végzett aritmetikai műveletek esetén az OF flag közvetlenül tesztelhető, vagy az INTO utasítás alkalmazható. 3.9.9.5. 5-ös számú megszakítás - Határsértés (Bounds Check) A határsértés (bounds-check) hiba akkor jön létre, amikor a processzor egy BOUND utasítás végrehajtása közben azt észleli, hogy az operandus meghaladja a megadott határértékeket. A program a BOUND utasítást annak ellenőrzésére használhatja fel, hogy egy előjeles tömbindex nem lépi-e túl egy memóriablokkban definiált előjeles határértékeket.
245
Általános CPU programozási információk
3.9.9.6. 6-os számú megszakítás - Érvénytelen utasítás (Invalid Opcode) Az érvénytelen utasítás (invalid op-code) hiba akkor keletkezik, amikor egy érvénytelen műveletkódot detektál a végrehajtó egység. ( A kivétel addig nem detektálódik, amíg az érvénytelen utasítás végrehajtására nem történik kísérlet. Tehát egy érvénytelen műveletkód előzetes elérése (prefetch) nem váltja ki ezt a kivételt.) A verembe nem kerül hibakód. A kivétel ugyanazon taszk keretén belül kezelhető. Ez a kivétel akkor is jelentkezik, ha az operandus típusa az adott utasítás számára érvénytelen. A példák közé sorolható egy regiszter-operandust alkalmazó szegmensek közötti JMP utasítás, vagy egy regiszter forrásoperandust használó LES utasítás. A harmadik feltétel, amely ezt a kivételt generálja, a LOCK prefix használata egy olyan utasítással, amely nem zárható le. Csak bizonyos utasításokra alkalmazható a busz lezárása, és ezeknek az utasításoknak csak azon formái használhatók, amelyek a memóriába írnak. A LOCK prefix minden eltérő használata érvénytelen utasítás hibát generál. 3.9.9.7. 7-es számú megszakítás - nem elérhető eszköz (Device Not Available) A "numerikus koprocesszor nem elérhető" hibát a következő két feltétel egyike hozza létre: • A processzor végrehajt egy ESC utasítást, és a CR0 regiszter EM bitje
1-re van állítva. • A processzor végrehajt egy WAIT (MP=1 esetén) utasítást, vagy egy
ESC utasítást, és a CR0 regiszter TS bitje 1-re van állítva. Tehát a 7-es megszakítás akkor jelentkezik, amikor a programozó azt akarja, hogy az ESC utasítás software úton legyen kezelve (EM=1 esetén), illetve akkor, amikor a processzor egy WAIT, vagy ESC
246
Védett üzemmódú kivételek és megszakítások
utasítással találkozik, és a lebegőpontos egység kontextusa eltér az aktuális taszk kontextusától. Az Intel286-os és Intel386-os processzorokban a CR0 regiszter MP bitje és a TS bit annak megállapítására szolgál, hogy a WAIT utasítás kivételt kell-e generáljon. A Pentium, Intel486 DX és Intel487 SX processzorokon futó programok esetén az MP bit 0 kell legyen. 3.9.9.8. 8-as számú megszakítás - Kettős hiba, dupla hiba (Double Fault) Ha a processzor, miközben egy előző kivétel kiszolgáló rutinját próbálja behívni, egy újabb kivételt detektál, normális esetben a két kivételt sorban, egymás után szolgája ki.
Osztály Vektorszám Meghatározás 1 Debug kivétel 2 NMI megszakítás
Jóindulatú 3 Tőréspont kivételek 4 Túlcsordulás
és megszakítások 5 Határellenörzés 6 Érvénytelen op. kód 7 Eszköz nem elérhető 16 FPU hiba 0 Osztási hiba
Járulékos 10 Érvénytelen TSS kivételek 11 Szegmens nincs jelen
12 Verem hiba 13 Ált. védelmi hiba
Laphibák 14 Laphiba
3.70. ábra: Megszakítás és kivétel osztályok
247
Általános CPU programozási információk
Első Második kivétel kivétel Jóindulatú Járulékos Laphiba
Jóindulatú ok ok ok Járulékos ok Dupla hiba ok Laphiba ok Dupla hiba Dupla hiba
3.71. ábra: Dupla hiba viszonyok
Ha mégsem képes őket sorosan kezelni, kettős hiba kivételt jelez. Annak eldöntésére, hogy a processzor milyen esetben kell két kivételt "dupla hiba"-ként megjelöljön, a kivételeket a következő három osztályba sorolja: "szelíd" (benign) kivételek, "hozzájáruló" (contributory) kivételek, illetve laphiba kivételek. Ezt a felosztást a 3.70. ábra ábrázolja. Az első kivétel osztályát összevetve a második kivétel osztályával, a processzor a 3.71. ábrán megjelölt esetekben jelent kettős hibát. Egy utasítás előzetes elérése (prefetch) idején észlelt kezdeti szegmens- vagy laphiba a 3.71. ábrán kívül esik. Ugyanakkor bármely további hiba, amely akkor generálódik, amikor a processzor megkíséreli átadni a vezérlést a megfelelő hibakezelőnek, továbbra is dupla hiba szekvenciához vezethet. A processzor minden alkalommal lenyom egy hibakódot a kettős hibát kiszolgáló rutin vermébe, viszont ennek a hibakódnak az értéke mindig 0. A hibát kiváltó utasítás nem indítható újra. Ha a kettős hiba kivételkezelő meghívására tett kísérlet közben újabb kivétel is előfordul, a processzor átmegy leállított (shutdown) módba. Ez a mód hasonlít egy HLT utasítást követő állapothoz. Egyetlen utasítás sem kerül végrehajtásra, amíg egy NMI megszakítás, vagy egy RESET jel nem fut be. Ha a leállás akkor jön létre, miközben a processzor egy NMI megszakítást hajt végre, csak a RESET jel képes újraindítani a processzort. A "shutdown" állapot jelzésére a processzor egy speciális buszciklust generál.
248
Védett üzemmódú kivételek és megszakítások
3.9.9.9. 9-es számú megszakítás - (az Intel által fenntartott, használata nem ajánlott) A 9-es megszakítás, a "koprocesszor-operandus szegmenshatár sértés "abort a 386-os CPU-ra alapuló, 387-es numerikus koprocesszorral ellátott rendszerekben generálódik, amikor a 386-os processzor egy lap- vagy szegmens sértést detektál, miközben a 387-es numerikus koprocesszor operandusának középső részét transzferálja. Ezt a megszakítást nem generálja sem a Pentium, sem a 486-os processzor, helyette a 13-as számú megszakítás jön létre. 3.9.9.10. 10-es számú megszakítás - Érvénytelen TSS (Invalid TSS) Az érvénytelen TSS hiba akkor generálódik, ha egy érvénytelen TSS-el rendelkező szegmensre történik taszkkapcsolási kísérlet. A TSS a 3.72. ábrán felsorolt esetekben érvénytelen. A kivételkezelő vermébe lenyomódik egy hibakód, a hiba okának felderítését elősegítendő. Az EXT bit megmutatja, hogy a kivételt a program ellenőrzési területén kívülre eső feltétel okozta-e (például, ha egy taszkkaput alkalmazó külső megszakítás egy érvénytelen TSS-re kísérelt meg taszkkapcsolást végrehajtani).
Hibakód index Meghatározás TSS szegmens A TSS szegmenshatár kisebb mint 67h LDT szegmens Érvénytelen LDT, vagy LDT nincs jelen Verem szegmens A veremszegmens szelektor túllépi a deszkriptor
tábla határt Verem szegmens A verem szegmens nem írható Verem szegmens A veremszegmens DPL-je nem kompatibilis a
CPL-el Verem szegmens A veremszegmens szelektor RPL-je nem
kompatibilis a CPL-el Kódszegmens A kódszegmens szelektor túllépi a deszkriptor
tábla határt Kódszegmens A kódszegmens nem végrehajtható
249
Általános CPU programozási információk
Kódszegmens A nem illeszkedő kódszegmens DPL-je nem egyenlő a CPL-el
Kódszegmens Az illeszkedő kódszegmens DPL-je nagyobb a CLP-nél
Adatszegmens Az adatszegmens szelektor túllépi a deszkriptor tábla határt
Adatszegmens Az adatszegmens nem olvasható
3.72. ábra: Érvénytelen TSS állapotok Ez a hiba megjelenhet akár az eredeti taszk, akár a bejövő taszk kontextusában. Amíg a processzor nem ellenőrizte le teljesen az új taszk TSS-ének jelenlétét, a kivétel az eredeti taszk kontextusában jön létre. Abban a pillanatban, hogy az új TSS jelenléte detektálva van, a taszkkapcsolás befejezettnek lesz nyilvánítva. Vagyis a TR regiszterbe az új TSS-re mutató szelektor töltődik be, és ha a taszkkapcsolást kiváltó ok egy CALL hívás vagy egy megszakítás volt, az új TSS Link mezője a régi TSS-re mutat. Bármely hiba, amelyet a processzor ezen a ponton túlmenően fedez fel, az új taszk kontextusában lesz kezelve. Annak érdekében, hogy biztosítva legyen egy TSS elérhetősége a kivétel kiszolgálásához, az "érvénytelen TSS" kivételt kiszolgáló rutin egy taszkkaput alkalmazó taszk kell legyen. 3.9.9.11. 11-es számú megszakítás - Szegmens nincs jelen, (Segment Not Present) A "szegmens nincs jelen" hiba akkor generálódik, amikor a processzor észleli, hogy a deszkriptor P bitje 0-s. A processzor a következő esetek bármelyikében generálhatja ezt a hibát: • Miközben megkíséreli a CS, DS, ES, FS, vagy GS regisztereket
feltölteni, az SS regiszter feltöltése viszont, veremhibát okoz. • Miközben megkíséreli az LDT regisztert az LLDT utasítás
segítségével feltölteni, az LDT regiszter egy taszkkapcsolás közbeni feltöltése viszont, egy "érvénytelen TSS" kivételt okoz.
250
Védett üzemmódú kivételek és megszakítások
• Miközben megkíséreli egy olyan kapudeszkriptor alkalmazását,
melynek P bitje betöltetlen szegmenst jelöl. Ez a hiba újraindítható. Ha a kivételkezelő betölti a szegmenst, majd ezt követően visszatér (return), a megszakított program végrehajtása folytatódik. Ha egy taszkkapcsolás közben "szegmens nincs jelen" kivétel keletkezik, a taszkváltás nem minden lépése lesz befejezve. Egy taszkkapcsolás alatt a processzor előszőr feltölti az összes szegmensregisztert, majd ellenőrzi ezek tartalmának helyességét. Amikor egy "betöltetlen szegmens" kivétel kerül felfedezésre, a hátramaradó szegmensregiszterek még nincsenek leellenőrizve, ezért ezek memória-hozzáférésre alkalmatlanok lehetnek. A "betöltetlen szegmens" kivételkezelő rutinja nem "számíthat" arra, hogy a CS, SS, DS, ES, FS, illetve GS regiszterekben található szegmens-szelektororokat felhasználhatja anélkül, hogy egy újabb kivételt ne okozna. A kivételkezelő minden egyes szegmensregisztert meg kell vizsgáljon, mielőtt megpróbálná folytatni a bejövő taszkot, különben a későbbiekben általános védelmi hibák keletkezhetnek, olyan feltételek mellett, amelyek a diagnosztizálást még nehezebbé teszik. Ezen eset kezelésére három lehetőség kínálkozik: 1. Taszk segítségével kezelni a "betöltetlen szegmens" kivételt. A
megszakított taszkra való visszakapcsolás arra készteti a processzort, hogy ellenőrizze a regisztereket, miközben a TSS-ből betölti őket.
2. PUSH és POP utasításokat alkalmazni az összes szegmensregiszterre.
Minden POP utasítás arra készteti a processzort, hogy ellenőrizze a szegmensregiszter új tartalmát.
3. Minden egyes szegmensregnek a TSS-ben eltárolt tartalmát
ellenőrizni, szimulálva azt a tesztelést, amelyet a processzor a szegmensregiszter betöltésekor végez.
Ez a kivétel lenyom egy hibakódot a verembe. A hibakód EXT bitje magasra állítódik, ha egy programon kívüli esemény idézte elő a
251
Általános CPU programozási információk
megszakítást, amely a továbbiakban egy betöltetlen szegmensre mutatott. Az IDT bit akkor lesz beállítva, ha a hibakód egy IDT bemenetre utal (például, egy jelen nem levő kapura vonatkozó INT utasítás). Az operációs rendszer, a virtuális memória szegmensszintű alkalmazására, tipikusan a "betöltetlen szegmens" kivételt alkalmazza. Ennek ellenére, egy kapudeszkriptorbeli "nincs jelen" jelölés általában nem azt jelzi, hogy a szegmens nincs jelen (mivel a kapuknak nem felelnek meg feltétlenül szegmensek). A jelen nem levő kapukat az operációs rendszer, a számára különös jelentőséggel bíró kivételek jelzésére használhatja fel. 3.9.9.12. 12-es számú megszakítás - verem kivétel (Stack Exception) A veremhiba két feltétel mellett jön létre: • Bármely olyan műveletben történő határsértés eredményeként, amely
az SS regiszterre vonatkozik. Ide tartoznak az olyan verem-orientált utasítások, mint a POP, PUSH, ENTER, és a LEAVE, valamint egyéb olyan memóriahivatkozások, amelyek impliciten, vagy expliciten alkalmazzák az SS regisztert (például MOV AX, [BP+6] vagy MOV AX, SS:[EAX+6]). Az ENTER utasítás akkor váltja ki ezt a kivételt, amikor túl kevés hely van a lokális változók lefoglalására.
• Mikor kísérlet történik az SS regiszternek egy olyan deszkriptorral
való feltöltésére, amely a "szegmens nincs jelen" megjelölést viseli, de egyébként érvényes. Ez megjelenhet egy taszkkapcsoláskor, egy eltérő privilegizálási szintre történő CALL híváskor, egy eltérő privilegizálási szintre való visszatéréskor, egy LSS utasítás esetén, illetve egy SS regiszterbe történő MOV vagy POP utasítás esetén.
Amikor a processzor észleli a veremhibát, a hibakezelő vermébe lenyom egy hibakódot. Ha a kivétel oka egy betöltetlen veremszegmens, vagy az új veremnek, privilegizálási szintek közti CALL hívás alatt létrejött túlcsordulása, akkor a hibakód a kivételt előidéző szegmens szelektorát tartalmazza (a kivételkezelő tesztelheti a deszkriptor P bitjét annak megállapítására, hogy ezek közül melyik kivétel jött létre), ellenkező esetben a hibakód értéke 0.
252
Védett üzemmódú kivételek és megszakítások
Ezt a kivételt kiváltó utasítás minden esetben újraindítható. A kivételkezelő vermébe eltárolt visszatérési cím arra az utasításra mutat, amelyet újra kell indítani. Általában, ez maga a kivételt okozó utasítás. Ugyanakkor, azon veremhiba esetén, amely egy "nincs jelen" jelzésű veremszegmens deszkriptor taszkkapcsolás közbeni betöltésekor jelentkezik, a mutatott utasítás a bejövő taszk első utasítása. Ha a veremhiba egy taszkkapcsolás közben lép fel, a szegmensregisztereket nem lehet a memória megcímzésére felhasználni. Egy taszkkapcsolás alatt, a szelektorértékek hamarabb kerülnek betöltésre a deszkriptorok ellenőrzésénél. Abban az esetben, ha veremkivétel generálódik, a fennmaradt szegmensregiszterek még nem lévén leellenőrizve, a használatuk kivételt okozhat. A veremhiba kivételkezelő rutinja nem "számíthat" arra, hogy a CS, SS, DS, ES, FS, illetve GS regiszterekben található szegmensszelektororokat felhasználhatja anélkül, hogy egy újabb kivételt ne okozna. A kivételkezelő minden egyes szegmensregisztert meg kell vizsgáljon, mielőtt megpróbálná folytatni a bejövő taszkot, különben a későbbiekben általános védelmi-hibák keletkezhetnek, olyan feltételek mellett, amelyek a diagnosztizálást még nehezebbé teszik. 3.9.9.13. 13-as számú megszakítás - Általános védelmi hiba (General Protection) Minden olyan védelemsértés, amely nem okoz egy másik kivételt, általános védelmi hiba kivételt eredményez. Ezek közé tartoznak: • A szegmens határ átlépése, a CS, DS, ES, FS, vagy GS szegmensek
használata közben. • A szegmens határ átlépése, egy deszkriptor-táblázat megcímzése
esetén. • Egy nem végrehajtható szegmensnek átadott vezérlés. • Egy csak-olvasható típusú adatszegmens vagy kódszegmens írása
253
Általános CPU programozási információk
• Egy csak-végrehajtható típusú kódszegmens olvasása • Az SS regiszternek egy csak-olvasható szegmens szelektorával való
feltöltése (ha taszkkapcsolás alatt a szelektor egy TSS-ből származik, amely esetben egy érvénytelen TSS kivétel jelentkezik.)
• Egy rendszerszegmens szelektorának betöltése az SS, DS, ES, FS,
vagy GS regiszterekbe. • Egy csak-végrehajtható kódszegmens szelektorának betöltése a DS,
ES, FS, vagy GS regiszterekbe. • Egy végrehajtható szegmens szelektorának betöltése az SS regiszter
be. • A DS, ES, FS, vagy GS regiszterkel történő memória-hozzáférés, ha
azok a nullás deszkriptort tartalmazzák. • Egy foglalt (busy) taszkra való kapcsolás. • A privilégiumszabályok megsértése. • Az utasításhossz 15 Byte-nyi korlátjának túlhaladása (ez csak abban
az esetben történhet meg, ha egy utasítás elé redundáns prefixek kerülnek).
• A CR0 regiszter betöltése, ha a PG=1 (a lapozás engedélyezve van) és
PE=0 (a védelem le van tiltva). • Virtuális 8086-os üzemmódból, trap-kapuzott megszakítás vagy
kivétel, egy 0-tól eltérő privilegizálási szintű kezelő rutinra. • A CR4 regiszter fenntartott bitjeinek 1-re való átírása. Az általános védelmi kivétel egy hiba (fault). Egy általános védelmi hiba kivételre adott válaszként, a processzor lenyom a kivételkezelő vermére egy hibakódot. Ha a kivételt egy deszkriptor
254
Védett üzemmódú kivételek és megszakítások
betöltése okozta, a hibakód ennek a deszkriptornak egy szelektorát tartalmazza. Különben a hibakód nulla. Egy hibakódon belüli szelektor forrásai a következők lehetnek: • Az utasítás egy operandusa. • Egy olyan kapu szelektora, amelyik az utasítás operandusa. • Egy taszkkapcsolásban résztvevő TSS-beli szelektor 3.9.9.14. 14-es számú megszakítás - Laphiba (Page Fault) Laphiba akkor jelenik meg, ha a lapozás engedélyezett (a CR0 regiszter PG bitje 1-es) és a processzor egy lineáris címnek fizikai címre való fordításakor, a következő feltételek egyikét észleli: • A címfodításhoz szükséges lapcímtár- vagy laptáblázat bejegyzés P
bitje 0-s, ami azt jelzi, hogy a laptáblázat, vagy az operandust tartalmazó lap nincs jelen a fizikai memóriában.
• A procedúra nem rendelkezik a kellő privilégiummal ahhoz, hogy a
megadott lapot elérhesse. Ha a laphiba oka egy lapszintű védelemsértés, a lapcímtárbeli hozzáférést jelző "A" bitek a hiba megjelenésével egyidőben lesznek beállítva. A laptáblázat hozzáférést jelző bitjei csak akkor kerülnek beállításra, ha nem lép fel lapszintű védelemsértés. A processzor két olyan információt biztosít a laphiba kezelőnek, amelyek segítik a kivétel diagnosztizálását, illetve helyreállítását (recover): • Egy verembeli hibakódot. A laphibákra adott hibakódoknak eltérő
formátumuk van, a többi kivétel hibakódjaihoz képest (lásd 3.73. ábra). A hibakód három dolgot közöl a kivételkezelővel:
255
Általános CPU programozási információk
1. A kivételt egy betöltetlen (not-present) lap, egy hozzáférési jog megsértése, vagy egy fenntartott bit használata okozta-e.
2. A processzor felügyelőszinten működött-e a kivétel megjelenése
közben. 3. A kivételt előidéző memória-hozzáférés írás, vagy olvasás volt-e.
• A CR2 regiszter tartalmát. A processzor feltölti a CR2 regisztert azzal
a 32 bites lineáris címmel, amely a kivételt előidézte. A kivételkezelő ezt a címet arra használhatja, hogy lokalizálja a megfelelő lapcímtár, illetve laptáblázat bemeneteket. Ha a laphibakezelő végrehajtása közben egy újabb laphiba jön létre, a hibakezelő rutinnak el kell tárolni a CR2 regiszter tartalmát a verembe (push).
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
PRS
S
R_
U
V_
WFenntartva
P 0 A hiba oka egy nem jelenlévő lap volt 1 A hiba oka egy lapszint védelem megszegés volt W/R 0 A hibát okozó memória hozzáférés egy olvasás volt 1 A hibát okozó memória hozzáférés egy írás volt U/S 0 A hiba keletkezésekor a végrehajtás supervisor módban
történt. 1 A hiba keletkezésekor a végrehajtás user módban történt. RSV 0 A hibát egy beállított bit okozta a laptáblázat vagy a
lapcímtár egy fenntartott pozícióján 1 Egyéb
3.73. ábra: Laphiba hibakódok 3.9.9.14.1. Taszkkapcsolás alatti laphiba Egy taszkkapcsolás alatt a következő műveletek idéznek elő memória hozzáférést:
256
Védett üzemmódú kivételek és megszakítások
• A kimenő taszk állapotának a taszk állapot-szegmensébe (TSS) való
írása. • A bejövő taszk TSS-deszkriptorának lokalizálása a GDT olvasásával. • A bejövő taszk TSS-ének olvasása, a benne levő szegmens-
deszkriptorok típusának ellenőrzése végett. • A bejövő taszk LDT-jének esetleges olvasása, az új TSS-ben tárolt
szegmensregiszterek ellenőrzése végett. Laphiba származhat bármely fentemlített művelet végrehajtásából. A két utolsó alpont esetén, a kivétel a bejövő taszk kontextusában jelenik meg. Az utasításmutató az új taszk következő utasítását jelöli ki, nem a taszkkapcsolást előidéző utasítást (vagy az utoljára végrehajtás alatt álló utasítást, mint a megszakítások esetében). Ha az operációs rendszer struktúrája megengedi, hogy a taszkkapcsolások idején laphibák jelenjenek meg, a laphibakezelőt taszkkapun keresztül kell meghívja. 3.9.9.14.2. Laphiba összeférhetetlen veremmutatóval Különös figyelmet kell fordítani annak biztosítására, hogy a laphiba ne késztesse a processzort egy érvénytelen veremmutató (SS:ESP) alkalmazására. A 16 bites processzorokra írt software-ek gyakran használnak egy utasítás-párt egy új veremre való áttéréshez, például: MOV SS, AX MOV SP, StackTop (verem teteje) Minthogy a második utasítás hozzáfér a memóriához, a 32 bites processzorok esetén lehetséges, hogy laphiba keletkezzen, miután az SS regiszterben levő szelektor megváltozott, de még mielőtt az SP regiszter tartalma elszenvedte volna a megfelelő módosításokat. Ebben a stádiumban, az SS:SP (vagy 32 bites programokban az SS:ESP)
257
Általános CPU programozási információk
veremmutató két része, összeférhetetlen. Az új veremszegmenssel a régi veremmutató kerül alkalmazásra. A processzor nem alkalmaz összeférhetetlen veremmutatót, ha a laphiba kiszolgálása egy helyesen definiált veremre történő átváltást (stack switch) idéz elő, (tehát a kivételkezelő rutin egy taszk, vagy egy privilegizáltabb procedúra). Ugyanakkor, ha a laphiba ugyanazon a privilegizálási szinten van, és ugyanabban a taszkban található, mint a kivételkezelő rutin, a processzor megkíséreli alkalmazni az inkonzisztens veremmutató által kijelölt vermet. Azokban a lapozást használó rendszerekben, amelyek a laphibákat a hibázó taszk keretén belül (trap-, vagy megszakítás kapukkal) kezelik, a laphiba-kezelő rutinnal megegyező privilegizálási szinten futó software-ek számára ajánlott, hogy inkább az LSS utasítás segítségével inicializáljanak egy új vermet, mintsem a fentemlített utasításpárral. Ha a laphiba-kezelő rutin a 0-s privilegizálási szinten fut (normális esetben), a probléma csak a 0-s szinten szaladó programokra szűkül le, vagyis tipikusan az operációs rendszer kerneljére. 3.9.9.15. 16-os számú megszakítás - Lebegőpontos egység hiba, Floating-Point Error) A numerikus koprocesszor hiba egy lebegőpontos aritmetikai utasítás által kiváltott hibát jelez. A 16-os számú megszakítás csak akkor jöhet létre, ha a CR0 regiszterbeli NE bit 1-re van állítva. Ha NE=1, egy nem maszkolható lebegőpontos kivétel a 16-os megszakítást váltja ki, azonnal a következő nemvezérlő (non-control) lebegőpontos utasítás, vagy WAIT utasítás előtt. A 16-os megszakítás egy operációs rendszer-hívás, amely meghívja a kivételkezelő rutint. Ha NE=0 (és az IGNE# bemenet inaktív), egy nem maszkolt koprocesszor hiba azonnal a következő nemvezérlő (non-control) lebegőpontos utasítás, vagy WAIT utasítás előtt, lefagyásra (freeze) kényszeríti a processzort. A lefagyott processzor egy külső megszakításra vár, amelyet a külső hardware kell szolgáltasson, válaszként a 486-os,
258
Védett üzemmódú kivételek és megszakítások
vagy Pentium processzor FERR# vonalán kimenő jelre ( a FERR# hasonlít az 387-es numerikus koprocesszor ERROR# vonalára). Az NE értékétől függetlenül, egy maszkolatlan numerikus kivétel aktiválja a 486-os és a Pentium processzorok FERR# vonalát. Ebben az esetben a külső megszakítás hívja meg a kivételkezelő rutint. Ha de az IGNE# bemenet aktív, a processzor figyelmen kívül hagyja a kivételt, és folytatja feladatát. A külső megszakítások általi hibajelentés a DOS-al való kompatibilitás érdekében támogatott. A numerikus hibák kezelésekor a processzornak két feladata van: • Amikor egy hibát (error) észlel, nem szabad megsértenie a numerikus
kontextust. • Törölnie kell a hibát, és meg kell kísérelnie a hiba helyreállítását
(recovery). Bár az eljárás, amellyel a programozók ezen feladatokat elláthatják, alkalmazásonként változik, mégis a kivételkezelők többsége magába foglalja a következő lépéseket: • Az FPU környezetének (vezérlő-, állapot-, és toldalék szók,
operandus- és utasítás mutatók) elmentése úgy, ahogyan az a kivétel pillanatában volt.
• Az állapotszó kivételt jelző bitjeinek törlése. • Az INTR, NMI, vagy SMI által letiltott megszakítások engedélyezése. • A kivétel identifikálása, az elmentett környezetbeli állapot-, és
vezérlőszó vizsgálata segítségével. • Néhány rendszer-függő művelet elvégzése, a kivétel helyreállítása
(rectify) érdekében. • Visszatérés a megszakított programba, és a normális vezérlés
folytatása.
259
Általános CPU programozási információk
3.9.9.15.1. Numerikus kivételek kezelése A numerikus kivételeket kezelő rutinoknak számos formája létezhet. Ezek megváloztathatják az FPU aritmetikai és programozási szabályait. Ezek a módosítások újradefiniálhatják egy hiba (error) alapértelmezés szerinti kijavításának módját, megváltoztathatják az FPU megjelenését a programozók számára, vagy módosíthatják az FPU aritmetikai szabályainak definícióját. kivételekre adott válaszok módosításának egyike az volna, hogy a denormális aritmetika a memóriából betöltött denormálisokon legyen elvégezve. Egy megjelenésbeli változást a regiszterveremnek a memóriába való kiterjesztése jelentené, "végtelen" számú numerikus regiszter biztosításának érdekében. Az FPU aritmetikája átváltoztatható arra, hogy automatikusan kiterjessze a változók pontosságát és a tartományát, amikor ez túlhaladódik. Néhány lehetséges, alkalmazás-függő lehetőség: • Egy kivétel számláló inkrementálása, a későbbi kijelzés, vagy
kinyomtatás végett. • Diagnosztika-információk kinyomtatása, vagy kijelzése (például az
FPU környezete és regiszterei). • A további végrehajtás abortolása. • Egy diagnosztika érték (egy NaN) elmentése az eredményben, majd a
számítások folytatása. Fontos, hogy egy kivétel, az alkalmazástól függően, nem jelent minden esetben hibát (error). Amint a kivételkezelő kijavítja a kivételt előidéző feltételt, a kivételt okozó lebegőpontos utasítás újraindítható, ha ez megfelelő. Ugyanakkor, az IRET utasítást használva ez nem lehetséges, mert a trap a "vétkes" ESC utasítást követő ESC vagy WAIT utasításnál jelenik csak meg. A kivételkezelő meg kell szerezze a "vétkes" utasítás címét azon taszk belsejében, amely kezdeményezte azt, másolatot kell készítenie róla, a másolatot végre kell hajtania a "vétkes" taszk
260
Védett üzemmódú kivételek és megszakítások
kontextusában, majd egy IRET utasítással vissza kell térjen az aktuális utasításláncba. A numerikus kivételt okozó feltétel kijavítása érdekében, a kivételkezelő fel kell ismerje pontosan az FPU azon állapotát, amelyben a kivételkezelő meghívásának pillanatában volt, majd képes kell legyen az FPU arra az állapotára visszakövetkeztetni, amely a kivétel kezdetén volt aktuális. Az FPU állapotának visszafejtéséhez a programozóknak tudniuk kell, hogy a különböző osztályú kivételek eltérő pillanatokban lesznek felismerve, a numerikus utasítás végrehajtása előtt, vagy azt követően. Az érvénytelen művelet, zéróval való osztás és denormális operandus kivételek egy művelet megkezdése előtt lesznek detektálva, míg a túlcsordulás, alulcsordulás, és a pontosság kivételek addig nem jelennek meg, amíg egy valódi eredmény nincs kiszámítva. Ha egy műveletkezdés előtti kivétel detektálódik, az FPU regiszterverme és memóriatára még nincs felújítva, és úgy tűnik, mintha a "vétkező" utasítás még nem lett volna végrehajtva. Amikor egy műveletkezdés utáni kivétel detektálódik, a regiszterverem és memória úgy néznek ki, mintha az utasítás befejeződött volna, tehát fölújíthatók. Ugyanakkor, egy store, vagy store-andpop típusú műveletben, a maszkolatlan túl/alulcsordulás műveletkezdés előtti kivételként van kezelve, a memória nem lesz felfrissítve, és a veremből semmi sem lesz kiemelve. 3.9.9.15.2. Szimultán kivételekre adott válaszok Az olyan estekben, amelyekben szimultán, többszörös kivételek keletkeznek, az FPU az alábbiakban következő elsőbbségi-lista alapján jelzi az egyik kivételt. Ez annyit jelent, hogy például egy SNaN zéróval való osztása "érvénytelen műveletet" eredményez, és nem "nullával való osztási hibát" ; a maszkolt eredmény a QNaN valódi végtelen (real infinite), és nem a végtelen ∞ . Egy denormális, vagy pontosság kivétel ugyanakkor, kísérhet egy numerikus alulcsordulást, vagy túlcsordulást. A numerikus kivételek közti sorrend a következő:
261
Általános CPU programozási információk
1. Érvénytelen művelet kivétel, a következőképpen tovább osztva:
• verem alulcsordulás • verem túlcsordulás • nem támogatott formátumú operandus • SNaN operandus
2. QNaN operandus. Bár ez nem egy kivétel, ha egy operandus egy
QNaN, kezelése előnyt élvez az alacsonyabb prioritású kivételek előtt. 3. Bármely, fentebb nem említett kivétel, vagy nullával való osztás. 4. Denormális operandus. Ha le van maszkolva, a művelet végrehajtása
folytatódik, és ugyanakkor egy alacsonyabb prioritású kivétel is megjelenhet.
5. Numerikus alulcsordulás, vagy túlcsordulás. A pontatlan eredmény
(pontosság) flag is bejelölhető. 6. Pontatlan eredmény (pontosság-) kivétel. 3.9.9.16. 17-es számú megszakítás - Illeszkedés ellenőrzés ellenőrzési hiba (Alignment Check) Az illeszkedés ellenőrzési hiba kivétel a nem illesztett (unalign) operandusokhoz való hozzáférés esetén generálódhat. Például, egy páratlan Byte-címen tárolt szó, vagy egy duplaszónak egy olyan címen való tárolása, amelyik nem négynek többszöröse. A 3.74. ábra az adattípusok által igényelt illeszkedési feltételeket sorolja fel. Az illeszkedés ellenőrzés engedélyezéséhez a következő feltételek teljesítése szükséges: • a CR0 regiszterbeli AM bit magasra legyen állítva • az AC flag magasra legyen állítva • a CPL értéke 3 legyen (felhasználói mód)
262
Védett üzemmódú kivételek és megszakítások
Adat típus A címnek oszthatónak kell lennie: WORD 2 DWORD 4 rövid REAL 4 hosszú REAL 8 TEMPREAL 8 Szelektor 2 48 bites szegmentált mutató 4 32 bites lap mutató 4 32 bites szegmentált mutató 2 48 bites pszeudo deszkriptor 4 FSTENV/FLDENV mentési terület
2 vagy 4, az operandusmérettől függően.
FSAVE/FSTOR mentési terület 2 vagy 4, az operandusmérettől függően.
Bit sztring 4
3.74. ábra: Adattípusok által igényelt illeszkedési feltételek Az illeszkedés ellenőrzés azon programok számára hasznos, amelyek a mutatók alsó két bitjét használják az általuk megcímzett adatstruktúra típusának azonosítására. Például, egy matematikai könyvtár szubrutinja elfogadhat numerikus adatstruktúrákra mutató pointereket. Ha e struktúra típusához az '10' (bináris) kódot társítjuk az erre a típusra mutató pointer legalsó két bitjén, a matematikai szubrutinok kijavíthatják a típuskódot -10 (bináris) eltolás hozzáadásával. Abban az esetben, ha a szubrutin helytelen mutatótípust kapna, egy illesztetlen (unaligned) hivatkozás jönne létre, amely kivételt generálna. Az illeszkedés ellenőrzés hiba kivételek csak felhasználói módban (3. privilégium szinten) generálódnak. Azok a memóriahivatkozások, amelyek alapértelmezése a 0. privilégium szint, mint például a szegmens-deszkriptorok betöltése, nem okozzák a fentemlített kivételt még abban az esetben sem, ha ezt egy felhasználói módbeli memóriahivatkozás okozná. Egy 48 bites pszeudo-deszkriptor (egy deszkriptor-táblázat bázisregiszter-tartalmának memóriabeli másolata) tárolása felhasználói módban, illeszkedés ellenőrzés hiba kivételt generálhat. Bár a felhasználói
263
Általános CPU programozási információk
programok normális esetben nemigen tárolnak pszeudo-deszkriptorokat, a hiba mégis elkerülhető, a pszeudo-deszkriptornak egy páratlan szó címre való illesztésével (tehát egy olyan címre, amelynek 4-el való osztási maradéka 2). Az FSAVE és FRSTOR utasítások illesztetlen referenciákat (hozzáféréseket) állítanak elő, amelyek illeszkedésellenőrzés-hiba kivételeket okozhatnak. Ezekre az utasításokra a felhasználói programoknak ritkán van szükségük. 3.9.9.17. 18-as számú megszakítás - Processzortípus ellenőrzés (Machine Check) A processzortípus ellenőrzés modell-specifikus kivétel, amely csak a Pentium processzorokon létezik. 3.9.10. A kivételek összefoglalása A 3.75.ábra összefoglalja a Pentium processzor által felismert kivételeket.
Meghatározás Vektor szám
Visszatérési cím a hibára
mutat?
Kivétel típus
A kivétel forrása
Osztás nullával 0 Igen Hiba DIV és IDIV művelet
Debug kivétel 1 *1 *1 Akármilyen kód vagy adat hivatkozás
Töréspont 3 Nem Trap INT 3 művelet Túlcsordulás 4 Nem Trap INTO művelet Határsértés 5 Igen Hiba BOUND
művelet Érvénytelen op. kód
6 Igen Hiba Fenntartott műveleti kódok
264
Védett üzemmódú kivételek és megszakítások
Eszköz nem elérhető
7 Igen Hiba ESC és WAIT művelet
Dupla hiba 8 Igen Abort Bármi Érvénytelen TSS 10 Igen2 Hiba JMP, CALL,
IRET művelet, megszakítások és kivételek
Szegmens nincs jelen
11 Igen2 Hiba Akármilyen művelet ami szegmenst vált
Verem hiba 12 Igen Hiba Verem művelet Általános védelmi hiba
13 Igen Hiba/ trap3
Akármilyen kód vagy adat hivatkozás
Laphiba 14 Igen Hiba Akármilyen kód vagy adat hivatkozás
FPU hiba 16 Igen Hiba4 ESC és WAIT művelet
Illeszkedés ellenőrzés
17 Igen Hiba Akármilyen adat hivatkozás
Géptípus ellenőrzés
18 - Modellfüggő
Software megszakítás
0-255 Nem Trap INT n művelet
3.75. ábra: Kivételek összefoglalása
Megjegyzések: 1. A nyomkövető kivételek trap-ek, vagy hibák lehetnek. Ez a kivétel a
DR6 regiszter tartalmát vizsgálja meg ahhoz, hogy megkülönböztesse a trap-eket a hibáktól.
2. A taszkkapcsolások közbeni újraindíthatóság feltételhez kötött.
265
Általános CPU programozási információk
3. Minden általános védelmi hiba újraindítható. Ha a hiba a kivételkezelő meghívására tett kísérlet közben jelentkezik, a megszakított program újraindítható, de a megszakítás maga elveszhet.
4. A lebegőpontos hibák nem lesznek jelentve, csak a hibát generáló
ESC utasítást követő első ESC vagy WAIT utasítás beérkezésekor. 3.9.11. Hibakódok összefoglalása A 3.75. ábra összesíti minden egyes kivételt követő hiba információt.
Meghatározás Vektor szám Hibakód van ? Osztási hiba 0 Nincs Debug kivétel 1 Nincs Töréspont 3 Nincs Túlcsordulás 4 Nincs Határellenörzés 5 Nincs Érvénytelen op. kód 6 Nincs Eszköz nem elérhető 7 Nincs Dupla hiba 8 Van, mindíg nulla Érvénytelen TSS 10 Van Szegmens nincs jelen 11 Van Verem hiba 12 Van Ált. védelmi hiba 13 Van Laphiba 14 Van, spec. formátum FPU hiba 16 Nincs Illeszkedés ellenőrzés
17 Van, mindíg nulla
Modell ellenőrzés 18 Modellfüggő Software megszakítás
0-255 Nincs
3.75. ábra: Hibakódok összefoglalása
266
Rendszermenedzselő üzemmód
3.10. Rendszermenedzselő üzemmód A rendszermenedzselő üzemmód (SMM - System Management Mode) segíti a rendszerfejlesztőket az olyan rendkívül magas szintű rendszerfunkciók kialakításában, mint a fogyasztásmenedzsment vagy a biztonság, nemcsak az alkalmazói software, hanem maga az operációs rendszer számára is átlátszó módon. Az SMM a védett, valós, és 8086-os virtuális módokkal egyszinten levő, egyik fő üzemmód. Az SMM azonban úgy volt tervezve, hogy az alkalmazói software-ek és általános célú operációs rendszersoftware-ek nem, csak a firmware tudja használni. A 3.76. ábra azt mutatja be, hogy más üzemmódokból a processzor hogyan léphet be az SMM üzemmódba, illetve hogyan léphet ki abból. A külső SMI# jel a processzort arra kényszeríti, hogy az átkapcsoljon az SMM üzemmódba. Az SMM üzemmódból az RSM utasítással lehet kilépni. Az SMI# jel aktiválását egy hordozható számítógép esetében például a gép fedelének lecsukása okozhatja. Az SMM átlátszó az alkalmazói programok és az operációs rendszer számára, mivel: • Az SMM üzemmódba való belépés egyetlen útja egy külső jel által
kiváltott, nem maszkolható megszakítás. • A processzor egy különálló címtartományban levő SMM kód
végrehajtását kezdi meg, mely címtartomány neve rendszer-menedzsment-RAM (SMRAM).
• Az SMM üzemmódba való belépéskor a processzor a megszakított
program regiszter-állapotát az SMRAM-nak egy SMM állapottároló rekord nevezetű részébe menti.
• A normális esetben az operációs rendszer vagy az alkalmazások által
kezelt minden megszakítás az SMM üzemmódba való belépéskor letiltódik.
267
Általános CPU programozási információk
• Egy speciális RSM utasítás az SMM állapot-rekordból viszszaállítja a processzor regisztereinek állapotát és a vezérlést visszaadja a megszakított programnak.
Az SMM abban hasonlít hasonlít a valós üzemmódhoz, hogy nincsenek privilégiumszintjei és nem végez címleképzést. Egy SMM program végrehajthat I/O és más rendszerutasításokat, és négy GByte- memóriát címezhet. 3.10.1. Az SMI megszakítás Amikor egy utasításhatáron az SMI# jelet felismeri, a processzor előbb kivárja, hogy minden tárolási művelet befejeződjön (a külsőleg függőben levőket is ide értve). Ezután elmenti a regiszterek állapotát az SMRAM-ba és megkezdi az SMM kezelő végrehajtását. Az SMI#-nek a debug kivételek és külső megszakításoknál nagyobb prioritása van. Ez azt jelenti, hogy ha az utasításhatáron e kivételek közül több mint egy jelenik meg, akkor csak az SMI lesz kiszolgálva, a debug kivétel vagy külső megszakítás nem. Az újabb SMI# vagy NMI kéréseket az SMM-ben levő processzor már nem veszi figyelembe. A CR4 regiszter gépellenőrzést engedélyező bitje szintén törlődik. Az SMM-ban megjelenő SMI# és NMI megszakítások betöltődnek ugyan, de csak akkor hajtódnak végre, amikor a processzor az RSM utasítás által kilép az SMM-ból.
268
Rendszermenedzselő üzemmód
RESET
RESET
Valós címzési mód
PE=1PE=0
Megszakítás,kivétel
Taszkváltás,IRET
SMI
RSM
SMI
RSM
SMI
RSM
Védett mód
Virtuális 8086 mód
Rendszer menedzselőmód
3.76. ábra: Az üzemmód-állapotok közti átmenetek Az SMM-ba való belépéskor a kezelőket igénylő külső megszakítások letiltódnak (az EFLAGS regiszter IF bitje törlődik). Erre azért van szükség, mert az SMM-ban levő processzor egy külön címtartományt használ. Emiatt a megszakítás deszkriptor-táblázatban (IDT) tárolt vektorok nem alkalmazhatóak. A kivételek engedélyezéséhez az SMM program új megszakítás/kivétel vektorokat kell felépítsen. Az SMM megszakításvektor-táblázatának formátuma megegyezik a valós üzemmódban használtéval. Amíg a megszakításvektor-táblázatot helyesen fel nem építi, addig az SMM kezelőprogram nem generálhat kivételeket. Kivételek azonban még letiltott megszakítások esetén is keletkezhetnek. A belső megszakítások megjelenését csak a helyesen megírt software előzheti meg. Az új kivételvektorok beállítása után a belső kivételek kiszolgálhatók.
269
Általános CPU programozási információk
Ugyancsak az SMM-be való belépéskor az lépésenkénti végrehajtás (az EFLAGS TF bitjének értéke nulla) és címtöréspont (a DR7 törölve van) kivételek is törlődnek. A processzor debug-lehetőségeinek maga az SMM-ben való hibakeresésre felhasználása érdekében az SMM kezelőnek előbb biztosítania kell, hogy az IDT-be egy megfelelő, elérhető kezelő legyen installálva, majd a debug regiszterekbe illetve az EFLAGS-be be kell töltenie a megfelelő értékeket. 3.10.2. Az SMM kezdeti állapota Miután a processzor felismerte az SMI# jelet és elmentette a regiszterek állapotait, saját állapotát a 3.77. ábrán bemutatott értékekre változtatja.
Regiszter Tartalom EFLAG 2 EIP 8000h CS szelektor 3000h, ez az érték a 30000h báziscím
inicializáló utasítását adja DS, ES, FS, GS, SS szelektorok
0
DS, ES, FS, GS, SS határ
0FFFFFFFFh
DS, ES, FS, GS, SS jellemzők
16 bites, felfelé növekvő
CR0 0, 2, 3 és 31. bitek törölve (PE, EM, TS, PG) CR4 0 CR6 Nem definiált CR7 400h GDTR, LDTR, IDTR, TSSR
Nem definiált
Modell specifikus regiszter
Nincs módosítva
3.77 ábra: Az SMM kezdeti állapota
270
Rendszermenedzselő üzemmód
Az adatcache-ek kiürítéséért, az adat- valamint utasításcache-ek érvénytelenítéséért és ezeknek az SMM alatti letiltásáért a külső hardware felel. 3.10.2.1. Az SMM végrehajtása Az SMM kezelő végrehajtását a processzor a CS szegmens 8000H ofszetjétől kezdi. A kódszegmens báziscíme kezdetben 30000H, ez a cím azonban megváltoztatható. Az SMM kezelőjének meghívásakor a processzor CR0 regiszterének PE (védelem) és PG (lapozás) bitjei törlődnek, így a processzor a valós üzemmódhoz hasonló környezetbe kerül. Mivel a (CS-től különböző) szegmens-bázis törlődik és a szegmenshatárok 0FFFFFFFFH értékűre állítódnak, a címtartomány egyetlen lapos, nem szegmentált, 4GB-os lineáris tartományként kezelhető, a processzor azonban a címeket a valós üzemmódban használttal megegyező módon generálja. Amikor a szegmensszelektorba egy 16 bites érték töltődik, az érték 4 bittel balra tolódik és betöltődik a szegmens-bázisba. Az SMM-ben egy szegmensregiszter betöltése során a deszkriptor regiszterek rejtett részeiben a határ mező és az attribútumok nem módosulnak. Az operandusméret és címméret alapértelmezése 16 bit, a 4 GByte-os logikai címtartományban bárhol, az adatok közvetlen elérésére használhatók az operandusméret- és címméret-fölülíró prefixek. Az operandusméret-fölülíró prefixekkel együtt az SMM kezelő a vezérlésnek a négy GByte-os címtartomány bármelyik pontjára való átadására használhat ugrásokat, hívásokat és visszatéréseket. Megjegyzendők azonban a következő korlátozások: • Bármely vezérlésátadás, melynek nincs operandusméret-fölülíró
prefixe, az EIP regisztert annak alsó 16 bitjére csonkítja. • A valós üzemmódban használthoz hasonló báziscím-képzés miatt a
hosszú ugrások, hívások, megszakítások vagy kivételek a vezérlést
271
Általános CPU programozási információk
nem adhatják át egy 20 bitesnél nagyobb méretű (azaz egy MByte-nál nagyobb) báziscímű szegmensre.
• Egy kivétel vagy megszakítás nem adhatja át a vezérlést egy 16
bitesnél (64 kByte-nál) nagyobb méretű szegmensre. • Ha a kivételek és megszakítások engedélyezve vannak, akkor a
visszatérési címeknek csak az alsó 16 Byte-ja kerül a veremre. Ha a megszakított procedúra ofszetje nagyobb, mint 64 kByte, akkor a megszakításkezelő, a vermen levő visszatérési címnek a software általi bizonyos módosítása nélkül, nem tudja visszaadni a vezérlést az illető procedúrának.
3.10.3. Az SMRAM processzor-állapot tároló formátuma Az SMRAM terület állapottároló rekordjának szerkezetét a 3.78 ábra mutatja be. A regiszterek fizikai helye ahhoz a CS-bázisba töltött értékhez képest relatívak, mely kezdetben 30000H, de megváltoztatható. A regiszterek abszolút helye: (CSbázis + RegiszterOfszet). Az FFA8H-FFFFH ofszeteken levő mezők az SMM# megszakítás pillanatában a processzor regiszter-állapotát tárolják. A fennmaradó biteket a következő részek mutatják be.
Regiszter ofszet Regiszter 0FFFC CR0 0FFF8 CR3 0FFF4 EFLAG 0FFF0 EIP 0FFEC EDI 0FFE8 ESI 0FFE4 EBP 0FFE0 ESP 0FFDC EBX 0FFD8 EDX 0FFD4 ECX
272
Rendszermenedzselő üzemmód
0FFD0 EAX 0FFCC DR6 0FFC8 DR7 0FFC4 TR* 0FFC0 LDTR* 0FFBC GS* 0FFB8 FS* 0FFB4 DS* 0FFB0 SS* 0FFAC CS* 0FFA8 ES 0FFA7-0FF04 Fenntartva 0FF02 Leállás automatikus
újraindítása 0FF00 I/O trap újraindítása 0FEFC SMM reviziószám 0FEF8 Állapot tároló bázisa 0FEF7-0FE00 Fenntartva
3.78. ábra: Az állapottároló formátuma
Megjegyzések: • A FENNTARTOTT-ként bejelölt területeket az SMM kezelő nem
használhatja. E területekre való írás a processzor hibás működését eredményezheti. Az a software, amelyik ezeknek a területeknek a tartalmára alapoz, az elkövetkező processzor generációkkal inkompatibilis lehet.
• * A felső 2 Byte FENNTARTOTT. A 3.78. ábrán megnevezett regiszterek láthatók, tehát az SMM kezelő kiolvashatja értéküket az állapottároló rekordból. Ezek közül az adattételek közül az SMM egyeseket megváltoztathat és a megváltozott értékük a processzor regisztereibe az RSM utasítással tölthető be. A 3.79. ábra bemutatja, hogy mely adattételek változtathatók meg, és melyek nem. A táblázat még azt is megmutatja, hogy egyes regiszterértékek az
273
Általános CPU programozási információk
állapottárolóba mentődnek, azonban nem láthatók. E tételek a fenntartott részeken tárolódnak, de helyük és formátumuk különböző processzor-verziók esetén más és más. A 3.79. ábra utolsó sora azokat a regisztereket mutatja, melyeket az SMI# és RSM nem tárol illetve állít vissza automatikusan. Ha az SMM kezelő megváltoztatja ezeket a regisztereket, akkor implicit módon el is kell tárolja, illetve vissza is kell állítsa őket.
Állapot adat Mentett és visszatöltött?
Olvasható? Írható?
EDI, ESI, ESP, EBX, EDX, ECS, EAX, EFLAG, EIP
Igen Igen Igen
CR0, CR3, DR6, DR7, TR, LDTR, GS, FS, DS, SS, CS, ES
Igen Igen Nem
CR1, CR2, CR4, A GDT láthatatlan deskriptor regiszterei, LDT, IDT, CS, DS, ES, FS, GS
Igen Nem Nem
DR0-DR7, FP regiszterek STn, FCS, FSW, címző szó, FP utasítás mutató, FP op. kód és operandus mutató
Nem Nem Nem
3.79. ábra: Állapot-beosztás
3.10.3.1. Az SMM revízió-azonosító (FEFCH ofszet) A 32 bites SMM revízió-azonosító megadja az SMM verziószámát és a processzor által nyújtott lehetőségeket. 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 68 7 5 4 3 2 1 0
SMM revizió szintFenntartva, értéke 0
I/O trap kiterjesztésSMM bázis relokáció
3.80. ábra: SMM revízió-azonosító
274
Rendszermenedzselő üzemmód
Az SMM revízió-azonosító mezőit a 3.81. ábra mutatja. Az 1-re állított 16. vagy 17. bitek azt mutatják, hogy a processzoron az illető lehetőségek implementálva vannak.
Bitek Megjegyzés 0-15 Alap SMM verzió azonosító 16 A processzor támogatja az I/O trap újraindítást 17 A processzor támogatja az SRAM áthelyezését
3.81. ábra: SMM revízió-azonosító táblázat
Megjegyzés: Minden más bit fenntartott. 3.10.3.2. I/O trap-újraindítás (FF00H ofszet) Az I/O trap-újraindító slot lehetővé teszi az SMM számára, hogy az az RSM utasítást egy megszakított I/O utasítás automatikus újra történő végrehajtására bírja. Ha az RSM utasítás végrehajtásakor az I/O trap-újraindító slot az FFH értéket tartalmazza, akkor a processzor az SMI# által megszakított I/O utasítást automatikusan újra végrehajtja. Ha az RSM utasítás végrehajtásakor az I/O trap-újraindító slot a 00H értéket tartalmazza, akkor a processzor az SMI# által akkor a processzor nem hajtja végre újra az I/O utasítást. Az I/O trap-újraindító slot-ot az SMI# feldolgozásakor a processzor automatikusan nullával inicializálja. Az SMM kezelő csak akkor kell az I/O trap-újraindító slotot a 0FFH értékre állítsa, amikor az SMI# egy I/O utasításhatáron szakad meg egy trap által. Ha az RSM utasítás végrehajtásakor a processzor az I/O trap-újraindító slotban a 0FFH értéket találja, de a megszakított utasítás nem egy I/O utasítás, akkor a művelet eredménye kiszámíthatatlan.
275
Általános CPU programozási információk
3.10.3.3. Felfüggesztett állapotból való automatikus újraindítás (FF02H ofszet) Ha felfüggesztett állapotában a processzor felismeri az SMI#-t, akkor a processzor a felfüggesztett állapotból való automatikus újraindítás Byte-ját 1-re állítja, egyébként törli azt. Ha ez a mező 1, akkor az SMM kezelő megváltoztathatja értékét annak érdekében, hogy ellenőrizze a processzornak a kezelőből az RSM utasítással való, a HLT utasítást folytató visszatérését. A lehetőségeket a 3.82. ábra mutatja. Érték a belépésnél Érték a kilépésanél CPU működés a kilépésnél
0 0 Visszatér a megszakított program következő utasítására
0 1 Kiszámíthatatlan 1 0 Visszatér a HLT utáni
utasításra 1 1 Visszatés a megszakított HLT
utasításra
3.82. ábra: Felfüggesztett állapotból való automatikus újraindítás 3.10.3.4. Az állapottároló bázisa (FEF8H ofszet) A processzornak egy olyan láthatatlan belső regisztere van, amelyik megadja az állapottároló rekord és az SMM kezelő első utasításának fizikai báziscímét. Az SMRAM relokációját támogató processzorok (a Pentium is ilyen) e regiszter tartalmát az SMI# jel feldolgozása alatt az állapottároló-bázisba mentik. Az RSM utasítás végrehajtásakor a Pentium processzor viszszatölti belső regisztereinek tartalmát az állapottároló-bázisból. Így lehetővé válik e regiszter tartalmának megváltoztatása. Az állapottároló-bázis és a processzor belső, fenntartott regiszterében tárolt kezdeti érték 030000H.
276
Rendszermenedzselő üzemmód
Ez a már meglévő SMM rendszerekkel való kompatibilitás érdekében van így, melyeknél az alapértelmezésben szereplő SMRAM terület minimálisan a 38000H címnél kezdődő 32 kByte-nyi részként van definiálva. Most, hogy az SMRAM helye változó lehet, az SMRAM terület egy minimálisan 32 kByte méretű, az [8000H + SCbázis] címen kezdődő területként van definiálva. 3.10.4. Az SMRAM relokációja Az SMM revízió-azonosító megadja, hogy a processzor támogatja az SMRAM relokációját vagy sem. Az SMRAM nem cache-elhető címekre való relokálása megelőzheti azt, hogy az SMI# feldolgozása megzavarja a cache tartalmát. Az SMRAM-relokáció megvalósítása az SMRAM állapot-tárolójának egy lokációja és egy láthatatlan belső regiszter felhasználásával történik. A 4 Byte-os állapottároló-bázis a processzor által az SMM-be való belépéskor felhasznált láthatatlan belső regiszternek felel meg. Az SMM állapottároló és az SMM kezelő első utasításának helyét határozza meg. Egy SMI# kiszolgálásakor a processzor láthatatlan belső regiszterének tartalma az állapottároló-bázis mezőben lesz tárolva. Egy RSM utasítás végrehajtásakor a processzor a láthatatlan regisztert az állapottároló-bázisból tölti fel. Az SMM kezelő megváltoztathatja az állapottároló-bázis mező értékét az állapottároló rekordban. Ezután, amikor újabb SMI#-k generálódnak, az SMM állapottároló és a kódszegmens-bázisok számára generált lokációk számára a processzor az új értéket használja. Megjegyzendő, hogy az INIT vonal aktiválása a belső állapottároló-bázisregiszter tartalmát nem változtatja meg. Ugyancsak megjegyzendő, hogy amikor a processzor az új állapottároló-bázist feltölti, a változtatás nincs hatással a CS szelektorra.
277
Általános CPU programozási információk
3.10.5. Visszatérés az SMM-ből Az RSM utasítás kilép az SMM-ből és visszaadja a vezérlést a megszakított programnak. Az RSM utasítás csak az SMM-ben hajtható végre. Végrehajtására az SMM-en kívül tett kísérlet érvénytelen-opkód kivételt okoz. Az RSM utasítás végrehajtásakor a processzor előzőleg (az SMM-be való belépéskor) elmentett állapota visszaállítódik és a vezérlés visszakerül a megszakított programra. Ha a processzor egy érvénytelen állapot-információt detektál, akkor a lekapcsolt állapotba vált át. Ez csak a következő esetekben történhet meg: • Az állapottároló bázis mezőben tárolt érték nem egy 32 kByte-hoz
illesztett cím. • A CR4 regiszter egyik fenntartott bitjének értéke 1. • A CR0 valamelyik bitkombinációja illegális, pontosabban (PG=1 és
PE=0) vagy (NW=1 és CD=0). Lekapcsolt állapotban a processzor egy NMI megszakítás megjelenéséig vagy a reszetelésig megszakítja az utasítások végrehajtását. Hogy a lekapcsolt állapotba való belépését jelezze, a processzor egy speciális buszciklust generál. Ha az SMM kezelő a rendszernek olyan állapotát változtatta meg, amelyet az RSM nem állít vissza (ilyenek például a lebegőpontos regiszterek), akkor azt az állapotot még az RSM végrehajtása előtt vissza kell állítsa.
278
8086-os virtuális üzemmód
3.11. 8086-os virtuális üzemmód A Pentium processzor támogatja egy vagy több 8086 vagy 8088 program védett módú környezetben való végrehajtását. Ebben a környezetben egy 8086 program egy 8086-os virtuális taszk részeként fut. A 8086-os virtuális üzemmód kihasználja a védett mód által a multitaszking számára nyújtott támogatást. A 8086-os programokat futtató 8086-os virtuális taszkokból nemcsak hogy több is lehet, hanem ezek a Pentium processzor más taszkjaival is multitaszkolhatók. A 8086-os virtuális taszkok célja az, hogy a 8086 proceszszorra írt program számára egy "virtuális gép"-et emuláljanak. Egy teljes virtuális gép hardware-ből és rendszersoftware-ből áll. A 8086 processzor emulációját a software által felhasznált hardware valósítja meg, a következőképpen: • A hardware egy virtuális regiszterkészletet (a TSS-en keresztül),
virtuális memóriát (a taszk lineáris címtartományának első MByte-ját), és a megszakítások virtuális támogatását biztosítja, ezenkívül közvetlenül végrehajt minden olyan utasítást, mely az előbbiekben említett regisztereket és címtartományt használja.
• A software a virtuális gép külső interfészét (I/O, megszakítások és
kivételek) a tágabb környezettel (amelyben maga is fut) konzisztens módon vezérli. A software választhat azon lehetőségek között, hogy a I/O-t, a megszakításokat és a kivételkezelést maga emulálja, vagy ezeknek a software közbelépése nélküli végrehajtását a hardware-re bízza.
A 8086-os virtuális gépeket támogató software neve 8086-os virtuális felügyelőprogram. A Pentium processzor saját 8086-os virtuális működési módjának olyan kiterjesztéseit tartalmazza, melyek az alkalmazások teljesítményét azáltal növelik meg, hogy kiküszöbölik az egyes műveletek emulálása miatt keletkező, a felügyelőprogramnak jelentett hibákat. A virtuális mód kiterjesztéséről a Pentium processzoron több információ a függelékben található.
279
Általános CPU programozási információk
3.11.1. 8086 CPU kód végrehajtása A processzor akkor müködik 8086-os virtuális üzemmódban, ha az EFLAGS regiszter VM (virtual machine) bitje 1-re van állítva. E flaget a processzor két alkalommal teszteli: 1. Egy szegmensregiszter feltöltésekor annak kiderítése érdekében, hogy
szükség van-e a 8086 stílusú címátalakításra vagy sem. 2. Egy utasítás dekódolásakor, annak meghatározása érdekében, hogy
mely utasítások érzékenyek az IOPL-re és hogy mely utasításokat nem támogat (a valós üzemmódhoz hasonlóan).
3.11.1.1. Regiszterek és utasítások A 8086-os virtuális üzemmódban rendelkezésre álló regiszterkészlet magába foglalja a 8086 processzor összes regiszterét, valamint a 8086 processzor után bevezetett új regisztereket (FS és GS). Olyan utasítások állnak rendelkezésre, melyek közvetlenül a szegmensregiszterekkel dolgoznak. Az 10FFEFH feletti lineáris címek a V86 felügyelőprogram, az operációs rendszer, valamint a többi rendszersoftware rendelkezésére állnak. A felügyelőprogramnak is szüksége lehet adatszegmens-deszkriptorokra, mivel elemeznie kell a 8086 programnak a címtartomány első MByte-jában található megszakításvektor-táblázatát és más részeit. A 8086 operációs rendszer implementálására általában két választási lehetőség van: 1. A 8086 operációs rendszer a 8086 program részeként fut. Ez a
megközelítés a következő esetekben előnyös:
• A 8086 alkalmazás kódja megváltoztatja az operációs rendszert. • Nincs elég idő a a 8086 operációs rendszernek egy Pentium CPU
operációs rendszerként történő újraimplementálására.
280
8086-os virtuális üzemmód
2. A 8086 operációs rendszer a V86 felügyelőprogramban van
implementálva vagy emulálva. Ez a megközelítés a következő esetekben előnyös:
• Az operációs rendszer funkciói több 8086-os virtuális taszk között
könnyebben koordinálhatók. • A 8086 operációs rendszer funkciói Pentium CPU rendszerhívásokkal
könnyen emulálhatók. Megjegyzendő, hogy a 8086 processzor operációs rendszerének implementálására választott módnak különböző 8086 operációs rendszerek felhasználása esetén különböző 8086-os virtuális taszkjai lesznek. 3.11.2.1. Lapozás a 8086-os virtuális taszkok esetében Egyetlen 8086-os virtuális taszknak sincs szüksége lapozásra, a lapozás azonban hasznos vagy szükséges lehet a következő esetekben: • Több 8086-os virtuális taszk képzése. Minden egyes taszk a lineáris
címek alsó MByte-ját más és más fizikai címtartományra kell leképezze.
• Az 1 MByte-nál jelentkező címcsonkítás emulálása. A 8086 család
tagjai 1 MByte-nál nagyobb címet is megadhatnak. Például egy 0FFFFH értékű szelektor és egy 0FFFFH értékű ofszet által meghatározott tényleges cím értéke 10FFEFH (1 MByte plusz 65519 Byte). A 8086 processzor, mivel csak 20 bites címeket tud képezni, levágja a legmagasabb bitet, tehát 0FFFEH-ra csonkítja ezt a címet. A Pentium processzor az ilyen címeket nem csonkítja. Ha a 8086 programok valamelyike függ a címcsonkítástól, egy 8086-os virtuális taszkban ugyanez a hatás érhető el az 100000H és 110000H illetve a 0 és 100000H közti lineáris címeknek ugyanarra a fizikai címre történő leképezésével.
281
Általános CPU programozási információk
• A fizikai címtartománynál nagyobb lineáris címtartomány képzése. • Multitaszkingban futó több 8086 program számára közös 8086
operációs rendszer vagy ROM kód megosztása. • Csapda állítás a memóriába leképezett I/O eszközöknek, illetve ezek
átirányítása. 3.11.2.2. Védelem egy 8086-os virtuális taszkon belül Egy 8086 program szegmensei közt nem kötelező a védelem. A 8086-os virtuális taszkban futó rendszersoftware-nek a 8086 alkalmazói programmal szemben való védelmére a software-tervezők a következőket kell figyelembe vegyék: • Minden egyes taszk lineáris címtartományának első MByte-ját (plusz
64 kByte-ot) a 8086 processzorra írt program számára kell lefoglalni. Egy 8086 processzortaszk nem generálhat e tartományon kívül eső címeket.
• A virtuális gép felügyelőprogramjának és a minden egyes 8086-os
virtuális taszk címtartományában levő rendszersoftware védelmére az U/S bitet kell használni. Ha a processzor 8086-os virtuális üzemmódban van, akkor a CPL értéke 3 (legkevésbé privilegizált); ezért egy 8086 processzorra írt programnak csak felhasználói privilégiumai vannak. Ha a virtuális gép felügyelőprogramja lapjainak felügyelői privilégiumai vannak, akkor ezekhez a 8086 program nem férhet hozzá.
3.11.3. Belépés a 8086-os virtuális üzemmódba és az abból való kilépés A 3.83. ábra összefoglalja egy 8086 programba való belépés és az abból való kilépés módozatait. A 8086-os virtuális üzemmódba való belépés a VM flag 1-re állítása által történik. Ez kétféleképpen valósítható meg:
282
8086-os virtuális üzemmód
1. Egy taszkra való átkapcsolás az új TSS-ből betölti az EFLAGS
regiszter képét. Az új taszk TSS-e nem 16, hanem 32 bites kell legyen, mivel a 16 bites TSS nem tölti fel az EFLAGS felső, a VM flaget tartalmazó szavát. Az EFLAGS regiszter új tartalmában 1-re állított VM flag azt jelenti, hogy az új taszk 8086 utasításokat hajt végre, ezért a szegmensregiszterek TSS-ből való feltöltésekor a processzor 8086 stílusban alakítja ki a báziscímet.
2. Egy taszk procedúrájában található IRET utasítás feltölti az EFLAGS
regisztert a veremből. Az 1-re állított VM flag azt jelenti, hogy a procedúra, amelyre a vezérlés visszaadódik, egy 8086 procedúra. Az IRET utasítás végrehajtásakor a CPL értéke 0 kell legyen, ellenkező esetben a processzor nem változtatja meg a VM állapotát.
Belépés azinicializálásba
Taszkváltásvagy IRET
8086 program(V86 mód)
Megszakítás, kivétel
IRET
Taszkváltás
TaszkváltásEgyéb CPU taszk (védett mód)
V86 monitor(védett mód)
Taszkváltás
Taszkváltás
3.83. ábra: Belépés a 8086-os virtuális üzemmódba és az abból való
kilépés A 8086-os virtuális üzemmódba taszkátkapcsolással való belépés esetén a szegmensregiszterek a TSS-ből töltődnek fel, a VM flag beállítására egy IRET utasítást használva fel, a szegmensregiszterek a PL0 verem szegmensregisztereiből töltődnek fel (lásd a 3.84. ábrát).
283
Általános CPU programozási információk
Megszakítás vagy kivétel fellépte esetén a processzor kilép a 8086-os virtuális üzemmódból. Ilyenkor két eset lehetséges: 1. A megszakítás vagy kivétel egy taszkátkapcsolást okoz. Egy 8086-os
virtuális taszkról bármilyen más taszkra való átkapcsolás esetén az EFLAGS regiszter feltöltődik az új taszk TSS-éből. Ha az új TSS 32 bites és az EFLAGS új tartalmának VM flagje törölve van, vagy ha az új TSS 16 bites, akkor a processzor törli az EFLAGS regiszter VM flagjét, a védett módú címalakot felhasználva az új TSS-ből feltölti a szegmensregisztereket, és védett módban megkezdi az új taszk utasításának végrehajtását.
2. A megszakítás vagy kivétel egy 0. privilégiumszintű
(legprivilegizáltabb) procedúrát hív meg. A processzor tárolja az EFLAGS regiszter aktuális tartalmát, majd törli a VM flaget. A megszakítás- vagy kivételkezelő emiatt "natív" 32 bites védett-módú kódként fut. Ha a megszakítás vagy kivétel egy hasonló szegmensben vagy 0-tól különböző privilégiumszintű szegmensben levő procedúrát hív meg, akkor a processzor általános védelmi hibát generál, a hibakód annak a kódszegmensnek a szelektora, melyre a hívás vonatkozott.
Nem használt
Régi GS
Régi FS
Régi DS
Régi ES
Régi SS
Régi ESP
Régi EFLAG
Régi CS
Régi EIP Új ESP
ESP a TSS-ből Nem használt
Régi GS
Régi FS
Régi DS
Régi ES
Régi SS
Régi ESP
Régi EFLAG
Régi CS
Régi EIP
Új ESP
ESP a TSS-ből
Hibakód
HibakóddalHibakód nélkül
284
8086-os virtuális üzemmód
3.84. ábra: A 0. privilégiumszintű verem állapota 8086-os virtuális módban, a megszakítást követően
A rendszersoftware- nem változtatja meg közvetlenül a VM flag állapotát, ehelyett megváltoztatja a vermen vagy a TSS-ben tárolt EFLAGS képének egyes bitjeinek állapotát. Amikor az első 8086-os virtuális taszkot felépíti, a 8086-os virtuális felügyelőprogram az EFLAGS-nek a vermen vagy a TSS-ben levő képének VM bitjét 1-re állítja. A megszakítás- és kivételkezelők elemezhetik a vermen levő VM flag állapotát. Ha a megszakított procedúra 8086-os virtuális módban futott, akkor a kezelőnek esetleg szüksége lehet a 8086-os virtuális felügyelőprogram maghívására. 3.11.3.1. Taszkátkapcsolások általi tranzíciók Egy 8086-os virtuális taszkba illetve abból való átkapcsolásnak az oka a következő három közül az egyik: 1. Egy taszkkaput meghívó megszakítás. 2. A 32 bites operációs rendszer ütemezőjének egy akciója. 3. IRET utasítás végrehajtása 1-re állított NT flag esetén. Az előbbi esetek bármelyikében a processzor az új TSS-ben levő képnek megfelelően megváltoztatja az EFLAGS regiszter VM flagjének állapotát. Ha az új TSS 16 bites, akkor az EFLAGS regiszter felső szava nincs a TSS-ben, ebben az esetben a processzor törli a VM flaget. A processzor a VM flaget még azelőtt módosítja, hogy a szegmensregisztereket az új TSS-ből feltöltené. A VM flag új beállítása meghatározza azt, hogy a processzor az új szegmensregiszter-képeket 8086, 80286 vagy 32 bites szelektorokként értelmezi. 3.11.3.2. Átmenet trap- és megszakításkapukon keresztül A trap- és megszakításkapukat meghívó kivételek és megszakítások nyomán a processzor kiléphet a 8086-os virtuális
285
Általános CPU programozási információk
üzemmódból. A kivétel vagy megszakítás egy IRET utasítás végrehajtásával tér vissza a 8086 programba. A kivételek és megszakítások háromféleképpen kezelhetők: 1. A 8086-os virtuális felügyelőprogram által. 2. A 8086-os virtuális felügyelőprogram átadhatja a vezérlést a 8086
program saját megszakításkezelőjére. 3. Egy védett módú megszakításkiszolgáló rutin által. Ha a megszakítást vagy kivételt a felügyelőprogram kell kezelje és ha az EFLAGS vermen tárolt képében a VM flag 1-re van állítva, akkor a megszakításkezelő átadja a vezérlést a felügyelőprogramnak. A felügyelőprogram az első két módszer egyikét használja. Ha nincs szükség arra, hogy a megszakítást vagy kivételt a felügyelőprogram kezelje, akkor a 3-ra állítható IOPL lehetővé teszi, hogy minden virtuális módú megszakítást a védett módú megszakításrutin kezeljen. Mivel egy 8086 program a 8086 processzoron való futtatásra volt tervezve, ezért ennek egy 8086-os virtuális taszkban 8086 stílusú megszakításvektor-táblázata van, mely a 0 lineáris címen kezdődik. Ezért a felügyelőprogram közbelépését és a védett módba való átkapcsolást igénylő kivételek és megszakítások esetén a processzor ezt a táblázatot nem használja közvetlenül, ehelyett a kezelőket az IDT-n keresztül hívja meg. 8086-os virtuális módban egy megszakítás vagy kivétel számára az IDT bejegyzése vagy-vagy alapon a következőket kell tartalmazza: • Egy taszkkaput. • Egy 32 bites trapkaput (14-es deszkriptortípus) vagy egy 32 bites
megszakításkaput (15-es deszkriptortípus), mely egy nem megegyező, 0. privilégiumszintű (legprivilegizáltabb) kódszegmensre kell mutasson.
A 32 bites trap- vagy megszakításkapukat használó megszakítások és kivételek a 0. privilégiumszintet használják. A szegmensregiszterek
286
8086-os virtuális üzemmód
tartalma e privilégiumszint vermén lesznek tárolva. Egy 8086 programot futtató 8086-os virtuális taszk esetén a futás során bekövetkező kivétel vagy megszakítás után a verem állapotát a 3.84. ábra szemlélteti. Miután a processzor a 8086-os szegmensregisztereket elmenti a 0. privilégiumszint vermére, a kezelő procedúra futtatása előtt törli a szegmensregisztereket. Ez lehetővé teszi a megszakításkezelő számára, hogy az biztonságosan elmentse és visszaállítsa a DS, ES, FS és GS regiszterek tartalmát úgy, mintha azok a Pentium CPU szelektorai lennének. A rendes taszkok vagy 8086-os virtuális taszkok által meghívott megszakításkezelők a regiszterek elmentésére és visszaállítására bármely taszk esetén ugyanazt a kódrészt használhatják. E regisztereknek az IRET utasítás végrehajtása előtti törlése nem okoz trap-et a kivételkezelőben. A szegmensregiszterekben értékeket váró vagy visszaadni akaró megszakítás-kezelők a regisztereknek a 0. privilégiumszint vermére mentett képét kell használniuk. Az olyan megszakításkezelők, melyeknek tudniuk kell, hogy a megszakítás 8086-os virtuális módban lépett fel vagy sem, megvizsgálhatják az EFLAGS regiszter eltárolt tartalmának VM flagjét. Egy megszakítás vagy kivétel visszaküldése a 8086 programnak a következő lépésekből áll: 1. A 8086 megszakításvektor felhasználása a megfelelő kezelő
procedúra helyének megállapítására. 2. A 8086 program FLAGS, CS és IP értékeinek tárolása a 3.
(legkevésbé privilegizált) privilégiumszint vermén. 3. A visszatérési kapcsolat lecserélése a 0. privilégiumszint vermén úgy,
hogy az a 3. privilégiumszinten levő kezelő procedúrára mutasson. 4. A vezérlésnek a kezelőre való átadása, egy IRET utasítás
végrehajtásával. 5. Amikor a 3. privilégiumszinten levő kezelő IRET utasítása újból
meghívja a 8086-os virtuális felügyelőprogramot, a visszatérési kapcsolat visszaállítása a 0. privilégiumszint vermén úgy, hogy az az
287
Általános CPU programozási információk
288
eredeti, megszakított, 3. privilégiumszinten levő procedúrára mutasson.
6. A vezérlésnek a megszakított procedúrának való visszaadása, egy
IRET utasítás végrehajtásával. Ha az IOPL 3-ra van állítva és a megszakításkapu DPL-je szintén 3-ra, akkor az INT n utasítások a megadott vektorszámmal egy trap által megszakadnak. Az olyan megszakításvektorok, melyeknek IDT kapuja 3-ra van állítva, megvizsgálhatják az EFLAGS veremre mentett képének a VM bitjét annak megállapítása céljából, hogy a megszakítást vissza kell-e téríteni a felügyelőprogramhoz vagy át kell adni a 8086 program megszakításkezelőjének. 3.11.4. Érzékeny utasítások Amikor a Pentium processzor 8086-os virtuális üzemmódban működik, a CLI, STI, PUSHF, POPF, INT n, és IRET utasítások érzékenyek az IOPL-re. Az IOPL-re védett üzemmódban érzékeny IN, INS, OUT és OUTS utasítások a 8086-os virtuális üzemmódban nem érzékenyek. A 8086-os virtuális módban érzékeny utasítások teljes felsorolása a következő: CLI - Megszakítást engedélyező bit törlése STI - Megszakítást engedélyező bit 1-re állítása PUSHF - Flagek veremre helyezése POPF - Flagek leemelése a veremről INT n - Software-megszakítás IRET - Visszatérés megszakításból 8086-os virtuális módban való futás alatt a CPL értéke mindig 3. Ha az IOPL értéke kisebb mint 3, a fenti utasítások végrehajtására tett próbálkozás általános védelmi hibát okoz. Ezen utasítások az IOPL-re azért érzékenyek, hogy lehetőséget adhassanak a 8086-os virtuális felügyelőprogramnak arra, hogy az a hatásukat emulálhassa. Ezen utasítások működését akkor, amikor a virtuális mód kiterjesztése működésben van, a függelék tárgyalja.
8086-os virtuális üzemmód
289
3.11.5. Virtuális megszakítások támogatása Számos, nem multitaszking rendszerekre írt 8086 program a megszakítások vezérlése érdekében az IF flaget állítja. Multitaszking környezetben ez problémák forrása lehet. Emiatt a 386 és 486 processzorokon futó felügyelőprogramok a software-ből egy virtuális megszakításflaget állítnak. Az IF flaget állító minden utasítás a felügyelőprogramra adja át a vezérlést, az ezeken a processzorokon való emuláció céljából. A Pentium processzornak a virtuális megszakításflag-támogatásáról több információ a függelékben található. 3.11.6. A 8086 operációs rendszerhívások emulációja Számos 8086 operációs rendszerhívás a paramétereknek a veremre való helyezése, majd egy INT n utasítás végrehajtása által történik. Az INT n utasítás érzékeny az IOPL-re amiatt, hogy lehetővé tegye az, hogy a 8086-os virtuális felügyelőprogram emulálni tudja a 8086 operációs rendszer funkcióit, vagy a megszakítást visszaküldhesse a 8086 operációs rendszerhez. Ha az IOPL<3, az INT n utasításokat a felügyelőprogram fogja el. Ha IOPL=3, akkor a megszakításokat a védett módú megszakításkezelő rutin szolgálja ki, a 486 processzorral kompatibilis módon. A 386 és 486 processzorokon a 8086-os virtuális üzemmódban végrehajtott minden INT n utasítást a felügyelőprogram kell elfogjon, amikor az IOPL<3. A Pentium proceszszornak a megszakításkezelést támogató virtuális módú kiterjesztéséről információk a függelékben találhatók. A 3.85. ábra meghatározza, hogy a 8086-os virtuális módban az IOPL értékére alapozva a processzor milyen műveleteket fog végezni.
Általános CPU programozási információk
290
IOPL Processzor művelet
=3 Megszakítása a V86 módból a védett módba Törli a VM és a TF flaget Ha a szolgáltatás megszakítás kapun keresztül történik,
törli az IF flaget PL0 értékei lecserélődnek a TSS értékeire Elmenti a GS, FS, DS és ES regisztereket a PL0 veremre Nullára állítja a GS, FS, DS és ES regisztereket Elmenti megszakított taszk SS, EIP, EFLAG, CS és EIP
regisztereit a PL0 veremre Beállítja CS és EIP értékeit a megszakíitás kapu alapján
<3 Általános védelmi kivétel
3. 85. ábra: A software-megszakítás műveletei 3.11.7. Virtuális I/O Számos, nem multitaszking rendszerekre írt 8086 program az I/O portokhoz közvetlen módon fér hozzá. Multitaszking környezetben ez problémák forrása lehet. Ha ugyanahhoz a porthoz több mint egy program fér hozzá, ezek megzavarhatják egymást. Legtöbb multitaszking rendszer megköveteli azt, hogy az alkalmazói programok a portokat az operációs rendszeren keresztül érjék el. Ez egyszerűbb, központosított vezérlést eredményez. Az I/O védelmet a processzor olyan I/O-k létrehozásával valósítja meg, melyek kompatibilisek a környezettel és átlátszóak a 8086 programok számára. Az I/O portok védelmét a tervezők a következőkben felsorolt, különböző szempontok figyelembevételével valósíthatják meg: • Az I/O közvetlen végrehajtására tett minden egyes kísérlet esetén meg
kell védeni az I/O címtartományt és kivételeket kell generálni. • A 8086 programot hagyni kell, hogy az I/O-t közvetlenül végezze el.
8086-os virtuális üzemmód
291
• Bizonyos I/O portok elérésére tett kísérletek esetén kivételeket kell generálni.
• Bizonyos, a memóriába leképezett I/O portok elérésére tett kísérletek
esetén kivételeket kell generálni. Az I/O portokhoz való hozzáférést vezérlő módszer attól függ, hogy a hozzáférések I/O-ra vagy a memóriába vannak leképezve. 3.11.7.1. I/O-ra leképezett I/O A bizonyos I/O címek elérésére tett kísérletek esetén kivételek generálására az I/O engedélyező bittérkép használható. Minden egyes 8086-os virtuális taszk I/O engedélyező bittérképe meghatározza, hogy az adott taszk esetében mely I/O címek generálnak kivételeket. Mivel minden taszknak más és más I/O engedélyező bittérképe lehet, különböző taszkok esetében a kivételeket generáló I/O címek különbözhetnek. A védett módtól ez abban különbözik, hogy az IOPL-t senki nem vizsgálja meg. 3.11.7.2. Memóriába leképezett I/O A memóriába leképezett I/O-t használó rendszerekben a processzor lapozási lehetőségei felhasználhatók az I/O portokhoz való hozzáférési kísérletek esetén kivételek generálására. A 8086-os virtuális felügyelőprogram a memóriába leképezett I/O vezérlésére a lapozást a következőképpen használhatja: • Az I/O műveletek végrehajtását igénylő taszkok lineáris
címtartományának egy részét az I/O portok által használt fizikai címtartományra képezi le. Az I/O portokat (különböző lapokon) különböző címekre téve, a lapozó mechanizmus megvalósíthatja a taszkok egymástól való elszigetelését.
• A lineáris címtartomány egy részét olyan lapokra képezi le, melyek
nincsenek jelen. Így ahányszor a taszk megkísérli egy I/O művelet
Általános CPU programozási információk
292
végrehajtását ezeken a lapokon, egy kivétel generálódik. A rendszersoftware- ezután majd értelmezheti a megpróbált I/O műveletet.
Az I/O tartomány software-emulációja bizonyos körülmények közt az operációs rendszer részéről túl sok közbelépést igényel. Ilyenkor lehetséges az, hogy csak az első I/O hozzáférés megkísérlése okozzon kivételt. A rendszersoftware- ezután eldöntheti, hogy az I/O vezérlésének kizárólagos joga igeiglenesen átadható-e egy programnak vagy sem. Ha igen, akkor az I/O védelmét megszünteti és a program számára lehetővé teszi, hogy az teljes sebességgel fusson. 3.11.7.3. Különleges I/O pufferek Az intelligens kontrollerek pufferei (például egy bittérképes keretpuffer) a lapok leképezésével szintén emulálhatók. A puffer lineáris tartománya minden egyes 8086-os virtuális taszk esetében más és más fizikai tartományra képezhető le. A 8086-os virtuális felügyelőprogram azt vezérli, hogy melyik virtuális puffert kell a fizikai címtartományban levő valós pufferbe másolni. 3.11.8. Különbségek a 8086 CPU-hoz képest 8086-os virtuális üzemmódban általában a 8086 és 8088 processzorokra írt programok futnak. A következő felsorolás bemutatja a 8086 processzor és a Pentium processzor valamint más 32 bites processzorok 8086-os virtuális üzemmódja közti kisebb eltéréseket. 1. Az utasítások végrehajtásához szükséges órajelek száma. A 32 bites
processzorokon legtöbb utasítás kevesebb órajel alatt hajtódik végre, mint a 8086 processzoron. A leginkább befolyásolt területek a következők:
• Az I/O műveletek alkalmával az I/O eszközök által igényelt
késleltetések.
8086-os virtuális üzemmód
293
• A 8087 koprocesszorral párhuzamosan működő 8086 processzor esetében feltételezett késleltetések.
2. Az osztáskivételek a DIV utasításra mutatnak. A Pentium processzor
esetében az osztáskivételek mindig a hibát okozó utasításra mutató CS:IP értéket mentik el. A 8086 processzornál a CS:IP a következő utasításra mutat.
3. Meghatározatlan 8086 processzor-opkódok. A 8086 processzor
esetében nem definiált opkódok a Pentium processzoron vagy érvénytelen-opkód kivételt generálnak, vagy a Pentium számára definiált új utasításként hajtódnak végre.
4. A PUSH SP által a veremre helyezett érték. A PUSH SP utasítás
végrehajtásakor a Pentium processzor más adatot helyez a veremre, mint a 8086. A Pentium processzor az SP-nek a csökkentés előtti értékét helyezi a veremre, míg a 8086 a csökkentés utáni értékét. Ha a veremre helyezett adatra szükség van, akkor a PUSH SP utasítást a következő három utasítással kell helyettesíteni:
PUSH BP MOV BP, SP XCHG BP, [BP]
Ez a kód a Pentiumon úgy működik, mint a PUSH SP a 8086 processzoron.
5. Léptetés vagy forgatás több mint 31 bittel. A Pentium processzor a
léptetés és forgatás számlálóinak csak az alsó 5 bitjét veszi figyelembe. Ez a számláló értékét legtöbb 31-re korlátozza.
6. Redundáns prefixek. A Pentium processzor az utasítások hosszát 15
Byte-ra korlátozza. E határ megsértésére az egyetlen lehetőség az utasítás előtti redundáns prefixek használata. Az utasításhossz-határ megsértése esetén általános védelmi kivétel generálódik. A 8086 processzor nem korlátozza az utasítások hosszát.
Általános CPU programozási információk
294
7. A 0 vagy 65535 értékű ofszetet átlépő operandus. A 8086 processzoron egy, a 65535 ofszetet (például a 65535 ofszetre egy szót másoló MOV) vagy 0 ofszetet (például egy szó kiemelése a veremból egy PUSH által, amikor az SP regiszter értéke 1) átlépő operandushoz való hozzáférés esetén az ofszet modulo 65535 alapon megcsonkul. A Pentium processzor ebben az esetben egy kivételt generál, általános védelmi kivételt, ha a szegmens egy adatszegmens (azaz a szegmenset a CS, DS, ES, FS, vagy GS regiszterek címzik), vagy veremkivételt, ha a szegmens egy veremszegmens (melyet az SS regiszter címez).
8. A 65535 ofszetet átlépő sorozatos végrehajtás. A 8086 processzor
esetében, ha az utasítások sorozatos végre hajtása a 65535 ofszet átlépése után is folytatódik, akkor a processzor a következő utasítást ugyanazon szegmens 0 ofszetjéről tölti be. A Pentium processzor ebben az esetben általános védelmi kivételt generál.
9. A LOCK használata csak bizonyos utasításokra van korlátozva. A
LOCK prefix és az általa vezérelt jel kizárólag annak megelőzésére használható, hogy más buszvezérlők az adatátviteli műveletet megszakítsák. A LOCK prefix csak a memóriát módosító, következő Pentium utasításokkal használható. A LOCK bármilyen más utasítással (vagy az alábbiakban felsoroltakkal abban az esetben, ha azok nem a memóriát módosítják) való használata érvénytelen-opkód kivételt eredményez.
• Bitteszt és -változtatás: a BTS, BTR és BTC utasítások. • Csere: az XCHG, XADD, CMPXCHG és CMPXCHG8B
utasítások (az XCHG esetében nincs szükség a LOCK prefixre). • Egyoperandusú aritmetikai és logikai: INC, DEC, NOT és NEG
utasítások. • Kétoperandusú aritmetikai és logikai: ADD, ADC, SUB, SBB,
AND, OR és XOR utasítások.
10. Lépésenkénti végrehajtás külső megszakításkezelők. A Pentium processzor lépésenkénti végrehajtás kivételeinek prioritása
8086-os virtuális üzemmód
295
különbözik a 8086 processzorétól. Ez a változtatás megelőzi hogy a külső megszakításkezelő is léptetve legyen akkor, amikor a program megszakított. A Pentium processzor lépésenkénti végrehajtás kivételének minden más külső megszakításnál nagyobb prioritása van. Az NT utasítás vagy egy kivétel által meghívott megszakításkezelőt a Pentium azonban még mindig lépésenként hajt végre.
11. IDIV kivételek a 80H és 8000H hányadosok esetében. Az IDIV
utasítás hányadosaként a Pentium képes a legkisebb negatív szám generálására. A 8086 processzor ehelyett azonban osztáshiba kivételt generál.
12. Flagek a veremben. Az EFLAGS regiszter PUSH utasítás,
megszakítások, vagy kivételek által tárolt tartalma a 8086 processzoron tárolttól a 12.-től 15.-ig terjedő bitekben különbözik. A 8086 processzoron ezek a bitek úgy tárolódnak, mintha 1-re lettek volna állítva, a Pentiumon azonban 8086-os virtuális módban a 15. bit értéke mindig 0 és a 12.-től 14.-ig terjedő bitekben mindig az utoljára beléjük töltött érték van.
13. Az NMI kezelőt megszakító NMI. Miután a Pentium processzor egy
NMI kivételt elfogad, a következő IRET utasítás végrehajtásáig maszkolja az NMI megszakítást.
14. A lebegőpontos-hiba kivételt hívó lebegőpontos hibák. A
lebegőpontos-hiba kivételek a Pentium processzoron meghívják a lebegőpontos-hiba kivétel kezelőjét. Ha a 8086 processzor a 8087 megszakítás számára más kivételt használ, akkor mindkét kivételvektor a lebegőpontos-hiba kivétel kezelőjére kell mutasson. A Pentium processzornak olyan jelei vannak, melyek külső logika hozzáadásával támogatják a számos személyi számítógépen használt megszakítás-kezelő mechanizmus emulációjának a felhasználó által definiált hibajelentéseit.
15. A numerikus kivételek meg kell engedjék a prefixek használatát. A
Pentium processzoron a lebegőpontos kivételek számára lementett CS és IP regiszterek az ESC utasítás előtt esetleg jelenlevő prefixekre
Általános CPU programozási információk
296
mutatnak. A 8086 processzoron az elmentett CS:IP az ESC utasításra mutat.
16. A Lebegőpontos Egység (FPU) nem használja a megszakítás-
kontrollert. A Pentium processzornak küldött lebegőpontos hibajel nem halad át a megszakításkontrolleren (A 8087 koprocesszor INT jele viszont áthalad). A koprocesszor-hiba kivétel kezelőjéből egyes utasításokat törölni kell, amennyiben azok a megszakításkezelőt használják. A Pentium processzornak olyan jelei vannak, melyek külső logika hozzáadásával támogatják a számos személyi számítógépen használt megszakításkezelő mechanizmus emulációjának a felhasználó által definiált hibajelentéseit.
17. A busz tartására adott válasz. A 8086 és Intel286 processzoroktól
eltérően a Pentium processzor válaszol a buszvezérlés átvevésére irányuló, más lehetséges buszvezérlőktől (például DMA kontrollertől) érkező kérésekre egy olyan nem illeszkedő operandus részeinek átvitele esetén, mint például egy dupla szót képező két szó.
18. A 8086-os virtuális üzemmódban a CPL értéke 3. A 8086 processzor
nem támogatja a védelmet, így CPL-je sincs. A 8086-os virtuális mód egy 3 értékű CPL-t használ, mely megakadályozza a privilegizált utasítások végrehajtását. Ezek a következők:
• LIDT utasítás • LGDT utasítás • LMSW utasítás • A MOV utasításnak a vezérlőregiszterek feltöltésére és
elmentésére szolgáló speciális alakjai. • CLTS utasítás • HLT utasítás • INVD utasítás • WBINVD utasítás • INVLPG utasítás • RDMSR utasítás • WRMSR utasítás • RSM utasítás
8086-os virtuális üzemmód
297
A fenti utasítások a processzornak az inicializálását követő valós üzemmódjában hajthatók végre. Lehetővé teszik a rendszer-adatstruktúrák (például a deszkriptortáblázatok) inicializálását a védett módba való belépés előtt. Mivel a 8086-os virtuális üzemmódba csak védett módból lehet belépni, ezek a struktúrák a belépéskor már inicializálva vannak.
19. A denormált kivétel kezelése különbözik. A kivételkezelés
különbségeinek részletei a 23. fejezetben találhatók. 3.11.9. Különbségek a 286 CPU-hoz képest A 8086-os virtuális üzemmód és az Intel286 valós üzemmódja közti különbségek az alkalmazások és az operációs rendszer közti interfészre vannak hatással. Az alkalmazás a 3. privilégiumszinten (felhszanálói módban) fut, így a védett privilégiumú utasítások és architekturális lehetőségek használatára tett minden kísérlet a 8086-os virtuális felügyelőprogramot fogja meghívni. A felügyelőprogram elemzi ezeket a hívásokat és emulálja őket. 3.11.9.1. Privilégiumszint A 8086-os virtuális módban futó programok privilégiumszintje 3 (felhasználói mód), mely megakadályozza a privilegizált utasítások végrehajtását. A privilegizált utasítások a következők:
• LIDT utasítás • LGDT utasítás • LMSW utasítás • A MOV utasításnak a vezérlő- és debugregiszterek feltöltésére és
elmentésére szolgáló speciális alakjai. • CLTS utasítás • HLT utasítás • INVD utasítás • WBINVD utasítás • INVLPG utasítás
Általános CPU programozási információk
298
• RDMSR utasítás • WRMSR utasítás • RSM utasítás
A 8086-os virtuális módba csak védett módból lehet belépni, így ennek nincs szüksége ezeknek az utasításoknak a végrehajtására. Míg a 8086-os virtuális üzemmódban nem, addig valós üzemmódban ezek az utasítások végrehajthatók. 3.11.9.2. A busz lezárása A 286 processzor a buszlezáró funkciót a 386, 486 és Pentium processzoroktól eltérő módon implementálja. Ez a tény a 8086 programok számára attól függően lehet észrevehető vagy sem, hogy a 8086-os virtuális felügyelőprogram a LOCK prefixet hogyan kezeli. Az LOCK prefix-szel ellátott utasítások érzékenyek az IOPL-re, a software-tervezők tetszés szerint emulálhatják őket. Ezért ha a 8086 programoknak a LOCK közvetlen végrehajtása engedélyezve van, a memória lezárásának a 8086 processzorra jellemző módját használó programok a Pentium és más 32 bites processzorokon lehet, hogy nem fognak megfelelően futni. A LOCK prefix és az általa vezérelt buszjel kizárólag annak megelőzésére használható, hogy más buszvezérlők az adatátviteli műveletet megszakítsák. A LOCK prefix csak a memóriát módosító, következő Pentium utasításokkal használható. A LOCK bármilyen más utasítással (vagy az alábbiakban felsoroltakkal abban az esetben, ha azok nem a memóriát módosítják, például ha a céloperandus egy regiszter) való használata érvénytelen-opkód kivételt eredményez.
• Bitteszt és -változtatás: a BTS, BTR és BTC utasítások. • Csere: az XCHG, XADD, CMPXCHG és CMPXCHG8B
utasítások (az XCHG esetében nincs szükség a LOCK prefixre). • Egyoperandusú aritmetikai és logikai: INC, DEC, NOT és NEG
utasítások.
8086-os virtuális üzemmód
299
• Kétoperandusú aritmetikai és logikai: ADD, ADC, SUB, SBB, AND, OR és XOR utasítások.
A lezárt utasítások garantáltan csak a céloperandus által megadott memóriarészt zárják le, egyes esetekben azonban nagyobb részeket is lezárhatnak. A 8086 és 286 processzoroktól eltérően a Pentium processzor válaszol a buszvezérlés átvevésére irányuló, más lehetséges buszvezérlőktől (például DMA kontrollertől) érkező kérésekre egy olyan nem illeszkedő operandus részeinek átvitele esetén, mint például egy dupla szót képező két szó. 3.11.10. Különbségek a 386 és 486 CPU-hoz képest A valós üzemmód az Intel386, Intel486 és Pentium processzorokon ugyanúgy viselkedik. Amikor a virtuális módú kiterjesztés le van tiltva (a CR4 VME bitjének értéke 0), akkor a Pentium processzor 8086-os virtuális üzemmódjának viselkedése a 386 és 486 processzorokével megegyező. A virtuális módú kiterjesztés engedélyezésével (a CR4 VME bitjének értéke 1) a Pentium processzor 8086-os virtuális üzemmódjának teljesítménye jelentős mértékben megnő. E kiterjesztésekkel kapcsolatos információk a függelékben találhatók. A maximális teljesítmény elérése érdekében a Pentium processzorra portált programok engedélyezett cache-el kell fussanak.
Általános CPU programozási információk
300
Ábra- és példajegyzék 1.1. ábra: A Pentium processzor blokkvázlata .............................. 12 1.2. ábra: Az INTEGER egység .................................................... 13 1.3. ábra: A PIPELINE-ok belső felépítésének blokkvázlata ....... 14 1.4. ábra: Cache-vonal állapotai a MESI protokoll szerint ........... 16 1.5. ábra: Az FPU pipeline-ja........................................................ 19 1.6. ábra: Cache kezelési modellek ............................................... 20 1.7. ábra: DRAM idődiagramok.................................................... 21 1.8. ábra: Az M1- es és a Pentium processzorok pipelinejainak
összehasonlítása ........................................................... 24 1.9. ábra: Az M1-es definiálatlan CACHE-e bármilyen
arányban tartalmazhat adatot és utasítást. Az utasításvonal CACHE pedig az INTEGER egység által leginkább használt utasításokat tárolja................. 27
1.10. ábra: Az M1-es processzor szuperpipeline-okból felépített INTEGER egysége........................................ 29
1.11. ábra: Kiugrás a végrehajtási sorrendből. Az M1-es processzorban az egyik pipeline végrehajtási sorában lévő utasításnak nem kell megvárnia a másik pipeline lassúbb utasítását. Kiugorva a végrehajtási sorból, időt lehet megtakarítani a vérehajtás sor................................................................ 30
1.12. ábra: Nx586 alapú IBM PC kompatibilis számítógép felépítése NxVL vagy NxPCI rendszerinterface chip felhasználásával. A matematikai processzor külön tokban helyezkedik el, míg a másodszintű cache vezérlője a processzorlapkán kapott helyet.................. 32
1.13. ábra: A NexGen szabadalmaztatott RISC86-os architektúrája dinamikusan fordítja az összetett X86-os (CISC) utasításokatRISC86-os utasításokká, így tehát kihasználhatja a RISC utasítások sebességi előnyeit. ........................................................................ 34
3.1. ábra: Szegmentált címzés ....................................................... 64 3.2. ábra: Alkalmazások számára elérhető regiszterkészlet .......... 66 3.3. ábra: Szegmentált memória.................................................... 68 3.4. ábra: A verem működése........................................................ 71 3.5. ábra: Az EFLAGS regiszter ................................................... 72
Ábra- és példajegyzék
301
3.6. ábra: Állapotbitek................................................................... 73 3.7. ábra: A vezérlő regiszterek felépítése .................................... 78 3.8. ábra: Nyomkövető regiszterek ............................................... 83 3.9. ábra: Az EDX regiszter tartalma reszetelés után.................... 87 3.10. ábra: A CR0 regiszter tartalma reszetelés után .................... 88 3.11. ábra: A processzor állapota a reszetelést követően.............. 90 3.12. ábra: A processzor állapota a reszetet követően .................. 100 3.13. ábra: Az algoritmus és a forrásszöveg ezzel kapcsolatos
sorainak száma ............................................................. 101 3.14. ábra: A BLD és az ASM forrásállomány közti
összefüggés .................................................................. 104 3-1 példa: STARTUP.ASM .......................................................... 104 3-2 példa: MAIN.ASM ................................................................. 113 3.15. ábra: A TEMP_GDT létrehozása és a védett módba való
átkapcsolás (a forrásszöveg 162-172 sorai) ................. 115 3.16. ábra: A GDT, IDT és TSS ROM-ból RAM-ba másolása
(a forrásszöveg 196-261 sorai)..................................... 115 3.17. ábra: Átkapcsolás a taszkra (a forrásszöveg 282 296
sorai)............................................................................. 116 3-3 példa: Az alkalmazás lefordítására és felépítésére szolgáló
parancsköteg-állomány ................................................ 117 3-4 példa: Build-állomány............................................................. 117 3.18. ábra: Címek lefordítása ........................................................ 120 3.19. ábra: Kivételek és megszakítások ........................................ 123 3.20. ábra: Memória kezelő regiszterek ........................................ 125 3.21. ábra: Sík modell ................................................................... 132 3.22. ábra: Védett sík modell ........................................................ 134 3.23. ábra: Multiszegmens modell ................................................ 135 3.24. ábra: TI BIT - A deszkriptor tábla kiválasztása ................... 137 3.25. ábra: Szegmens fordítás ....................................................... 138 3.26. ábra: Szegmens regiszterek .................................................. 139 3.27. ábra: Szegmens szelektor ..................................................... 140 3.28. ábra: Szegmens deszkriptorok.............................................. 142 3.29. ábra: Alkalmazási szegmens típusok ................................... 145 3.30. ábra: Szegmens deszkriptor (a szegmens nincs jelen) ......... 148 3.31. ábra: Deszkriptor táblázatok ................................................ 149 3.32. ábra: Pszeudó deszkriptor formátum.................................... 150 3.33. ábra: A lineáris cím formátuma............................................ 152
Általános CPU programozási információk
302
3.34. ábra: Lapfordítás .................................................................. 153 3.35. ábra: A lapcímtár formátuma és a laptáblázatok elemei a
4K-s lapokhoz. ............................................................. 154 3.36. ábra: Laptáblázat bejegyzés formátuma nem jelenlévő
lapoknál ........................................................................ 155 3.37. ábra: Kombinált szegmens- és lapcím fordítás .................... 160 3.38. ábra: minden egyes szegmensnek biztosítani kell saját
laptáblázatot ................................................................. 161 3.40. ábra: Rendszer szegmens- és kapu típusok .......................... 164 3.39. ábra: Védett módban használt deszkriptor mezők ............... 166 3.41. ábra: Védelmi gyűrűk........................................................... 171 3.42. ábra: Privilégium ellenőrzés adathozzáféréseknél ............... 172 3.43. ábra: Privilégium ellenőrzés taszkkapu nélküli
vezérlésátadásoknál...................................................... 175 3.44. ábra: Call kapu ..................................................................... 177 3.45. ábra: A call kapu mechanizmusa.......................................... 178 3.46. ábra: Privilégium ellenörzés call kapuval történő
vezérlésátadásnál.......................................................... 180 3.47. ábra: Kezdeti stack pointerek egy TSS-ben ......................... 182 3.48. ábra: Stack keret szintek közötti hívás alatt ......................... 184 3.49. ábra: Szintek közötti visszatérés ellenőrzés ......................... 187 3.50. ábra: Érvényes deszzkriptor típusok LSL műveletekhez ..... 191 3.51. ábra: Egy laptáblázat bejegyzés védelmi mezői................... 195 3.52. ábra: Kombinált lapcímtár és laptáblázat védelem .............. 198 3.53. ábra: 32 bites taszk állapot szegmens................................... 203 3.54. ábra: TSS Deszkriptor .......................................................... 204 3.55. ábra: Taszk regiszter ............................................................ 207 3.56. ábra: Taszk kapudeszkriptor ................................................ 208 3.57. ábra: Taszkokra jellemző taszk kapuk ................................. 209 3.58. ábra: Taszkváltás alatti ellenörzés........................................ 213 3.59. ábra: Beágyazott taszkok...................................................... 215 3.60. ábra: A taszkváltások hatása a Busy, NT és LINK
mezőkre ........................................................................ 216 3.61 ábra: Lineáris átfedés a fizikai memóriában ......................... 221 3.62. ábra: Kivételek és megszakításvektorok .............................. 224 3.63. ábra: Kivételek és megszakítások egymás közötti
prioritása....................................................................... 229
Ábra- és példajegyzék
303
3.64. ábra: IDT lokalizálása a memóriában az IDTR segítségével .................................................................. 230
3.65. ábra: IDT kapudeszkriptor ................................................... 232 3.66. ábra: Megszakítás procedura hívás ...................................... 234 3.67. ábra: Verem keret egy megszakítás vagy kivétel után ......... 235 3.68. ábra: Megszakítás taszkkapcsolás ........................................ 238 3.69. ábra: Hibakód ....................................................................... 240 3.70. ábra: Megszakítás és kivétel osztályok ................................ 244 3.71. ábra: Dupla hiba viszonyok.................................................. 245 3.72. ábra: Érvénytelen TSS állapotok.......................................... 247 3.73. ábra: Laphiba hibakódok...................................................... 253 3.74. ábra: Adattípusok által igényelt illeszkedési feltételek........ 260 3.75. ábra: Kivételek összefoglalása ............................................. 262 3.75. ábra: Hibakódok összefoglalása........................................... 263 3.76. ábra: Az üzemmód-állapotok közti átmenetek..................... 266 3.77 ábra: Az SMM kezdeti állapota............................................. 267 3.78. ábra: Az állapottároló formátuma ........................................ 270 3.79. ábra: Állapot-beosztás.......................................................... 271 3.80. ábra: SMM revízió-azonosító............................................... 271 3.81. ábra: SMM revízió-azonosító táblázat ................................. 272 3.82. ábra: Felfüggesztett állapotból való automatikus
újraindítás..................................................................... 273 3.83. ábra: Belépés a 8086-os virtuális üzemmódba és az abból
való kilépés................................................................... 280 3.84. ábra: A 0. privilégiumszintű verem állapota 8086-os
virtuális módban, a megszakítást követően.................. 281 3. 85. ábra: A software-megszakítás műveletei ............................ 287
Általános CPU programozási információk
304
Előzetes a második kötet tartalmából Címzésmódok - amit, és amivel címezhetünk FPU - felépítés, szerkezet - veremkezelés - működés, kivételek - adatformátumok, pontosság - párhuzamos kezelés Optimalizáció - hogy a programjaink jobbak legyenek I/O kezelés - portkezelési lehetőségek Trace, debug - a hibák felderítése
Lehetőségek - az ötödik generációs processzorok által nyújtott
további lehetőségek Utasításkészlet - A Pentium processzor teljes utasításkészlete Függelékek - A P54 Pentium processzor részletesebb blokkvázlata és egyéb adatai - A PowerPC 601, 603, 604 processzorok
blokkvázlatai, és egyéb adataik Products mentioned in this book are mentioned for identification purposes only. Product names appearing in this book may or may not be registered trade marks or copyrights of their respective companies.