Autor Thema: Pmode?  (Gelesen 24127 mal)

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #40 am: 25. November 2004, 20:04 »
Ja, ist mir schon klar :)
Aber mir geht es darum das ich nicht verstehe warum der PMode bei mir nicht klappt, auch mit meiner Methode. Es ist nur so das ich für gewöhnlich erst schaue ob ein Code funktioniert. Wenn ja, sehe ich mir seine Funktionsweise an, tue dies je nach schwierigkeit des Themas noch mit einer Anzahl anderer Codes und versuche dann meinen eigenen zu schreiben, da meiner hier nicht funktioniert wollte ich mal schauen ob es blueXseven's Code tut um zu vergleichen, da ich seinen Bootloader allerdings nicht habe, kann ich auch nur mit "meinem" testen...

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #41 am: 25. November 2004, 21:22 »
Ähm warum org 0x0 ?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #42 am: 26. November 2004, 11:54 »
Wenn du kein org an gibst nimmt er automatisch 0 als startadresse, man kanns ja aber nochmal hinschreiben damits der Programmierer der sich den Code anschaut übersichtlicher hat^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #43 am: 26. November 2004, 15:45 »
Danke, es läuft ;) eigenartiger weise nicht in Bochs, sondern nur auf meinem 2. Rechner und in VMWare...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #44 am: 26. November 2004, 16:44 »
Bei mir isses bisher andersrum hab heute beschlossen mal auf echtem Rechner mein OS laufend zu machen^^ mein Bootloader funzt unter Bochs aber unter einen echten Rechner nit^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #45 am: 26. November 2004, 17:15 »
Jetzt, nachdem ich etwas weiter gecodet habe (VGA statt normalem Text) läufts überall ;) (also von meinen 3 Testgebieten ^^)

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #46 am: 26. November 2004, 19:05 »
So, ich will nicht gleich noch 'nen Thread aufmachen, deshalb frage ich hier.  Ich habe jetzt nen C-Kernel dazu gebastelt und nun sagt Bochs folgendes:
prefetch: RIP > CS.limit

Tja, ich werde daraus nicht schlau, was meint er mit RIP...bezieht sich das IP auf "Instruction Pointer"? Ist damit gemeint das der Instruction Pointer das CodeSegementlimit überschreitet?

Das Code Segment (für den Descriptor, siehe blueXseven's Code, der Descriptor ist von dort) sollte doch groß genug sein, nämlich bis zu 4 GB (naja, ich habe halt 256MB^^)

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #47 am: 27. November 2004, 10:34 »
Rip is glaub ich der IP, schon richtig.
Bei mir kam das immer wenn ich irgendnen Fehler beim laden des Kernels gemacht habe, der also nicht geladen wird, der Sprung also dann ins "nichts führt". An der stelle stehen bei Bochs dann lauter Nullen, und das ist für die CPU ein gültiger Opcode, die führt er dann aus bis zum Ende;)
Aber diesen Fehler sehe ich bei Bochs des öfteren aus unerklärlichen Gründen, kam sogar schon vor dass der bei einem direkten Neustart nicht mehr war^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #48 am: 27. November 2004, 11:33 »
Okay, mir ist gerade aufgefallen, das es nur einer der GAAAAAAAAANZ dummen Fehler war ;) Ich hatte vergessen beim copy-Befehl eine *.bin-Endung vergessen...komischerweise hatte ich keine Fehlermeldung gesehen, naja jetzt funzt es ja :) Danke nochmals für die Hilfe^^

EDIT: Okay, von meinen, bereits des öfteren erwähnten, Testmedien funzt es wieder nur auf 2en, in VMWare funzt es diesmal nicht :-P

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #49 am: 25. December 2004, 22:43 »
Tja, wie ich bereits gepostet habe, funzen bei mir keine Globalen Variablen und auch ein paar andere Sachen immer wieder nicht...(meist weil man dazu globale Variablen bräuchte)  Nun habe ich "meinen" (also eigentlich BlueXSevens, ich benutze ihn nur) Code mit anderen Codes verglichen und mir ist dabei aufgefallen das zum Beispiel bei TeeJays Code der 0 descriptor in fs und gs geladen wird, bei BlueXSeven hingegen 16 (soweit ich mich erinnere) warum? Also es liegt wohl am unterschielichen Code, aber was bewirkt dieser Unterschied?

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #50 am: 25. December 2004, 23:50 »
Okay, danke für die rasche Antwort...:

[bits 16]

org 0x0
jmp start

; ===============================
; = Global Descriptor Table =
; ===============================

Descriptoren dw 0x0000
dw 0x0000
db 0x00
db 0x00
db 0x00
db 0x00

dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xCF
db 0x00

dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xCF
db 0x00

GDT dw 23
dd 0

; ===============================
; = Protected Mode Start =
; ===============================

start:

mov ax, cs
mov ds, ax

cli

xor eax, eax
mov ax, ds
shl eax, 4
add eax, Descriptoren
mov dword [GDT+2], eax

lgdt [GDT]

mov eax, cr0
or al, 00000001b
mov cr0, eax

jmp 0x0008:dword 0x10000+ProtectedMode

; =======================================
; = !Here starts 32bit protected mode! =
; =======================================

[bits 32]


ProtectedMode:

mov ax, 0x0010
mov ds, ax
mov es, ax
mov ss, ax
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF

Was ist daran dann falsch? (Funzt soweit, nur mit C dann nicht, obwohl der Code stimmt...der kann absolut keine Globalen Variablen (also nur wenn ihnen Global ein wert zugewiesen wird) und keine Parameter und Returnwerte bei Funktionen O_O)

Achja, warum eigentlich 0x0010?

@BlueXSeven hast du ICQ oder so?

 

Einloggen