33.4.5. Chráněný mód Z80

Mikroprocesor Z80, nemá žádný chráněný mód. Ať již uživatelský program, nebo operační systém, můžou pracovat s libovolnou součástí počítače bez omezení. O tom, jak zavést chráněný mód je tento článek.

Nejdříve se zmíním, k čemu je vlastně chráněný mód. Procesor který rozlišuje mezi chráněným módem a uživatelským módem omezuje programy v uživatelském módu v možnosti manipulovat libovolně s celým počítačem. Tato možnost je vyhrazena jen pro programy běžící v chráněném módu, což je například jádro operačního systému.

Není-li přímo v procesoru implementována logika chráněného módu, zůstává nám jediná možnost. Implementovat tuto logiku vně procesoru. Nemůžeme tak program v uživatelském módu omezit v instrukcích, ale můžeme mu efektivně zamezit v manipulaci s připojeným hardware. To učiníme například blokováním I/O pokud není procesor v chráněném módu.

Logika přepínání mezi chráněným a uživatelským módem je tedy vystavena kolem jednobitového registru PMR (Processor Mode Register). Reší dvě základní otázky. Jak zajistit bezpečné přepnutí z uživatelského módu do chráněného módu, a jak zajistit přepnutí z chráněného módu do uživatelského módu.

Protože do chráněného módu se přepínáme jen při volání služeb jádra, můžeme naši logiku napojit právě na tato volání. Stačí nám jediné, detekovat že dochízí k volání jádra.

Přiřaďme volání jádra instrukci RST 30, a popišme si jak toto volání probíhá. Uživatelský program, který chce použít službu jádra, provede nastavení parametrů volání. Jakým způsobem tak učiní nechme na později. Po nastavení těchto parametrů provede instrukci RST 30. Tato instrukce způsobí uložení čítače instrukcí PC na zásobník a přechod na adresu 0030h. Vykonání instrukce na adrese 0030h detekujeme jako provedení cyklu M1 s hodnotou 0030h na adresové sběrnici. Toto je přesně ten impulz, který použijeme k nastavení PMR registru na hodnotu 1.

Na adrese 0030h se nachází počátek programu pro obsluhu volání jádra. Abychom zamezili uživatelskému program v modifikaci tohoto prostoru, je v User Mode blokován zápis do paměti na těchto adresách.

FIXME:TBD

Přechod z uživatelského módu do chráněného módu se uskuteční pomocí instrukce RST 30. Tato způsobí vykonání kódu na adrese 0x0030. Elektronika detekuje vykonání instrukce na této adrese a změní stavp PMR na chráněný mód. Pameťový prostor na adresách 0030 až 0037 je mapován na elektroniku chráněného módu. To znamená že uživatelský program nemůže obsah těchto adres měnit. Program umístněný na těchto adresách musí bezpěčně zajistit dokončení přechodu do bezpečného módu.

                         ; Při načítání instrukce PUSH AF dojde dojde k přepnutí do chráněného módu.
			 ; Následující manipulace s registry v I/O prostoru tedy nebude blokována.    
0030:                    PUSH AF    ; uschování akumulátoru a příznaků na uživatelský zásobník

			 ; Nyní je třeba změnit mapování paměti a nastavit si stránku s jádrem
			 ; operačního systému.  Předpokládejme tedy že toto jádro je ve stránce
			 ; 44 a má být mapováno do prostoru PR0 (0000h - 3FFFh).
0031:                    LD A, 44   ; Do stránkového registru pro stránku 0
0033:                    OUT PR0    ; uložíme číslo stránky s jádrem

			 ; Skok na podprogram obsluhy bolání jádra.
0035: .. 00 06           JMP SUPER  ;



                         ; Obsluha přechodu do chráněného režimu
                  SUPER:
                         ; víme že PR0 obsahoval hodnotu CU_PR0
                         ; dokončíme mapování stránek OS
                         LD A, 81h
			 OUT PR1
			 LD A, 82h
                         OUT PR2
                         LD A, 83h
                         OUT PR3
                         ; uložíme si hodnotu SP do CU_SP
0600: ED 73 nn nn        LD (CU_SP), SP
                         
                         ; uschování hodnot registrů
			 LD SP, CU_REGS
                         PUSH BC, DE, HL, IX, IY
                         EXX AF
			 PUSH AF
                         EXX
                         PUSH BC, DE, HL
	  

Přepnutí z chráněného do uživatelského módu lze uskutečnit například přes I/O.

			; Přepnutí z chráněného do uživatelského módu a návrat
			; do uživatelského programu

			... obnovení PR registrů mapování paměti

			LD A, 1
			OUT PMR
	  

Jednou z funkcionalit kterou potřebujeme ještě vyřešit je obsluha přerušení. Protože uživatelský program může pomocí instrukce DI zakázat přerušení, je jediným způsobem jak používate přerušení nemaskovatelné přerušení NMI. To nás omezuje v možnostech obsluhy více přerušení, neboť je nutno programově zjišťovat zdroj přerušení.

Licence Creative Commons
Elektronika a počítače, jejímž autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .