Autor Thema: protected-mode, idt, interrupts  (Gelesen 4354 mal)

middle_endian

  • Beiträge: 25
    • Profil anzeigen
Gespeichert
« am: 20. July 2007, 10:57 »
hi,
ein neues problem macht mir zu schaffen. und zwar gehts um das laden der interrupt descriptor table und das zuweisen einer interrupt service routine. hab bis jetzt nur einen eintrag für den interrupt 0 in meiner idt. wenn ich den interrupt im code aufrufe, rebootet bochs ohne in die interrupt service routine zu springen.
%include "config32.asm"

[BITS 16]
org 0x7c00

init:
      xor ax, ax
      mov ds, ax
      mov es, ax

      mov ax, 0100h
      mov ss, ax
      mov ax, STACK_ADR
      mov sp, ax ; relative adressing to stack segment


      ;; set gdt
      cli                                       ; disable interrupts
      lgdt [gdt_desc]
      mov eax, cr0
      or eax, 1
      mov cr0, eax
      jmp gdt_code:pmode


[BITS 32]
pmode:
      mov ax, gdt_data
      mov ds, ax
      mov ss, ax
      mov es, ax
      mov esp, STACK_ADDRESS

      ;; fill up idt
      lidt [idt_desc]            ; load idt
      mov eax, isr0           
      mov [idt], ax             ; assign lower word
      shr eax, 16               
      mov [idt+6], ax         ; assign upper word   (**)
      sti                             ; reenable interrupts
      int 0                          ; interrupt


isr0:
   cli
   hlt
   iret


;; -----------------------------
;; global descriptor table
;; -----------------------------
gdt:
      dd 0
      dd 0

gdt_code equ $-gdt
      dw 0ffffh
      dw 0
      db 0
      db 10011010b
      db 11001111b
      db 0

gdt_data equ $-gdt
      dw 0ffffh
      dw 0
      db 0
      db 10010010b
      db 11001111b
      db 0
gdt_end:

;; gdt descriptor
gdt_desc:
      dw gdt_end-gdt-1
      dd gdt
     
;; --------------------------------
;; interrupt descriptor table
;; --------------------------------
;; idt descriptor
idt_desc:
      dw idt_end-idt-1
      dd idt

idt:
      dw 0                 ; filled up at runtime: isr0 & ffffh
      dw gdt_code    ; gdt selector
      dw 8e00h         ; access, attributes
      dw 0                 ; filled up at runtime: isr0 >> 16
idt_end:

times 510-($-$$) db 0
      dw 0aa55h
;; size = 512B


über den inhalt von idt meint bochs:

<bochs:29> info idt 0
Interrupt Descriptor Table (base=0x00007cb6):
IDT[0x00]=??? descriptor hi=0x00000000, lo=0x00087c7e

wo könnte das problem begraben liegen?

EDIT: argl, hatte bei (**) vorher 4 statt 6 stehn. dadurch hab ich mir natürlich die access/attribut-flags zerschossen.
bitte posting entweder löschen, oder falls der code hilfreich erscheint halt einfach stehn lassen :)
« Letzte Änderung: 20. July 2007, 11:07 von middle_endian »

 

Einloggen