Hallo zusammen,
ich habe auch ein kleines Interrupt-Problem: Wenn ich unten stehenden Code ausführe (als Kernel, egal von welcher Startadresse aus) meldet er mir eine Exception 16, aber das war's dann - sowohl innerhalb von Bochs als auch beim "echten" Booten von Diskette.
Würde mich ja erstmal nicht stören, aber warum erhalte ich keine weiteren Exceptions? Es bleibt immer bei der einzigen ersten!
Wäre gut, wenn mir jemand helfen könnte oder aber wenigstens bestätigen würde, dass mein Code soweit in Ordnung ist (oder auch nicht)...
Danke!
use16
; A20-Line enablen für Speicherzugriff >1MB.
call EnableA20Gate
; Interrupts disablen.
cli
; Hardware-Interrupts über PIC nach 20h.27h und 28h..2fh umbiegen.
mov al, 11h ; ICW1.
out 20h, al
out 0a0h, al
mov al, 20 ; ICW2.
out 21h, al
mov al, 28h
out 0a1h, al
mov al, 4 ; ICW3.
out 21h, al
mov al, 2
out 0a1h, al
mov al, 1 ; ICW4.
out 21h, al
out 0a1h, al
; IDT laden.
mov ecx, IDT_TR
lidt [ecx]
; GDT laden.
mov ecx, GDT_TR
lgdt [ecx]
; In Protected Mode wechseln.
mov ecx, cr0
or cl, 01
mov cr0, ecx
.pm_far_jmp:
db 0eah ; FAR-JMP-Befehl.
dw .pm_1 ; Offset im Zielsegment. Ist immer noch 0 - welch ein Glück!
dw GDT_Kernel_Code - GDT_BEGIN ; Deskriptor innerhalb der GDT.
; Im Protected Mode - daher use32!
use32
.pm_1:
mov ax, GDT_Kernel_Data - GDT_BEGIN
mov ds, ax ; DS mit Deskriptor laden.
mov es, ax ; ES mit Deskriptor laden.
mov fs, ax ; FS mit Deskriptor laden.
mov gs, ax ; GS mit Deskriptor laden.
; Stack liegt erstmal auch im normalen Datensegment, aber noch an gleicher Stelle.
mov ss, ax
mov esp, 9ffffh
; Bescheid geben, dass wir im Kernel sind.
mov si, msgInside
call WriteMessage
; Interrupts wieder frei geben.
sti
.STOP1: jmp .STOP1
Die Interrupt-Routinen für die Exceptions sehen bislang alle gleich aus (für "interrupt_nummer" einfach einen Wert 0 bis 31 angebend):
sti
pusha
mov eax, interrupt_nummer
push ds
push es
push fs
push gs
mov esi, msgException
call WriteMessage
pop gs
pop fs
pop es
pop ds
popa
cli
iret