x86-os védett üzemmód Windows alatt 3 előadás dr. Robu Judit szeminárium drd. Lukács Sándor 2006
Copyright / Felhasznált anyag a prezentáció részben felhasználja a Windows Operating System Internals Curriculum Resource Kit-ben található prezentációkat az eredeti anyagot David A. Solomon, Mark E. Russinovich és Andreas Polze készítették a Microsoft licenszelte az anyagot és szabadon felhasználhatóvá tette akadémiai környezetben a MSDNAA / CRK keretében a teljes licensz megtalálható a következő címen: http://www.msdnaa.net/curriculum/license_curriculum.aspx ebben a prezentációban külön meg vannak jelölve azok a slide-ok, amelyek a CRK felhasználásával készültek az egyetem (BBTE) keretében a CRK és WRK szabadon elérhető és letölthető a diákok számára [ide utólag, amikor felkerül a CRK a hálózatra link kerül] BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Processzor üzemmódok Valós üzemmód (Real mode) 20 bites címzés (1 MB) nincs védelem egy processz DOS alatt volt használatos Védett üzemmód (Protected mode) 32 bites címzés (4 GB) lapozás, szegmentálás – a legfontosabb része a védett üzemmódnak a memória kezelése védelem, privilégium szintek több processz Windows, Linux stb. ezt használja több kibővítése van, pl. PAE – 36 bites fizikai címzés (64 GB) System Management Mode (SMM) speciális uzemmód, az SO számára is transzparens (OEM / BIOS használhatja) Virtual-8086-os üzemmód védett üzemmód alatt futó speciális védett taszk – pl. 16 bites alkalmazások NT alatt Unreal 4GB Flat Mode hivatalosan nem dokumentált, a valós üzemmód egy speciális esete / funkcionalitása valós üzemmódból a teljes 4GB-os fizikai memória elérését teszi lehetővé új további „üzemmódok”, az Intel Vanderpool (VT) és AMD Pacifica esetén hypervisor-ok használják BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Üzemmódok közötti váltások BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
32 bites védett üzemmódbeli végrehajtási környezet CR0 – a védett üzemmód legfőbb kontroll regisztere CR3 (PDBR) – lapkönyvtár címe IDTR – megszakítás táblázat címe GDTR, LDTR – globális és lokális deszkriptortáblák címei TR – aktuális taszk szelektor MMX/FPU, SSE stb. regiszterek MSR regiszterek BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
EFLAGS IOPL – I/O privilégium szint IF – 1 a hardver megszakítások engedélyezve vannak 0 a hardver megszakítások tiltva vannak BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
CR0, CR3 vezérlőregiszterek PE – védett üzemmód aktiválása, ha 1 WP – felhasználói lapok írásvédése supervisorral szemben, ha 1 (UNIX copy-on-write szemantika implementálásához szükséges) PG – lapozás aktíválása, ha 1 CD – cache tiltása (teljes mértékben, L1, L2) PCD – lapszintű cache tiltása (teljes mértékben, L1, L2) PWT – 1 – write-through cache, 0 – write-back cache Page-Directory Base – a lapkönyvtár bázíscíme (fizikai cím, 4K határon) BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Memória, alapfogalmak a memória a második legfontosabb eleme egy modern számítógépnek (a processzor után) a memória (a legtöbb esetben) egy hatalmas szó/bájt tömbnek tekinthető a processzor a memóriából utasításokat tölt be a program számláló regiszternek (EIP) megfelelően az utasítások a végrehajtás során további memória betöltését vagy memóriába történő tárolást eredményezhetnek The main purpose of a computer system is to execute programs. These programs, together with the data they access, must be in main memory (at least partially) during execution. To improve both the utilization of the CPU and the speed of its response to its users, the computer must keep several processes in memory. There are many different memory-management schemes. These schemes reflect various approaches to memory management, and the effectiveness of the different algorithms depends on the particular situation. Selection of a memory-management scheme for a specific system depends on many factors, especially on the hardware design of the system. Each algorithm requires its own hardware support. Since main memory is usually too small to accommodate all data and programs permanently, the computer system must provide secondary storage to back up main memory. Most modern computer systems use disk as the primary on-line storage medium for information. BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Logikai és fizikai címzés, címterületek a processzor (klasszikus értelemben, mint utasítást végrehajtó egység, a programok szemszögéből nézve) logikai (másnéven virtuális) címekkel cimezi a memóriát a különböző hardvereszközök fizikai címekkel címezik a memóriát (beleértve végső soron a processzort is, mit fizikai egység) a programok végrehajtása közben a virtuális címeket a memória menedzselő egység (MMU) alakítja fizikai címekké a MMU fizikailag a processzor része a MMU programozása privilegizált, csak rendszerszoftver végezheti a logikai címterület → fizikai címterület tükrözés (transzláció) egy nagyon fontos fogalom a memória mendzselés keretében a felhasználói alkalmazások mindig virtuális címekkel dolgoznak; számukra a fizikai címek nem láthatók BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Memória allokálási módszerek 1 a memóriában az operációs rendszer (kernel) és a felhasználói folyamatok / alkalmazások számára kell helyet biztosítani az SO-t védeni kell a felhasználói alkalmazások módosításai ellen a felhasználói alkalmazásokat védeni kell egymással szemben egy partíciós allokálás az összes processz egyetlen memória partícióban foglal helyet a védelmet egy korlát (limit) és egy relokációs regiszter nyújthatja korlát regiszter relokációs regiszter memória < igen CPU logikai cím fizikai cím + nem SO kivétel, címzési hiba BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Memória allokálási módszerek 2 több partíciós allokálás több folyamat párhuzamosan helyezkedik el a memóriában a memóriát több partícióra oszthatjuk (fix / változó hosszúságuak) mekkora az optimális partíció mérete? dinamikus memória allokálás több pratíció, szabad részekkel a partíciók között az allokációkat egy „szabad részek halmazából” végezzük el melyik szabad részt választjuk ki? First-fit: a legelső szabad részt foglaljuk le, amelyik elég nagy Best-fit: a legkisebb szabad részt foglaljuk le, amelyik elég nagy ezek nem csak heap esetén érvényesek, hanem fizikai memória, virtuális címterület stb. szintjén is BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Példa: többlépéses kompiler Overlay-ek Példa: többlépéses kompiler a program mérete nagyobb lehet a rendelkezésre álló memóriánál Overlay megoldás: osszuk fel a programot időben egymástól független modulokra töltsük be ezeket a modulokat alternatíven az overlay driver (overlay kezelő) betölti a modulokat a modulok leginkább bináris memória képként vannak tárolva a fordítóprogram támogatása szükséges Szimbólum tábla Első lépés Közös függvények Overlay driver MS-DOS is a typical example for an OS using a single partition allocation scheme. Overlays were commonly used to optimize usage of the address space (main memory) of early PCs. Második lépés BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Felhasználói alkalmazások Swapping Központi memória több processzes (multi-processzing) környezetekben intenzíven használt a swapping egy processz ideiglenesen kimásolódhat (swapp out) a háttértárolóra klasszikusan a fizikai címterület szintén történik egy processz mindig ugyanabba a memória zónába töltődik vissza ma a legtöbb SO (Windows, Linux) a logikai címterületek szintjén végzi ma leginkább swapping alatt lapozást (paging) értünk egy processz tetszőleges fizikai címekre töltődhet vissza Operációs rendszer Háttértároló Felhasználói alkalmazások Swap out Processz P1 Processz P2 Swap in BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Szegmentálás hogyan látja a programozó a memóriát? változó hosszúságú szegmensek / zónák (kód, adat, verem, ...) nem szükséges a szegmensek explicit rendezése logikai címek: <szegmens-szám, offszet> a logikai címeket hardware alakítja fizikai cimekké a szegmens tábla tárolja a szegmesek kezdőcímét és korlátját (méretét) szegmens tábla Fizikai memória Many processors contain support for segmentation (I.e.; local/global descriptor tables on i386). However, since the programmer’s view of separate memory segments (stack, heap, data, text, …) can be implemented on top of paging as well, current OSes refrain from the usage of the hardware segmentation mechanisms and use paging instead. In fact, for the i386 family of CPUs, a paging-only based memory management scheme turned out to be more performant than a scheme using the segmentation mechanisms built into the CPU. Windows uses the i386 segmentation mechanism only in the rare event of a call to KeBugCheck() (blue screen) and switches to a different memory section in order to display diagnostic messages. szeg korlát bázis CPU szeg ofsz igen < + nem kivétel, hiba kezelése BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Címterületek tükrözése Windows alatt Intel x86-os hardver támogatás az Intel x86 két szintű címterület tranzlációt biztosíts szegmentálás (kötelező az Intel 8086-os óta) lapozás (opcionális, jelen van az Intel 80386-os óta) szegmentálás: a tranzláció első lépése Intel x86: logikai/virtuális címek (szelektor:offszet) → lineáris címek Windows: a virtuális címek megfelelnek a lineáris címeknek lapozás: a tranzláció második lépése Intel x86: lineáris címek → fizikai címek Windows: virtuális címek → fizikai címek fizikai címek: 32 bit (4GB), vagy 36 bit (64GB) PAE esetén (P Pro) fizikai lapok mérete 4 KB, Intel x86 (összes Windows verzió) 4 MB, Pentium Pro (NT4/2K/XP/2003/Vista) BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Privilégium szintek szegmentálás esetén 4 szint (0-3) lapozás esetén 2 szint (0-1) a gyakorlatban két szint használt 0 – kernel 1 – alkalmazások BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Alkalmazott memória modellek multi-szegmens modell, egy közös virtuális címterület L4 microkernel FLAT – egy szegmens, programonként egy-egy virtuális címterület Windows, Linux egy szegmens, egy virtuális címterület Singularity FLAT modell Multi-szegmens modell BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Intel x86-os szegmentálás szegmens szelektor offszet Index TI=0 RPL 3 15 2 1 31 logikai cím : Intel lineáris címterület 0xffffffff globális deszkriptor tábla Jogok Korlát=0xfffff Bázis cím = 0 Jogok Korlát=0xfffff + szegmens deszkriptorok Bázis cím = 0 Windows virtuális cím BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Szegmens deszkriptorok 32 bites báziscím (BASE) 20 bites korlát (LIMIT) ha G = 0 akkor 1 bájtonként ha G = 1 akkor 4 KB-ként DPL – hozzáférési jogok D/B – operandusok mérete 16 vagy 32 bit 0x66-os prefixel módosítható végrehajtás során a kódban P – jelen van vagy nem szegmens alapú swapping esetén használatos két típusú deszkriptor van S = 0, rendszer deszkriptor S = 1, adat vagy kód deszkriptor BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Kód és adat deszkriptor típusok BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Rendszerdeszkriptor típusok BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Memória menedzselő regiszterek a GDTR és IDTR lineáris címeket tartalmaz a TR és LDTR két résszel rendelkezik látható rész – szegmens szelektort tartalmaz láthatatlan rész – lineáris báziscímet és korlátot tartalmaz BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Deszkriptor táblák és szelektorok két deszkriptor tábla globális – minden taszk látja lokális – taszkonként egy-egy a deszkriptor tábla bemenetei közül egy 16 bites szelektorral választhatunk ki egyet a szelektorokat a szegmens regiszterekbe helyezzük el BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Szegmens regiszterek valós üzemmódban egy szegmens báziscímét tartalmazzák védett üzemmódban két résszel rendelkeznek látható rész – szegmens szelektort tartalmaz láthatatlan rész – „descriptor cache”, a szelektor által kiválasztott deszkriptort tárolja (báziscím, korlát stb.) → mindig újra kell tölteni a szegmens regisztereket a deszkriptor táblák módosítása után BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Unreal Flat 4GB mód 1 a szegmens regiszterek cache-jén alapszik mindig érvényesek, üzemmódtól függetlenül egyszerű trükk: 1. belépünk 32 bites védett üzemmódba 2. elkészítünk egy, a teljes 4GB-ot lefedő szegmens deszkriptort (írható-olvasható 3-as privilégium szinten) 3. feltöltünk egy szegmes regisztert (pl. GS) egy, a deszkriptorra mutató szelektorral 4. vissza váltunk 16 bites valós üzemmódba 5. speciális utasításokkal (szegmens váltó prefix) és 32 bites regisztereket felhasználva cimezni tudjuk a teljes 4GB-os fizikai memóriát BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Unreal Flat 4GB mód 2 function mInB(addr: longint): byte; assembler; function InitFlat4GB: boolean; assembler; asm ... db 66h; mov bx, ds { init GDTR space } db 66h; shl bx, 4 { shl ebx, 4 } db 66h; mov si, OFFSET dNull { esi } dw 0000h db 66h; add bx, si { add ebx, esi } mov di, OFFSET dGDT db 66h; mov [ds:di+2], bx lgdt [OFFSET dGDT] { load GDTR } cli { set up ES, FS } db 0fh,20h,0c0h { mov eax, cr0 } or al, 01h db 0fh,22h,0c0h { mov cr0, eax } mov ax, 0008h { setup ES } mov es, ax db 8eh, 0e0h { mov fs, ax } db 0fh,20h,0c0h and al, 0feh db 0fh,22h,0c0h { clear CR0.PE } sti const dNull: array[0..7]of byte = ($00, $00, $00, $00, $00, $00, $00, $00); dFlat: array[0..7]of byte = ($ff, $ff, $00, $00, $00, $92, $8f, $00); dGDT : array[0..5]of byte = ($10, $00, $00, $00, $00, $00); function mInB(addr: longint): byte; assembler; asm db 66h; mov si, WORD PTR addr { mov esi,addr } db 64h,67h,8ah,06h { mov al, fs:[esi] } end; ... if InitFlat4GB then begin assign(f, 'bios.bin'); rewrite(f); for l := $000f0000 to $000fffff do begin temp := mInB(l); write(f, temp); close(f); BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Call kapuk, védett eljáráshívások 1 az SO függvényeket, API hívásokat kínál fel a felhasználói programok számára ezeknek pontos (fix) belépési pontjuk van a hardver védelmet nyújt (CALL kapu), hogy ne lehessen tetszőle-ges offszetre eljárás hívást végezni egy kódszegmensen belül a GDT-ben és az LDT-ben helyezhetünk el CALL kapukat BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Call kapuk, védett eljáráshívások 2 BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Memória fragmentáció a dinamikus memória allokálás töredezettséghez (fragmentáció) vezet külső (external) fragmentáció – létezik elégséges szabad memória rész, de nem folyotonos belső (internal) fragmentáció – egy lefoglalt blokk nagyobb lehet (és rendszerint nagyobb) mint a kért memória → a külömbség nem felhasználható, „elvész” több módszert lehet alkalmazni a fragmentáció megszüntetésére illetve elkerülésére → például kompaktálás a lefoglalt memória blokkok átrendezése dinamikusan, közvetlenül egymás után csak akkor lehetséges, ha a kód és adat relokációja dinamikus és a végrehajtás során történik (execution time dynamic relocation) I/O probléma egy program memória buffereit elmozdíthatjuk, amíg azok külső I/O-ban vesznek részt lehetséges megoldás (de költséges!) – minden I/O-t csak az SO buffereiben végezzünk a kompaktálást jól lehet használni olyan nyelvek esetén, ahol nincsenek mutatók Java, C#, Visual Basic BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Lapozás (Paging) más megoldás – lapozás: a memória nem-folytonos allokálása, egyenlő méretű lapok formályában (ez teljesen megoldja a külső, és részben a belső töredezettség problémáját is) a lapozás a fizikai memóriát egyenlő méretű blokkokra osztja fel (keretek, frames) a logikai (Intel lineáris) címterületet a keretekkel egyenlő méretű lapokra osztja fel (pages) Paging is the solution to memory management implemented with all modern operating systems. The VAX VMS (Virtual Memory Management) system was pioneering in many design decisions for virtual memory management implementations found today. BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Alapvető lapozási mechanizmus amikor egy alkalmazást elindítunk, az alkalmazás lapjai betöltődnek a fizikai memória kereteibe a hardver laptáblákkal támogatja a lapozási mechanizmus megoldását (a tranzlációt) egy logikai cím egy lap számából és lapon belüli offszettből áll Fizikai memória CPU p d f d logikai cím fizikai cím p offszet lap szám tipikusan egy lap 2-4 KB laptábla BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Egyszerű lapozási példa lap/keret szám Page 0 1 Page 1 4 Page 1 2 1 1 Page 2 6 3 Page 3 2 3 Page 3 3 4 Page 0 laptábla 5 logikai címterület Page 2 6 7 fizikai memória BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
az új processz laptáblája Új processz indítása 7 7 szabad keretek 7, 8, 10, 11,13, 16 8 processz létrehozása 8 Page 1 9 9 11 10 10 1 8 11 11 Page 0 16 2 12 12 13 3 13 13 Page 3 az új processz laptáblája 14 14 15 15 szabad keretek 7, 10 Page 2 16 16 17 Allokálás előtt 17 Allokálás után BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
A lapozás hardver szintű támogatása minden hozzáférés a memóriához igényli a laptábla felhasználást ezért a laptáblákat hardveresen kell megoldani a laptáblák külön vannak létrehozva minden processz számára kisméretű laptáblákat könnyen lehet regiszterekkel implementálni problémák: a fizikai memória mérete, processzek száma a laptáblákat méretűk miatt a memóriában tárolják csak a báziscímük van speciális regiszterekben tárolva probléma: a memória elérése nagyon lassú TLB bufferek (translation look-aside buffers) asszociatív regiszter szettek / memóriák a legutóbb használt laptábla bemeneteket tartalmazza a TLB gyors, költséges és kisméretű (8-2048 bemenet) a TLB tartalmát minden processz kontextus váltáskor frissíteni kell BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Asszociatív memória – TLB asszociatív (megfeleltető) memória olyan, mintha egy tömböt „egy lépésben megindexelnénk” párhuzamos keresés egy asszociatív regiszter szettben címek tranzlációja (A´ → A´´) ha A´ megtalálható az asszociatív regiszter szettben, akkor A´´ a neki megfelelő értéket veszi fel (keret szám) különben az A´´ értékét a memóriában lévő laptábla segítségével határozzuk meg lap # keret # BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Lapozási hardver TLB-vel Fizikai memória CPU p d f d logikai cím fizikai cím TLB találat offszet lap # keret # lap szám TLB p TLB tévesztés laptábla BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Lapozási rendszerek különböző módszerek és struktúrák használatosak a lapozás megoldására három alapvető lapozási stílus van hierarchikus lapozás hash-alapú lapozás fordított laptáblás lapozás az x86-os architektúra két szintű hierarchikus lapozást alkalmaz BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Kétszintű hierarchikus lapozás … … … lapkönyvtár … laptáblák fizikai memória BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Kétszintű hierarchikus lapozás Intel 32-bites x86-os architektúrán egy logikai címet két alapvető részre osztunk fel (standard 4KB-os lapok esetén) lapszám-ra – 20 bit offszet-re a kiválasztott lapon belül – 12 bit mivel kétszintű hierarchikus lapozás → a laptáblák is lapozva vannak → a lapszámot további két részre osztjuk 10 bites efektíve lapszámra 10 bites offszetre egy logikai cím a következő képpen néz ki: ahol p1 egy index a külső laptáblákban (lapkönyvtár) és p2 egy index a belső laptáblában (effektíve laptábla) lap szám offszet Hierarchical page table schemes can be extended to more than two levels. An example is the x64 architecture introduced by AMD, that uses a four level paging scheme. p1 p2 d 10 10 12 BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Kétszintű lapozás, vázlat lapszám offszet fizikai memória p1 p2 d 10 10 12 p1 lapkönyvtár p2 lap BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Lapkönyvtár és laptábla bemenetek PS – ha 1 akkor 4MB-os lap A – elért, felhasznált lap (a lapozási algoritmusok használják fel) U/S – privilégium szint R/W – írásvédettség P – ha 1 akkor jelenvan (különben a háttértárolón) D – ha 1 akkor piszkos lap (módosítva volt a legutóbbi betöltés után) BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
(egy lapkönyvtár / processz) szelektor offszet logikai cím Intel x86-os címtranzláció mechanizmus deszkriptor tábla s korlát bázis + 31 22 21 12 11 lineáris cím 10 10 12 fizikai cím operandus PTE 4 KB lap 4KB PDE 4KB keretcím laptáblák 1024 bement 22 bit offszet operandus 4MB PDE 4 MB lap 4MB keretcím lapkönyvtár 1024 x 4 byte bemenet (egy lapkönyvtár / processz) fizikai memória CR3 (PDBR) fizikai cím
HASH alapú laptáblák 1 gyakran használt 64 bites architektúrák esetén pl. az Intel Itanium IA64 támogatja a virtuális lap számából egy hash függvénnyel kulcsot számol a rendszer a laptábla láncolt elemeket tartalmaz a virtuális lapok számai egyenként össze vannak hasonlítva a láncban lévő elemekkel amikor a megfelelő értékű elemet megtalálja a rendszer, a fizikai keret címét kiolvassa az elemből BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
HASH alapú laptáblák 2 Fizikai memória CPU p d f d logikai cím fizikai cím offszet lapszám hash függvény p1 f1 p2 f2 laptábla BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Osztott lapok osztott kód saját kód és adat egyetlen példánya egy közös kódnak írásvédett formában van betükrözve több processz alá a megosztott lapok azonos logikai címeken kell szerepeljenek minden processz alatt saját kód és adat minden processz külön tárolja a kód és adat lapokat a lapok egymástól függetlenül, tetszőleges logikai címeken helyezkedhetnek el BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Osztott lapok, példa lap/keret szám 1 cpp cpp 1 2 cc1 4 3 cc2 11 4 cc1 Processz 1 virtuális memória Processz 1 laptáblák 1 cpp cpp 1 2 cc1 4 3 cc2 11 4 cc1 data1 7 5 6 Processz 2 virtuális memória Processz 2 laptáblák 7 data1 8 data2 cpp 1 9 cc1 4 10 cc2 11 cc2 data2 8 11 fizikai memória BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Felhasználói vírtuális címterület Osztott memória = Állomány amelyet több processz tükrözött be a címterületébe A. folyamat háttértároló B. folyamat 00000000 Felhasználói vírtuális címterület Felhasználói virtuális címterület 7FFFFFFF Fizikai Memória az osztott memória különböző címekre lehet bemappolva két különböző processz esetén BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Állományok tükrözése 1 egy módszer arra, hogy egy állomány egy részét (vagy egy teljes állományt) „közvetlenül” elérhetővé tegyünk a virtuális címterületen belül lévő zónában x86-os a virtuális címterület 2 GB, egy állomány sokkal nagyobb is lehet a Windows API “file mapping objects”-nek nevezi az ilyen virtuális zónákat az állományon belül lévő bájtok 1:1-ben megfelelnek a virtuális memóriában lévő zónán belül látható értékekkel az memóriából történő olvasás olyan mintha állományból olvasnánk a virtuális címterületben lévő zóna mindig le van foglalva a fizikai lapok csak akkor vannak betöltve a memóriába, amikor a program olvassa a megfelelő állomány a memória módosításai időnként (vagy explicit FLUSH kérés esetén azonnal) vissza vannak írva a lemezre egy Windows folyamat esetében mindig vannak tükrözött állományok a folyamat futtatható EXE állománya egy vagy több DLL egy folyamat kérésre további állományokat tükrözhet (DLL-ek, adatfájlok stb.) BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Állományok tükrözése 2 nincs szükség explicit állomány I/O-ra (írás, olvasás) az állományban lévő összes adatstrúktúra közvetlenül le lesz mentve a háttértárolóra vigyázat a mutatókra!!! felxibilis és hatékony memóriában dolgozó algoritmusok sok esetben jóval több adatot feldolgozhatunk, mint amennyi fizikai memória áll a rendelkezésünkre gyorsabb állomány I/O műveletek nem szükséges átmeneti bufferek kezelése az OS végzi el helyettünk: gyors és megbízható több folyamat könnyen megoszthatja ugyanazt az állományt nem igényel további helyet a rendszer lapozási állományában (pagefile) BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
File-mapping Windows API HANDLE CreateFileMapping( HANDLE hFile, LPSECURITY_ATTRIBUTES lpAttributes, DWORD flProtect, PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName ); HANDLE OpenFileMapping( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName ); LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, FILE_MAP_READ, FILE_MAP_WRITE, FILE_MAP_COPY DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap ); BOOL UnmapViewOfFile( LPCVOID lpBaseAddress ); BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Copy-on-write lapok adatok megosztására alkalmazottak a megosztott lapok eredetileg osztott és írásvédett módon vannak betükrözve a folyamatok alá az első írási kérés esetén egy kivétel generálódik az operációs rendszer elkészít egy másolatot a lapról, majd módosítja a lapozási struktúrákat csak azok a lapok másolódnak, amelyek effektíve módosítva is vannak tipikus példa a UNIX fork() BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Copy-on-write lapok – Írás előtt A. processz virtuális címterülete B. processz virtuális címterülete Fizikai memória eredeti adat 1. lap eredeti adat 2. lap 3. lap BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Copy-on-write lapok – Írás után A. processz virtuális címterülete B. processz virtuális címterülete Fizikai memória eredeti adat 1. lap módosított 2. lap 3. lap 2. lap másolata BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
CPU megszakítás kontroller CPU megszakítás kiszolgáló tábla Megszakítások 2 3 Külső hardver eszköz CPU megszakítás kontroller n CPU megszakítás kiszolgáló tábla EXPERIMENT: Examining Interrupt Internals Using the kernel debugger, you can view details of an interrupt object, including its IRQL, ISR address, and custom interrupt dispatching code. First, execute the !idt command and locate the entry that includes a reference to I8042KeyboardInterruptService, the ISR routine for the PS2 keyboard device: 31: 8a39dc3ci8042prt!I8042KeyboardInterruptService(KINTERRUPT 8a39dc00) To view the contents of the interrupt object associated with the interrupt, execute dt nt!_kinterrupt with the address following KINTERRUPT: kd> dt nt!_kinterrupt 8a39dc00 nt!_KINTERRUPT +0x000Type : 22 +0x002Size : 484 +0x004InterruptListEntry :_LIST_ENTRY [0x8a39dc04- 0x8a39dc04 ] +0x00cServiceRoutine : 0xba7e74a2 i8042prt!I8042KeyboardInterruptService+0 +0x010ServiceContext : 0x8a067898 +0x014SpinLock : 0 +0x018TickCount : 0xffffffff +0x01cActualLock : 0x8a067958 -> 0 +0x020DispatchAddress : 0x80531140 nt!KiInterruptDispatch+0 +0x024Vector : 0x31 +0x028Irql : 0x1a’’ +0x029SynchronizeIrql : 0x1a’’ +0x02aFloatingSave : 0’’ … In this example, the IRQL Windows assigned to the interrupt is 0x1a (which is 26 in decimal). Because this output is from a uniprocessor x86 system, we calculate that the IRQ is 1, because IRQLs on x86 uniprocessors are calculated by subtracting the IRQ from 27. We can verify this by opening the Device Manager, locating the PS/2 keyboard device, and viewing its resource assignments. Raise IRQL Lower IRQL KiInterruptDispatch Grab Spinlock Drop Spinlock ISR Address Read from device Spin Lock Acknowledge-Interrupt Dispatch Code Request DPC Windows specifikus Interrupt Object Driver ISR BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Megszakítások kezelése 1 max. 256 megszakítás az IDT táblázatban IDTR mutat az IDT tábla báziscímére és méretére (vektorok száma) a kivételek is ezen keresztül kezelődnek le BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Megszakítások kezelése 2 egy megszakítás esetén mindig törlődik a TF flag tracing esetén is működnek a megszakítások interrupt gate esetén törlődik EFLAGS-ben az IF is a megszakításkezelőt nem szakíthatja meg egy újabb kezelőrutin trap gate esetén NEM törlődik az IF flag BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Trap-ok kezelése Windows alatt Trap – egy mechanizmus, aminek a segítségével a processzor és az SO egy futó szál kontextusát blokkolni és elemezni tudja mindig átvált a végrehajtás kernel módba megszakítások – aszinkron lekezelés (non-blocking) kivételek – szinkron lekezelés (blocking) Interrupt service routines Interrupt service routines ISR-ek megszakítások megszakítás kiosztó rendszerhívás kiosztó System services rendszerhívások System services rendszer függvények hardver és szoftver kivételek Exception handlers Exception handlers kivétel kiosztó kivétel kezelők virtuális page-fault kivételek lapozó algoritmus (pager) BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Kernel módba váltás Window alatt a kód végrehajtása három ok miatt történhet kernel módban felhasználói alkalmazások kérésére rendszerfüggvények hívása (INT 2E / SYSENTER) a kernel módbeli kód ez esetben a hívó szál és processz kontextusában fut a hardvereszközök megszakításainka kiszolgálására a meszakításkiosztó (interrupt dispatcher) meghívja a megszakításkezelő eljárást (ISR, interrupt service routine) az ISR a megszakított szál kontextusában fut („arbitrary thread context”) egy ISR gyakran kezdeményezi egy DPC (deferred procedure call) végrehajtását, amely szintén kernel módban fut a Windows meghosszabbítja a megszakított szál CPU időszeletét dedikált kernel-módbeli „dolgozó” szálak vannak olyan szálak amelyek mindig kernel módban működnek (pl. I/O completion worker threads) ezek ugyanúgy vannak ütemezve, megszakítva stb. mint bármilyen más felhasználói szál BBTE, Alkalmazások és operációs rendszerek optimizálása 2006
Köszönöm a figyelmet! BBTE, Alkalmazások és operációs rendszerek optimizálása 2006