Protected Mode einschalten, die 1034.
-
Das löst aber nicht das Problem, das beim Umschalten in den PM der liebe PC einen Reset auslöst. Es gibt nichts zu sehen!!!
Ciao...
-
Triple fault
-
Und was bedeutet Triple fault? Welche Ursachen hat das?
-
Eine Exception, während kein Exception Handler Installiert ist (in dienem Fall). Schau mal mit bochs z.B: nach, wo genau der code crasht und ob alle register korrekt gesetzt sind.
-
Danke für den Hinweis. Dummerweise gibt es unter bochs bereits vorher einen Fehler. Wenn das Initialisierungsprogramm geladen werden soll(aus dem 2. Sektor)beendet bochs die Emulation.
Ich könnte aber doch einen kleinen Exeptionhandler integrieren, der mir nur irgendwie ausgibt, welche Exeption ausgelöst wurde. Ich werde nochmal rumprobieren.
Ciao...
-
-
@Erhard Henkes:
Danke für den Link.Mittlerweile habe ich einige kleine Veränderungen vorgenommen. Nun gibt es keinen Reset mehr(zumindest unter bochs nicht), dafür passiert nun gar nichts mehr. Das A wird im PM nicht ausgegeben.
Ist vielleicht der 16- und 32-Bit-Mix die Ursache?
Ciao...
-
nochwas: ist das nicht ein bisschen übertrieben 64MB für Code und 64MB für Daten vorrauszusetzen? wenn es erst mal nur so für dich ist, ok. wenn du aber planst, dass dein programm auch wo anders laufen soll, dann sollte auf alle fälle vorher überprüft werden, ob der rechner überhaupt so viel RAM hat. und nochwas: wenn die basis-adi vom ersten seg 0 ist, dann solltest du vorher das BIOS-Datenseg wo anders hinkopieren (vorrausgesetzt, du brauchst daten davon) int-handler für timer und kbd musst du dann sowieso selber schreiben und dann kannst du ja auch bestimmen, wohin welche werte geschrieben werden
cu todo
-
Moin, Moin...
Ich habe nochmals Änderungen vorgenommen. Es erfolgt aber immer noch ein RESET nach Einschalten des PM. Ich begreife nicht wieso. Ich meine, dass mein Code nicht anders ist als die anderen Beispiele. Hier nochmal die Listings:
PM initialisieren
struc GDTSTRUC .limit resw 1 .base resd 1 endstruc segment .code USE16 org 010000h main: push cs pop ax mov ds, ax mov es, ax cli mov ss, ax mov sp, 0fffeh sti mov si, txtHallo call rm_stdout mov si, txtPMTry call rm_stdout ; eine 1 anzeigen zur Kontrolle mov ax, 0b800h mov es, ax mov bx, 00000h mov byte [es:bx], 49 call waitofkey ; A20 einschalten call Enable_A20 cli ; Nun wollen wir den Sprung wagen und uns in den PM stuerzen... db 066h lgdt [dword gdt_adr] ; eine 2 anzeigen zur Kontrolle (passiert aber nicht, vorher RESET) mov ax, 0b800h mov es, ax mov bx, 00000h mov byte [es:bx], 50 mov eax, cr0 or eax, 001h ; setzt PE-Bit (Bit 0) mov cr0, eax ; jmp dword 08h:10200h Sprung zum Mini-Kernel db 067h db 066h db 0eah dd 000010200h dw 00008h waitofkey: mov ah, 000h int 016h ret rm_stdout: mov ah, 00eh mov al, [si] or al, al jz rm_stdout_1 mov bl, 003h int 010h inc si jmp rm_stdout rm_stdout_1: ret ; Folgender Code aus Solar OS Enable_A20: call empty_8042 mov al,0D1h ; command write out 064h,al call empty_8042 mov al,0DFh ; A20 line is going to be on from now on out 060h,al call empty_8042 ret empty_8042: call Delay in al,064h ; 8042 status port test al,1 ; output buffer? jz no_output ; call Delay in al,060h ; yes, then read it jmp empty_8042 ; and of course we ignore it ;) no_output: test al,2 ; is input buffer full? jnz empty_8042 ; yes - loop ret Delay: jmp delay_01 delay_01: jmp delay_02 delay_02: ret txtHallo db 0dh, 0ah, 'Mini-Kernel geladen...' db 0dh, 0ah, 00h txtPMTry db 0dh, 0ah, 'Versuche den Protected Mode einzuschalten...' db 0dh, 0ah, 00h align 4 gdt_adr: istruc GDTSTRUC at GDTSTRUC.limit, dw 24 at GDTSTRUC.base, dd null_descriptor iend null_descriptor times 4 dw 0 code_descriptor dw 00400h ; Segmentlänge Bit 0...15 dw 00000h ; Basisadresse Bit 0...15 db 000h ; Basisadresse Bit 16...23 db 10011010b ; P = 1|DPL = 0|Segmentart = 1|Typ = Code, E/R|A db 11000000b ; G = 4049|386-Segment|0|0|Länge Bit 16...19 db 000h ; Basisadresse Bit 24...31 data_descriptor dw 00400h ; Segmentlänge Bit 0...15 dw 00000h ; Basisadresse Bit 0...15 db 000h ; Basisadresse Bit 16...23 db 10010010b ; P = 1|DPL = 0|Segmentart = 1|Typ = Data, R/W|A db 11000000b ; G = 4049|386-Segment|0|0|Länge Bit 16...19 db 000h ; Basisadresse Bit 24...31 times 512-($-$$)-6 db 0 db '#INIT#'
32-Bit-Code, Mini-"Kernel"
segment .code USE32 org 010200h ; aus Solar OS mov ecx, 80 * 24 mov edx, 0b8000h mov al, 021h ; space ascii char mov bl, 01Fh ; text color atribute cls_loop: mov byte [es:edx], al inc edx mov byte [es:edx], bl inc edx dec ecx or ecx, ecx jnz cls_loop mov edx, 0b8000h mov ebx, txtHallo ; Text ausgeben write_out: mov al, byte [es:ebx] or al, al jz stopp mov byte [es:edx], al add edx, 2 inc ebx jmp write_out stopp: jmp stopp txtHallo db 'Protected Mode...', 000h
Ich habe den 16 Bit und den 32 Bit Code nun geteilt. Welche Änderungen ich auch anbringe, es laüft nicht sondern stürzt nach lgdt ab. AAAAAAAArrrrrrrgggghhhhhh
Danke für eventuelle Hinweise. Ich bin reif für die Geschlossene!!!!!
-
..
-
Moinsen...
Danke, werde ich mal probieren.
Zu meinem Code: bochs gibt in seinem Ausgabefile als eip immer die Adresse des lgdt-Befehls an. Der Programmablauf kommt nicht über diesen Befehl hinaus.
Ciao...