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


Anmelden zum Antworten