Interrupt
-
Ich möchte einen Monolithischen Kernel schreiben,
Bis jetzt kann der Kernel nur rebooten,
wie kann man den Interrupts in den Kernel einbauen.
-
Nur fuer den Fall, dass du dich wunderst, weil niemand antwortet: Deine Frage ist unzureichend gestellt.
Kleiner Tipp:
Fuer welches System (CPU) programmierst du?
Um was fuer Interrupte handelt es sich (Hardware, Software ...)?
In welchem Prozessormodus werden die Interrupte aufgerufen und in welchem sollen sie laufen?
...
Meine Kristallkugel streikt leider Hitzebedingt.
-
Der Prozessor ist ein 8086er
es soll ein Hardwareinterupt werden
es ist eine ISR(Interrupt Service Routine)_int0x21: _int0x21_ser0x01: ; funktion 0x01 cmp al, 0x01 ; funktion 0x01 angefragt? jne _int0x21_end ; n䣨ste Routine checken _int0x21_ser0x01_start: lodsb ; n䣨stes Byte laden or al, al ; 0-Byte? jz _int0x21_ser0x01_end mov ah, 0x0E ; BIOS Teletype mov bh, 0x00 ; Page 0 mov bl, 0x07 ; Text-Attribute int 0x10 ; BIOS-Call jmp _int0x21_ser0x01_start _int0x21_ser0x01_end: jmp _int0x21_end _int0x21_end: iret
-
Also RealMode Software Interrupt =>
Die Interrupttabelle liegt im RM an Adresse 0000:0000.
Diese Tabelle enthaelt 256 Eintraege (fuer jede Interruptnummer einen), beginnend mit dem Eintrag fuer int 0.
Jeder Eintrag besteht einfach aus einem far-Pointer (32Bit-Wert; untere 16Bit=Offset, obere 16Bit=Segment der ISR).
Folglich brauchst du einfach den Far-Pointer zu deiner ISR an die Adresse 0000:4*0x21 zu schreiben und fertig.BTW: Eine ISR sollte keine Register veraendern, ausser fuer definierte Rueckgabewerte.
-
Der Pointer
push dx push es xor ax, ax mov es, ax cli mov word [es:0x21*4], _int0x21 ; Pointer auf den Handler mov [es:0x21*4+2], cs ; Pointer auf CS sti pop es pop dx
Der Kernel
mov ax, 1000h ; Segmentregister updaten mov ds, ax mov es, ax start: mov si, msg call putstr ; Schicke Bootmessage :) mov si,msg_boot call putstr ; Noch eine Message :D call getkey ; Warte auf einen Tastendruck jmp reboot ; Reboot ; ------------------------------------------------- ; Funktionen und Variablen ; ------------------------------------------------- msg db "Welcome to MFOS 0.1",13,10,0 msg_boot db "Press any key...",10,0 ; Stringausgabe putstr: lodsb ; Byte laden or al,al jz short putstrd ; 0-Byte? -> Ende! mov ah,0x0E ; Funktion 0x0E mov bx,0x0007 ; Atrribut-Byte int 0x10 ; schreiben jmp putstr ; n䣨stes Byte putstrd: retn ; Warte auf einen Tastendruck getkey: mov ah, 0 ; Funktion 0 int 016h ; Ausf? ret ; Rebooten (HEX Dump). reboot: db 0EAh dw 0000h dw 0FFFFh
und wo baue ich meinen Pointer und Interrupt ein