Hallo zusammen.
Ich hab jetzt alle Möglichkeiten (zu Fehlern), die ich im Forum gefunden habe, getestet und den Kernel 100 Mal nach Fehlern abgesucht. Dabei sind aber dennoch zwei Fragen aufgetaucht.
1.) Wo soll ich den Stack am besten hintun ? Jetzt hab ich ihn bei 0x2FFFF. Wobei mein Kernel bei 0x10000 ist.
2.) Wenn ich mein OS in Bochs laufen lasse, erscheint diese Meldung:"exeption(): 3rd (13) exeption with no resolution shutdown status is 00h, resetting" Danach startet Bochs mein Os neu und kaum eine Sekunde später geschiet das ganze wieder von Vorne. Nachdem das dann ca. 30 Mal passiert ist, schreibt Bochs:"Too many registred timers. Press Enter...." Wo liegt der Fehler für diese Exeption
Hier nochmals den neuen Code:
[BITS 16]
;16 Bit Code erstellen
jmp start ;GDT überspringen
NULL_Desc:
dd 0
dd 0
CODE_Desc:
dw 0xFFFF ;Segmentgröße Byte 0/1
dw 0 ;Segmentbasisadresse Byte 0/1
db 0 ;Segmentbasisadresse Byte 2
db 10011010b ;Zugriffsberechtigungen
db 11001111b ;Zusatz + Segmentgröße Bits 16 - 19
db 0 ;Segmentbasisadresse Byte 3
DATA_Desc:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0
gdt:
Limit dw 0 ;Größe der GDT (wird später eingetragen)
Base dd 0
start_of_idt:
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
dw PMODE4, 8, 8E00h, 0
; Hardware Interrupts
dw PMODE5, 8, 8E00h, 0
end_of_idt:
start:
cli
;Interrupts ausschalten
mov eax, cs ;EAX auf derzeitiges Codesegment setzen
mov ds, eax ;DS auf Codesegment setzen
shl ax, 4 ;EAX mit 16 multiplizieren (Lineare Adresse des Codesegments errechnen)
mov [CODE_Desc+2], eax ;Lineare Adresse des Codesegmentes als Startadresse des Code- und Datendeskriptors eintragen
mov [DATA_Desc+2], eax
shr eax, 16
mov [CODE_Desc+4], al
mov [DATA_Desc+4], al
mov eax, cs ;Startadresse der GDT errechnen
shl eax, 4
add eax, NULL_Desc
mov [Base], eax ;Startadresse der GDT eintragen
mov [Limit], WORD gdt - NULL_Desc -1 ;Größe der GDT errechnen und eintragen
lgdt [gdt] ;GDT laden
mov eax, cr0 ;In den Protected Mode schalten, indem Bit 0 des CR0 Registers auf 1 gesetzt wird
or eax, 1
mov cr0, eax
db 0xea ;FAR-JUMP zum Codesegment
dw PMODE
dw 0x8
[BITS 32] ;32 Bit Code erstellen
PMODE:
mov WORD [CODE_Desc+2], 0 ;Code Segmentstartaddresse auf 0 setzen
mov WORD [DATA_Desc+2], 0 ;Daten Segmentstartadresse auf 0 setzen
mov BYTE [CODE_Desc+4], 0 ;Code Segmentstartaddresse auf 0 setzen
mov BYTE [DATA_Desc+4], 0 ;Daten Segmentstartadresse auf 0 setzen
mov eax, 2 ;Selektor für das Datensegment erstellen
shl eax, 3
mov ds, ax ;Daten- Stack- und Extrasegment mit Datensegmentdeskriptor laden
mov ss, ax
mov es, ax
mov eax, 0 ;FS und GS mit Null-Deskriptor laden
mov fs, ax
mov gs, ax
mov esp, 0x2FFFFF ;Stack setzen
idt_pointer:
dw end_of_idt - start_of_idt - 1
dd start_of_idt
lidt [idt_pointer]
; Neuinit der Interrupt-Controller, sowie neu Setzen des Interrupt Mappings
mov al,00010001b ; kaskadierte Interrupt-Controller und Flankentriggerung an beider Controller
out 020h,al
out 0a0h,al
; neuer IRQ-Vektor für den ersten Controller einstellen neuer Wert => IRQ0..7 -> INT20h..27h
mov al,20h
out 021h,al
; neuer IRQ-Vektor für den zweiten Controller einstellen neuer Wert => IRQ8..15 -> INT28h..2Fh
mov al,28h
out 0a1h,al
; Kaskadierung beider Controller einstellen
mov al,00000100b ; Kaskadierung über IRQ2
out 021h,al
mov al,00000010b ; Kaskadierung über IRQ2
out 0a1h,al
; PIC auf Intel-Umgebung und manuelle Int.- Beendigung einstellen
mov al,00000001b
out 021h,al
out 0a1h,al
sti
PMODE2:
jmp 0x8:0x10000 + PMODE2 ;Endlosschleife
PMODE4:
pusha
push gs
push fs
push ds
push es
pop es
pop ds
pop fs
pop gs
popa
iret
PMODE5:
pusha
push gs
push fs
push ds
push es
mov al,20h
out 20h,al
pop es
pop ds
pop fs
pop gs
popa
iret
jmp 0x8:0x10000 + PMODE2
Vielen Dank im Vorraus
Nooooooooooos