Lowlevel
Lowlevel => OS-Design => Thema gestartet von: Hauke am 08. June 2005, 10:35
-
Ich hab noch ein paar Fragen zum ProtectMode einmal gibt es Speicheradressen, die reserviert sind (mit Ausnahme vom Videospeicher und dem Stack), wie im RealMode z. B. die Interrupt verctor tabel. Und jetzt noch eine Frage zu der IDT. Mann muss doch eine Routine Programmieren für die Exceptions 0-19. 20 - 31 sind doch reserviert also Nullen eintragen.
Und ein Int 32 Programmiert. Jetzt darf man doch "sti" machen und Int 32 aufrufen, nur bleibt er hängen und ich weiß nicht warum.
So sehen wichtige abschnitte meines Codes aus
sCODE equ 1000b
%macro makeIDT 3
dw %1
dw %2
db 0
db %3
dw 0
%endmacro
idts:
makeIDT IRQ_00, sCODE, 10001110b
makeIDT IRQ_01, sCODE, 10001110b
makeIDT IRQ_02, sCODE, 10001110b
makeIDT IRQ_03, sCODE, 10001110b
makeIDT IRQ_04, sCODE, 10001110b
makeIDT IRQ_05, sCODE, 10001110b
makeIDT IRQ_06, sCODE, 10001110b
makeIDT IRQ_07, sCODE, 10001110b
makeIDT IRQ_08, sCODE, 10001110b
makeIDT IRQ_09, sCODE, 10001110b
makeIDT IRQ_10, sCODE, 10001110b
makeIDT IRQ_11, sCODE, 10001110b
makeIDT IRQ_12, sCODE, 10001110b
makeIDT IRQ_13, sCODE, 10001110b
makeIDT IRQ_14, sCODE, 10001110b
makeIDT 0,0,0
makeIDT IRQ_16, sCODE, 10001110b
makeIDT IRQ_17, sCODE, 10001110b
makeIDT IRQ_18, sCODE, 10001110b
makeIDT IRQ_19, sCODE, 10001110b
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT IRQ_32, sCODE, 10001110b
idt:
Limiti dw 0
Basei dd 0
mov eax, cs ;Startadresse der IDT errechnen
shl eax, 4
add eax, idts
mov [Basei], eax
mov [Limiti], word idt - idts -1
lldt [idt]
IRQ_00:
xor al, al
jmp irqA
IRQ_01:
mov al, 1
jmp irqA
IRQ_02:
mov al, 2
jmp irqA
IRQ_03:
mov al, 3
jmp irqA
IRQ_04:
mov al, 4
jmp irqA
IRQ_05:
mov al, 5
jmp irqA
IRQ_06:
mov al, 6
jmp irqA
IRQ_07:
mov al, 7
jmp irqA
IRQ_08:
mov al, 8
jmp irqA
IRQ_09:
mov al, 9
jmp irqA
IRQ_10:
mov al, 10
jmp irqA
IRQ_11:
mov al, 11
jmp irqA
IRQ_12:
mov al, 12
jmp irqA
IRQ_13:
mov al, 13
jmp irqA
IRQ_14:
mov al, 14
jmp irqA
IRQ_16:
mov al, 16
jmp irqA
IRQ_17:
mov al, 17
jmp irqA
IRQ_18:
mov al, 18
jmp irqA
IRQ_19:
mov al, 19
jmp irqA
IRQ_32:
xor si, si
mov ax,3
shl eax, 3
mov ds, ax
mov cl, 'h'
mov [si],cl
inc si
inc si
mov cl, 'a'
mov [si],cl
inc si
inc si
mov cl, 'l'
mov [si],cl
inc si
inc si
mov cl, 'l'
mov [si],cl
inc si
inc si
mov cl, 'o'
mov [si],cl
inc si
inc si
h:
xor si, si
jmp h
irqA:
xor si, si
mov cl, al
mov ax,3
shl eax, 3
mov ds, ax
mov [si],cl
jmp irqA
(Der Selektor DS zeigt auf einen Video Deskreptator)
Und dann rufe ich Int 32 auf und nur der Cursor blinkt. :?:
-
Musst du nicht nach Interrupts ein IRET ausfuehren? Auch Exceptions sind Interrupts in gewissem Sinne und den Timerinterrupt musst du ja auch verarbeiten...
Einfach Nullen eintragen ist IMHO nicht gerade die beste Lösung...
Svenska
-
Also allgemein musst du alles belegen bis zu deinem Maxi-Wert, auch Exceptions brauchen nen Handle. Das STI und CLI ist meines Wissens nur um die IRQs zu sperren, also Exceptions gehen sowieso noch und softwareaufrufe glaub ich auch.
-
Mit dem Iret hab ich nicht gemacht, weil ich eine Dauerschleife ausführe.
Und muss man denn jetzt für die reservierten Exceptions Nullen schreiben?
Zum Code ich hab mich vertippt ich hab statt lidt lldt geschrieben, aber ein anderer Fehler war noch dar, nämlich die Falsche Offsetadressse was ich hiermit korrigiert habe
;vor dem PMode
mov eax, cs
shl eax, 4
mov si, idts
mov ecx, 33
idv:
xor edx,edx
mov dx, [si]
cmp dx, 0
je son
add edx, eax
mov [si], dx
add si, 6
shr edx, 16
mov [si], dx
inc si
inc si
loop idv
jmp schl
son:
add si, 8
loop idv
schl:
Aber wenn ich einen Fehler produziere, stürzt der Rechner ab, statt in die Dauerschleife.
Was ist den noch Falsch? :?:
-
Du darfst NICHT 0er schreiben, sondern brauchst für die belegten Interrupts auch eigene Handles!!!