PMODE: dpl > CPL - wo liegt der Fehler?
-
Also in meinem Bochs läuft der Kernel durch und steht nachdem er die Messages ausgegeben hat. Wie gefordert.
Edit die Bochsout.txt zeigt dass dohc irgendwas nicht stimmte. Der Prozessor ist nicht im PMode...
Aha...dein Kernel wird garnicht erfolgreich geladen...schick nächstes mal die volel Datei, ich hab nur den Loader in der .bin
[ Dieser Beitrag wurde am 23.04.2003 um 22:36 Uhr von TriPhoenix editiert. ]
-
Hab ich doch - die img Datei sind beide Dateien zusammen
-
Okay, was ich bisher an fehlern finden konnte:
- Die GDT-Adresse ist nicht in Ordnung, dort ist nämlich nur der Offset im Register drin, nicht Die komplette lineare Adresse. lgdt lädt als Basis 0x00000020 rein, richtiger wäre ja 0x00090020.
- Beim Patchen der Stellen im Datendeskriptor ist ein xor eax, eax hängen geblieben
- Du rufst im Protected Mode den Bios Interrupt 10 auf um eine Nachricht auszugeben. BIOS-Calls gehen im Protected Mode nicht mehr
-
Hm neee den INT benutz ich vor dem schalten in den pmode! Hmm wo ist der Fehler im Code? Ich gebe doch mit lgdtr mein struct an wo die Adresse steht an, oder nicht? Darf man xor eax,eax nicht verwenden
Danke für die Mühe
Kevin
-
Original erstellt von Surkevin:
Hm neee den INT benutz ich vor dem schalten in den pmode!Sorry, war ein lesefehler
Hmm wo ist der Fehler im Code? Ich gebe doch mit lgdtr mein struct an wo die Adresse steht an, oder nicht?
Nur den Offset innerhalb des Segmentes 9000. Musst halt einfach noch 90000 draufaddieren.
Darf man xor eax,eax nicht verwenden
Doch, aber nicht wenn du den wert von eax in der nächsten zeile noch brauchst
-
hmmm wieso 90000, vertippt?
-
Hmm ich habe jetzt folgende Veränderungen vorgenommen:
start:
mov ax, cs
mov ds, ax
mov es, ax
mov eax, des_null
add eax, 90000h
mov [global_table+GDTSTRUCT.base], eax
mov eax, 4 * 8
mov [global_table+GDTSTRUCT.limit], eaxund dann das xor ax,ax noch rausgenommen - jetzt ist der Fehler:
00000560063e[CPU ] jump_protected: gate type 14 unsupportedhmm komisch
Kevin
-
Original erstellt von Surkevin:
hmmm wieso 90000, vertippt?90000 weil der code im segment 9000 liegt. Die lineare Adresse dafür ist ja * 16 also 90000. Den Rest gucke ich mir morgen an
-
hmm oki
das is bestimmt dezimal also habe ich in meinem code add eax, 90000h durch add eax, 90000 ersetzt...der fehler ist nun
00000560063e[CPU ] jump_protected: gate type 0 unsupportedNochmal vielen Dank
Kevin
-
TriPhoenix kannst du dir vorstellen warum dieser Fehler kommt?
-
Original erstellt von Surkevin:
**hmm oki
das is bestimmt dezimal also habe ich in meinem code add eax, 90000h durch add eax, 90000 ersetzt...der fehler ist nun
**ahhh nicht dezimal *g* Ich vergesse imemr 0x bzw. h dranzuschreiben *g*
Im übrigen läuft es jetzt bei mir. Mit 0x90000 natürlich
[ Dieser Beitrag wurde am 24.04.2003 um 23:56 Uhr von TriPhoenix editiert. ]
-
Hm wieso das? Bei mir gehts nicht...kannst du mal den Code posten? Bei mir kommt mit 0x90000 Gate Type 14 unsupported!!
Mein Code:
[BITS 16] [ORG 0] jmp start PM db 'Schalten in Pmode',13,10,0 string db 'Hallo aus dem Pmode',13,10,0 struc GDTSTRUCT .limit: resw 1 .base: resd 1 endstruc global_table: istruc GDTSTRUCT at GDTSTRUCT.limit, dw 1 at GDTSTRUCT.base, dd 1 iend des_null dw 0000h dw 0000h db 00h db 00000000b db 00000000b db 0 des_code dw 9FFFh ;Größe 4096 Bytes entspr. 8 Sektoren dw 1 ;die ersten 5 Sektoren belassen und dann in den 6. schreiben db 1 db 10011010b ;Codesegment lesbar / ausführbar db 11000000b db 0 des_vram dw 4000h dw 8000h db 0Bh db 10010010b db 11000000b db 0 des_data dw 2000h dw 1 db 1 db 10010010b ;Datensegment lesbar / ausführbar db 11000000b db 0 des_kernel dw 0200h dw 1 db 1 db 10010010b db 11000000b db 0 message: lodsb or al,al jz done mov ah, 0Eh mov bx, 7 INT 10h jmp message done: retn start: mov ax, cs mov ds, ax mov es, ax mov eax, des_null add eax, 0x90000 mov [global_table+GDTSTRUCT.base], eax mov eax, 28h mov [global_table+GDTSTRUCT.limit], eax ;Adresse des Codesegments in den Deskriptor eintragen mov eax, 0 mov ax, cs shl eax, 04h mov [des_code+2], ax shr eax, 10h mov [des_code+4], al mov [des_code+7], ah ;Adresse des Datensegments in den Deskriptor eintragen mov ax,ds shl eax, 4 mov [des_data+2], ax shr eax,10h mov [des_data+4], al mov [des_data+7], ah lgdt [global_table] mov si, PM call message cli mov eax,cr0 or eax,1 xor eax,eax mov eax, 0x00000001 mov cr0,eax db 0eah dw pmode dw 8 pmode: loop_end: jmp loop_end
THX
Kevin
-
mov [global_table+GDTSTRUCT.base], eax mov eax, 28h mov [global_table+GDTSTRUCT.limit], eax
Waurm plötzlich 28h?
Im alten Code ists 4*8=32=20h.mov eax,cr0 or eax,1 xor eax,eax mov eax, 0x00000001 mov cr0,eax
Das kann man etwas kompaktieren, sieht aus wie debug-versuche
Was stehen bleiben muss ist:
mov eax,cr0 or eax,1 mov cr0,eax
Das sind eigentlich alle unterschiede zu dem was ich hier stehen habe. Gucks mir morgen sonst nochmal an...
-
Hmm so geändert wie du es jetzt sagtest -immernoch gate type 14 unsupported! Stimmt ist ein Debugversuch weil in Bochs steht mit deiner Art in cr0 0x60000011 und auf meine 0x00000011
Nenene duNochmal danke
Kevin
-
Original erstellt von Surkevin:
**Stimmt ist ein Debugversuch weil in Bochs steht mit deiner Art in cr0 0x60000011 und auf meine 0x00000011
**Joah, dann haste den Cache mit eingeschaltet
-
lol was hab ich denn noch alles unbewusst gemacht? Ein Gate Typ 14 benutzt - nen Cache angeschalten....lol - manno aber ich weiß trotzdem nicht was an dem super code falsch is
-
Hi.
Ist das noch niemandem aufgefallen?
Hier:
struc GDTSTRUCT .limit: resw 1 .base: resd 1 endstruc ... ... mov [global_table+GDTSTRUCT.base], eax mov eax, 28h mov [global_table+GDTSTRUCT.limit], eax
Zuerst wird die Base mit einem DWord gefuellt... OK.
Danach wird ein DWord ins Limit geschrieben...
IMHO wird dabei Das LowWord der Base ueberschrieben!BTW: Hier stimmt IMHO auch einiges nicht:
des_code dw 9FFFh ;Größe 4096 Bytes entspr. 8 Sektoren dw 1 ;die ersten 5 Sektoren belassen und dann in den 6. schreiben db 1 db 10011010b ;Codesegment lesbar / ausführbar db 11000000b db 0
Wieso ist da das G-Bit gesetzt?
Mal ganz abgesehen davon, waere die angegebene Segmentgroesse auch bei geloeschtem G-Bit >4096 Byte.(Das waeren 1000h)
-
Danke!
Da hast du natürlich vollkommen Recht!
Jetzt ist es:
mov [global_table+GDTSTRUCT.base], eax
xor eax,eax
mov ax, 20h
mov [global_table+GDTSTRUCT.limit], axDas mit dem 4096 hatte ich nur vorher definiert und wollte es nun zu testzwecken größer haben!
Kevin
-
So jetzt habe ich das G-Bit angelassen aber aus eax ax gemacht und siehe da! Keine 3rd exception! Jetzt probiere ich noch ob das mit dem Videoram geht um zu sehen ob auch alles geht - wenn nich dürft ihr wieder helfen *g*
nochmal danke an ALLE
Kevin
-
Hm ich glaub meine GDT is falsch oder so! Wenn ich diesen Code benutze (nachm pmode label) bekomm ich folgenden Fehler:
00000560071i[CPU ] write_virtual_checks(): write beyond limit, r/w
00000560071p[CPU ] >>PANIC<< exception(): 3rd (13) exception with no resolution
00000560071i[SYS ] Last time is 1051301860
00000560071i[CPU ] protected mode
00000560071i[CPU ] CS.d_b = 32 bit
00000560071i[CPU ] SS.d_b = 16 bit
00000560071i[CPU ] | EAX=c08e0010 EBX=00000007 ECX=048a0013 EDX=00000000
00000560071i[CPU ] | ESP=00000004 EBP=00000000 ESI=ff310017 EDI=31660f7a
00000560071i[CPU ] | IOPL=0 NV UP DI PL ZR NA PE NC
00000560071i[CPU ] | SEG selector base limit G D
00000560071i[CPU ] | SEG sltr(index|ti|rpl) base limit G D
00000560071i[CPU ] | DS:9000( 0000| 0| 0) 00090000 0000ffff 0 0
00000560071i[CPU ] | ES:9000( 0000| 0| 0) 00090000 0000ffff 0 0
00000560071i[CPU ] | FS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000560071i[CPU ] | GS:0000( 0000| 0| 0) 00000000 0000ffff 0 0
00000560071i[CPU ] | SS:4000( 0000| 0| 0) 00040000 0000ffff 0 0
00000560071i[CPU ] | CS:0008( 0001| 0| 0) 00090000 00009fff 1 1
00000560071i[CPU ] | EIP=000000ef (000000ef)
00000560071i[CPU ] | CR0=0x00000011 CR1=0x00000000 CR2=0x00000000
00000560071i[CPU ] | CR3=0x00000000 CR4=0x00000000
00000560071i[CTRL ] quit_sim called with exit code 1der code:
pmode:
mov ax, 24 ;Datensegment Selektor
mov ds,axmov ax, 16 ;VideoRAM Selektor
mov es, axmov si, string
xor di,di
mov di, (80*2)*24+(80-19)*2 ; -19 steht für -die Stringlänge
xor ecx,ecx
mov cx, 19showtext:
mov al, [si]
stosb
inc di
inc si
loop showtextloop_end:
jmp loop_endKann mir das nit erklären.....manmanman
TriPhoenix muss ranDanke
Kevin