Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Píšeme operační systém: přerušení

Minule jsme si vytvořili funkční boot disketu. Dnes si v našem seriálu o vnitřnostech operačního systému rozebereme jednu z vlastností procesoru, kterou je obsluha přerušení.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Přerušení

Přerušení (interrupt) je schopnost procesoru přerušit právě vykonávaný program a začít vykonávat jiný program (obsluhu přerušení). Přerušení se začalo implementovat do procesorů z důvodu obsluhy periferii – přesněji V/V zařízení. Procesor je mnohem rychlejší než ostatní hardware, a tak kdyby se zabýval pouze obsluhou periferie, byl by v danou chvíli nevyužit a většinu svého procesorového času by strávil ve smyčce čekáním na daný hardware. V dnešní době se přerušení využívá mnohem víc při přepínání procesů. Takový jeden pohyb myší vyvolá přerušení hardwarové, které obslouží daný driver, ten následně pošle informaci jádru, to pošle informaci o změně na ploše a aktivní aplikaci, která například reaguje zvýrazněním odkazu. Vždy musí dojít k přerušení, neboť se měnil program, který vykonával danou činnost. V minulé díle jsme si na příkladu ukázali volání služeb BIOSu pomocí přerušení (instrukce INT).

Přerušení v architektuře x86 se vyvolá dvěma základními způsoby: Software-generated (softwarově), a to pří dekódování instrukce INT n (zmíněné volání BIOSu). A External-hardware generated (hardwarově), tedy vyvolané vnějším okolím. To se dále rozděluje na NMI (Non Maskable Interrupt) nemaskovatelné a na INTR (INTerrupt Request). Vše shrnuto v tabulce:

  • Software-generated (softwarové)
  • External-hardware generated (hardwarové)
    • NMI (Non Maskable Interrupt)
    • INTR (INTerrupt Request)

Software generated

Softwarová přerušení vznikají v jediném případě, a to když procesor narazí na instrukci INT n, kde n je vektor přerušení v rozsahu 0–255, tedy INT 0h – INT 0ffh. Vyžívá se k volání služeb operačního systému. Tento typ přerušení nelze maskovat.

External-hardware generated

Když jsem v minulém odstavci definoval toto přerušení jako vyvolané mimo procesor, nebyla to úplně pravda, protože do hardwarového přerušení se řadí tzv. Internal HW, která vznikají při vnitřní chybě kódu, např. dělení nulou, špatná instrukce. Externě vyvolané přerušení nastává při žádosti ze vstupu (vnější hardware) nebo chybě matematického koprocesoru.

INTerrupt Request

Je typ signálu přerušení, které lze tzv. maskovat, a to znamená, že pokud je bit IF (Interrupt Enable Flag) v příznakovém registru nastaven na 0, přerušení generované signálem INTR se neprovede.

Non Maskable Interrupt

Je-li typ signálu přerušení, které naopak nelze maskovat, tehdy se nezávisle na bitu IF se po přijetí signálu MNI přerušení provede.

Obsluha přerušení

Co se tedy stane, když procesor obdrží žádost o přerušení? Nejprve zkontroluje, jestli se daný signál bude maskovat a pokud ne, přeruší právě vykonávaný program a začne vykonávat program obsluhy přerušení, to v následujícím pořadí:

1. Na zásobník se uloží příznakový registr Flags
2. Příznaky IF a TF se vynulují
3. Na zásobník se uloží registr CS

4. Registr CS se naplní hodnotou obsluhy přerušení
5. Na zásobník se uloží registr IP
6. Registr IP se naplní hodnotou obsluhy přerušení

Interrupt Vector Table

Aby procesor věděl, jaké hodnoty má uložit do registrů CS,IP a hlavně, aby mohl rozlišovat různé druhy přerušení, existuje IVT ( tabulka vektorů přerušení ). Je to tabulka ukazatelů na příslušné obsluhy, obsahuje tedy hodnoty CS a IP volaných programů. IVT je uložená na fyzickém začátku paměti, tedy na adrese 0000h:0000h, jak jsme již zmínili obsahuje 256 položek ( řádků ) a každá má délku 4B. Celá tabulka má délku 1KB až po adresu 0000h:0400h. První dva byte řádku obsahují offset daného přerušení a druhé dva byte segment.

Rozložení v paměti
Adresa: tabulka: přerušení:
0000h:0000h offset:segment INT 0
0000h:0004h offset:segment INT 1
0000h:0008h offset:segment INT 2
0000h:03FCh offset:segment INT 0FFh

Návrat z obsluhy přerušení provádí instrukce IRET ( Interrupt RETurn ). Tato instrukce načte z zásobníku „staré” IP,CS a Flags a tím předá kontrolu zpět do volajícího programu. V následujícím pořadí:
1. Ze zásobníku se načte IP
2. Ze zásobníku se načte CS
3. Ze zásobníku se načte Flags

Vyhrazená přerušení

Procesor 8086 má 5 rezervovaných přerušení:
INT 0h nastává při dělení nulou, a to instrukcemi DIV a IDIV.
INT 1h nastane po provedení instrukce, když je bit TF ( Trap Flag ) v příznakovém registru nastaven. Jde o tzv. krokovací režim.
INT 2h nastává při přijetí vnějšího NMI.
INT 3h se generuje, když procesor narazí na jedno-slabikovou ( 1B ) instrukci INT 3 se strojovým kódem 0CCh. Používá se k ladění programů.
INT 4h pokud je OF ( Overflow Flag ) nastaven a procesor narazí na instrukci INT0, provede se následující přerušení.
Všechny tyto přerušení můžeme také generovat softwarově uvnitř programu.

V dnešní ukázce si ukážeme, jak nastavit naši vlastní obsluhu přerušení, obsluhující přerušení INT 0  – dělení nulou. Princip při nastavování rutiny všech 256-přerušení je stejný, jde pouze o změnu IVT tabulky. Jako v minulém díle pracujeme v reálném režimu, a k ukázce nám bude stačit boot sector. Funkčnost obsluhy jednoduše vyzkoušíte změnou z dělení nulou na jinou hodnotu.

; preruseni.asm

org 0x7c00  ;nastaveni segmentu

jmp main

;promene

boot_zpr db 'Start ...',13,10,0
chyba_zpr db 'Deleno nulou',13,10,0
int_zpr db 'Nastaveno preruseni.',13,10,0
konec_zpr db 'Konec programu.',13,10,0
bootdev db 0

zprava:   ;funkce na vypis na obrazovku
lodsb
or al,al
jz short zprava_konec
mov ah,0eh
mov bx,0007h
int 10h
jmp zprava
zprava_konec:
ret

main:
cli
mov ax,9000h
mov ss,ax
mov sp,0xffff     ;nastaveni zasobniku
sti

mov [bootdev],dl  ;dl = zarizeni ze ktereho je bootovano

mov ax,0
mov ds,ax
mov si,boot_zpr   ;vypis boot zpravy
call zprava

mov word [ds:0h*4],obsluha ;nastaveni obsluhy preruseni
mov word [ds:0h*4+2],0
jmp umela_chyba

obsluha:                       ;nastane pri deleni 0
mov si,chyba_zpr
call zprava
iret

umela_chyba:
mov si,int_zpr
call zprava
mov bx,0   ; deleni nulou
div bx
mov si,konec_zpr
call zprava

smycka:
jmp smycka      ;restart

times 510-($-$$) db 90h   ;sector musi byt dlouhy 512B

dw 0xaa55         ;oznaceni boot sectoru 

Kód přeložíme a nahrajeme na disketu:

nasm -o preruseni.bin -f bin preruseni.asm
dd if=preruseni.bin of=/dev/fd0 bs=512 

Školení: Pokročilejší kurz jazyka Java

Java je multiplatformní programovací jazyk, který vytvořila a vyvíjí společnost Sun. Java je silný, objektově orientovaný jazyk se širokou komunitou, nabízející především vysokou produktivitu vývoje.

  • Práce s řetězci
  • Regulární výrazy
  • Kolekce
  • Generiky
  • Smyčka typu "for" ve verzi Java 1.5
  • Výčty
  • Vlákna, synchronizace
  • Polymorfismus, RTTI
  • Java Beany
  • JDBC (práce s databázemi)
  • GUI (knihovny AWT a Swing)
  • Java na serveru (servlety, JSP)

Podrobnější informace a přihláška

Ohodnoťte jako ve škole:
Průměrná známka 3,18

Přehled názorů

To je sranda
INT 20. 2. 2006 02:42
Nový
├ 
Re: To je sranda
Culibrk 20. 2. 2006 08:46
Nový
│
├ 
Re: To je sranda
glx 20. 2. 2006 09:23
Nový
│
│
└ 
Re: To je sranda
mh 20. 2. 2006 10:26
Nový
│
│
 
├ 
Re: To je sranda
glx 20. 2. 2006 16:42
Nový
│
│
 
└ 
Re: To je sranda
Marv 26. 2. 2006 16:55
Nový
│
└ 
Re: To je sranda
ondra 20. 2. 2006 10:55
Nový
│
 
├ 
Re: To je sranda
bufly 20. 2. 2006 16:06
Nový
│
 
└ 
Re: To je sranda
PaJaSoft 26. 2. 2006 21:42
Nový
└ 
Re: To je sranda
František Ryšánek 20. 2. 2006 15:02
Nový
Obsluhu preruseni jsem programoval
BLEK. 20. 2. 2006 03:54
Nový
├ 
Re: Obsluhu preruseni jsem programoval
Jakub Hegenbart 20. 2. 2006 04:03
Nový
├ 
Re: Obsluhu preruseni jsem programoval
mtd 20. 2. 2006 09:05
Nový
│
├ 
Re: Obsluhu preruseni jsem programoval
anonymní uživatel 20. 2. 2006 13:39
Nový
│
├ 
Re: Obsluhu preruseni jsem programoval
BLEK. 20. 2. 2006 14:48
Nový
│
│
├ 
Re: Obsluhu preruseni jsem programoval
bufly 20. 2. 2006 16:13
Nový
│
│
│
└ 
Re: Obsluhu preruseni jsem programoval
Jakub Hegenbart 20. 2. 2006 16:57
Nový
│
│
├ 
Re: Obsluhu preruseni jsem programoval
Jakub Hegenbart 20. 2. 2006 16:52
Nový
│
│
└ 
Re: Obsluhu preruseni jsem programoval
Kid 20. 2. 2006 18:45
Nový
│
│
 
└ 
Re: Obsluhu preruseni jsem programoval
BLEK. 21. 2. 2006 00:32
Nový
│
└ 
Re: Obsluhu preruseni jsem programoval
faha 20. 2. 2006 16:31
Nový
├ 
Re: Obsluhu preruseni jsem programoval
Ondra 20. 2. 2006 18:38
Nový
│
└ 
Re: Obsluhu preruseni jsem programoval
BLEK. 20. 2. 2006 19:45
Nový
│
 
├ 
Re: Obsluhu preruseni jsem programoval
Jakub Hegenbart 20. 2. 2006 20:19
Nový
│
 
└ 
Re: Obsluhu preruseni jsem programoval
Zden 20. 2. 2006 20:20
Nový
│
 
 
└ 
Re: Obsluhu preruseni jsem programoval
BLEK. 21. 2. 2006 00:30
Nový
└ 
Re: Obsluhu preruseni jsem programoval
Ondra 20. 2. 2006 18:38
Nový
Jeste jedna instrukce generujici int
Pavel Tišnovský 20. 2. 2006 08:49
Nový
└ 
Re: Jeste jedna instrukce generujici int
mtd 20. 2. 2006 10:04
Nový
Perex
Lukáš Zapletal 20. 2. 2006 11:04
Nový
└ 
Re: Perex
bufly 20. 2. 2006 16:17
Nový
Změna vektoru přerušení
Frn 20. 2. 2006 11:10
Nový
doufam, ze to dobre dopadne
laloch 20. 2. 2006 13:51
Nový
└ 
Re: doufam, ze to dobre dopadne
BLEK. 20. 2. 2006 14:46
Nový
 
├ 
Re: doufam, ze to dobre dopadne
laloch 20. 2. 2006 16:01
Nový
 
└ 
Re: doufam, ze to dobre dopadne
PaJaSoft 26. 2. 2006 21:45
Nový
 
 
└ 
Re: doufam, ze to dobre dopadne
ondra 28. 2. 2006 15:21
Nový
V/V?
yossarian 20. 2. 2006 14:57
Nový
├ 
Re: V/V?
deda.jabko 20. 2. 2006 16:29
Nový
│
└ 
Re: V/V?
xxx 20. 2. 2006 18:05
Nový
└ 
Re: V/V?
Jakub Hegenbart 20. 2. 2006 19:20
Nový
 
├ 
Re: V/V?
yossarian 20. 2. 2006 21:29
Nový
 
│
└ 
Re: V/V?
Jakub Hegenbart 21. 2. 2006 00:51
Nový
 
│
 
└ 
Re: V/V?
yossarian 21. 2. 2006 22:48
Nový
 
│
 
 
└ 
Re: V/V?
Jakub Hegenbart 21. 2. 2006 23:06
Nový
 
└ 
Re: V/V?
Farin 22. 2. 2006 00:12
Nový
 
 
└ 
Re: V/V?
Jakub Hegenbart 22. 2. 2006 01:12
Nový
Smysl seriálu?
Viktor 23. 2. 2006 01:44
Nový
└ 
Re: Smysl seriálu?
Lama 24. 2. 2006 11:47
Nový
 
└ 
Re: Smysl seriálu?
Viktor 24. 2. 2006 16:29
Nový
Bude pokracovani???
Programator 17. 8. 2006 15:11
Nový
pisu OS...
Tomáš Crhonek 3. 9. 2007 12:43
Nový
└ 
Re: pisu OS...
Fobia 12. 11. 2009 21:56
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem