Kontakty Webpage přednášky: – Slajdy (MS PowerPoint): –ftp://ulita.ms.mff.cuni.cz/predn/PRG017 Technické informace (manuály ap.): –ftp://ulita.ms.mff.cuni.cz/techdoc/index.html Maily:
Shrnutí bezpečnostních mechanismů Oblasti ochrany: –Ochrana paměti na úrovni segmentace na úrovni stránkování nebo jinak: ochrana kódu ochrana dat –Ochrana periferií globální - ochrana celého I/O prostoru a souvisejících oblastí architektury (především systém přerušení) selektivní - ochrana jednotlivých míst I/O prostoru –Ochrana systémových prostředků procesoru ochrana systémových registrů ochrana systémových polí v aplikačních registrech (EFLAGS)
Privilegované instrukce LGDT Load GDT register. LLDT Load LDT register. LTR Load task register. LIDT Load IDT register. MOV (control registers)Load and store control registers. LMSW Load machine status word. CLTS Clear task-switched flag in register CR0. MOV (debug registers)Load and store debug registers. INVD Invalidate cache, without writeback. WBINVD Invalidate cache, with writeback. INVLPG Invalidate TLB entry. HLT Halt processor. RDMSR Read Model-Specific Registers. WRMSR Write Model-Specific Registers. RDPMC Read Performance-Monitoring Counter. RDTSC Read Time-Stamp Counter.
Globální ochrana periferií I/O Sensitive (periferně citlivé?) instrukce: –IN, INS, OUT, OUTS, CLI, STI –lze je vykonat jen při splnění „IOPL-testu“: CPL IOPL –v případě instrukcí IN, INS, OUT, OUTS lze IOPL-test „obejít“ pomocí selektivních ochraných mechanismů Další instrukce se vztahem k I/O ochraně: –instrukce POPF a IRET : jako I/O sensitive vzhledem k IF jako priviligovaná vzhledem k IOPL V obou případech jde o „měkkou“ variantu: při nesplnění prioritní podmínky se NEVYVOLÁ výjimka, ale příslušná hodnota se nezmění Příklad: EFLAGS=0x2202(IOPL=2,IF=1),[ESP]=0x1007(IOPL=1,IF=0),CPL=1 POPF EFLAGS=0x2007(IOPL=2,IF=0)
Selektivní ochrana I/O míst Spíše selektivní ne-ochrana: –Selektivně lze určit I/O místa přístupná pomocí instrukcí IN, INS, OUT, OUTS bez ohledu na hodnotu IOPL Bitmapa I/O prostoru v TSS –0 = povolení přístupu –1 nebo nepřítomnost bitu = zákaz přístupu –za koncem platné části tabulky (před limitem TSS!) je požadován ukončovací byte=0xFF Charakteristika: –Nemá vliv na přístup k systému přerušení ( IF ) –Nemá smysl pro tásky s globálním přístupem k I/O ( CPL IOPL ) –Je vhodná pro tásky s dobře definovaným omezeným přístupem do I/O prostoru –Je NUTNÁ pro V86 tásky (ignorují globální IOPL mechanismus)
Ladící podpora Několik nezávislých mechanismů: –Krokování programu - příznak EFLAGS[TF] –Speciální instrukce (a vektor přerušení) pro kódování jednobytového breakpointu - INT 3 –Tzv. HW-breakpointy (instrukční, datové, pro Pentium+ i I/O) - registry DRx –Možnost sledovat v ladícím systému přepínání tásků - příznak T v TSS –PentiumPro+: Prostředky pro určení posledního skoku, vyjímky n. přerušení; monitorování skoků vyvoláním ladící výjimky ap. - vyhrazené MSR s –Pentium+: prostředky pro statistické sledování chování kódu - vyhrazené MSR s
Krokování programu Krokování programu umožňuje nastavení příznaku EFLAGS[TF] = 1 Procesor generuje ladící výjimku PO každé instrukci, která měla PŘED začátkem vykonávání nastaven příznak TF jedná se o hlášení instrukce nulující příznak TF ještě vyvolá výjimku Příznak TF je automaticky nulován při průchodu branou přerušení obslužné rutiny přerušení se vykonávají nekrokovaně při návratu z přerušení je krokovací režim obnoven znovunastavením příznaku TF při vyzvednutí registru EFLAGS ze zásobníku
SW breakpointy Jsou nejčastěji realizovány vkládáním instrukcí typu INT n do kódu Pro instrukci INT 3 existuje jednobytový kód (0xCC) - ostatní instrukce typu INT n mají pouze dvoubytové kódování
Ladící registry a HW breakpointy Pomocí ladících registrů DRx je možno zadat až 4 HW breakpointy Adresy breakpointů jsou určeny obsahem registrů DR0 - DR3 : Obsahem registrů DR0 - DR3 je LINEÁRNÍ adresa!
Registr DR7 - řídící registr ladícího systému Význam hodnot polí „R/W“: –00Instrukční breakpoint (Fault) –01Datový breakpoint - zápis (Trap) –10I/O breakpoint (Pentium+; Trap) / Nedefinováno (386, 486) –11Datový breakpoint - čtení n. zápis (Trap) Význam hodnot polí „LEN“: –001 byte (jediná povolená hodnota pro instrukční breakpoint) –012 byte –10Nedefinováno –114 byte
Registr DR6 - stavový registr ladícího systému Nastavením bitových polí v registru DR6 procesor signalizuje příčinu vzniku ladící výjimky Je základním (a jediným) zdrojem informace pro obslužnou rutinu ladící výjimky
Instrukční HW breakpointy a příznak RF Problém: restart instrukce s instrukčním breakpointem Řešení: příznak EFLAGS[RF] (Restart Flag): –Je-li nastaven (=1), procesor negeneruje ladící výjimku pro instrukční breakpointy –Procesor příznak RF nuluje po úspěšném vykonání každé instrukce s výjimkou instrukce IRETD a instrukcí, které způsobily přepnutí tásků ( JMP, CALL, INT ) –Tyto instrukce jsou také JEDINÝM způsobem, jak příznak RF nastavit 16-bitová instrukce IRET příznak RF nemění ( RF je 17. bit registru EFLAGS ) Stejně tak ho nemění instrukce POPF, a to ani ve své 32-bitové podobě ( POPFD )! –Speciální pravidla platí i pro zjišťování hodnoty příznaku RF : instrukce PUSHF(D) ho na zásobník NEULOŽÍ (uložená hodnota je vždy 0) –Procesor pravděpodobně automaticky nastavuje příznak RF před obsluhou každé výjimky typu chyba (Fault), kromě ladící výjimky generované pro instrukční breakpoint
Někdy to prostě nevyjde... Kolem chování příznaku RF se vznáší mlha: –„The processor does not set the RF flag in the copy of the EFLAGS register pushed on the stack before entry into any fault handler.“ (manuál Pentia) –„The processor sets this flag (RF) prior to calling an exception handler for any exception except a debug exception and prior to calling an interrupt handler when a string instruction has been interrupted.“(manuál Pentia Pro) –„The processor sets the RF flag automatically prior to calling an exception handler for any fault-class exception except a debug exception that was generated in response to an instruction breakpoint.“(manuál Pentia II, III)
Ladící systém a HW podpora multitáskingu Při nastavení příznaku T v TSS tásku dojde k vyvolání ladící výjimky při předání řízení do tásku Opět mlha: –„The exception occurs after control has passed to the new task, but before the first instruction of that task is executed.“(manuál Pentia) –„This exception is generated after program control has passed to the new task, and after the first instruction of that task is executed.“(manuál Pentia Pro+)