Autor Thema: PMode Wahnsinn  (Gelesen 26293 mal)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 19. October 2006, 20:51 »
Hast du mal geschaut, wo der GPF genau auftritt? Was mir so auf den ersten Blick auffällt, ist das jmp END womit du mitten ins Nichts springst, also in Speicher, wo stehen kann, was will. Schließ das Ding mal mit einer Endlosschleife ab.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #21 am: 19. October 2006, 21:32 »
Gute Idee... die Logfile sagt: jump_protected: gate type 0 unsupported
Soll dass heißen, der sieht die Selektoren als Call Gates oder was?

und hier die build.bat:
nasm -f bin -o kernel16.bin kernel16.asm



nasm -f aout -o kernel32.o kernel32.asm

gcc -Os -ffreestanding -c -o main.o main.c

ld -T link.ld -o ckernel32.bin kernel32.o main.o



MergeKernel kernel.sys kernel16.bin ckernel32.bin



copy kernel.sys a:\kernel.sys

Für WXP und DJGPP
« Letzte Änderung: 19. October 2006, 21:34 von FalShen »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 19. October 2006, 21:59 »
Wenn ich dich richtig verstanden habe, soll hinter dem END: dein C-Kernel anfangen, oder wie? Zumindest politisch nicht ganz korrekt, würde ich sagen, da würde ich noch ein jmp main hinsetzen.

Ansonsten wäre es nach wie vor gut zu wissen, an welcher Codezeile der GPF denn nun auftritt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #23 am: 19. October 2006, 22:15 »
Also, hab jetzt folgendes gemacht: hab den A20 übersprungen und die Endlosschleife direkt nach dem END gemacht, also nur den jump in den protected mode. Und es geht immer noch nicht.
Ich kann dir nicht sagen, in welcher zeile der fehler nun auftritt, da mir bochs das nicht in der logfile angibt.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 19. October 2006, 22:19 »
Dann steck den Fehler mit jmp $ ab, oder nimm den Bochs-Debugger (Tut: http://www.chris-soft.de/tutorials/bochs/).
Das wird aber warscheinlich nich sonderlich viel bringen. Gib uns mal dein MakeFile; Vieleicht liegt es daran, dass es bei allen anderen funzt.

Nur nicht aufgeben, das kommt schon!!
Noooooooooooos

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #25 am: 19. October 2006, 22:30 »
Um ehrlich zu sein, die Sache, die mich am meisten nervt, ist, dass nur der Desktop in meiner Wohnung nen Floppy hat, allerdings, 24/7 von meiner Mutter komplett besetzt wird. Heißt, dass ich nur einmal am Tag oder nach langem Betteln mal testen darf.
Kennt irgendwer eine Art Floppy-Emulator für Windows oder Linux? Würd mir irgendwie helfen...

Die makefile ist die build.bat da oben. Die Linux makefile sieht nicht anders aus, nur mit cat anstatt MergeKernel.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 19. October 2006, 22:38 »
Ah...hab ich übersehen...Ja einen guten Emulator gibts: Bochs.
Schau mal im Netz, das obengenannte Tut beschreibt auch den Umgang mit Bochs allgemein.

Noooooooooooos

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 19. October 2006, 22:46 »
Ich glaube, er meint was anderes. ;)

Unter Linux kannst du ein Floppy-Image fast wie eine ganz normale Diskette mounten: mount -oloop floppy.img /mnt (als root, solange du das nicht in der fstab hast). Das Image kopierst du dir entweder einmal von deiner richtigen Diskette oder du erstellst eins mit dd if=/dev/zero of=floppy.img bs=1024 count=1440; mkdosfs floppy.img.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #28 am: 20. October 2006, 00:19 »
Vielen Dank für den mounting Tipp, wusste ich noch nicht...

Ich hab, glaube ich, den fehler eingeengt. bochs sagt, zum Zeitpunkt des faults  sind eax und cr0 gleich 00000011b, also PMode ist eingeschaltet. Direkt danach würde der befehl JMP codesel:PMode kommen... Bochs sagt auch, CS und SS sind noch 16 bit breit... also... keine Ahnung, hab ich was vergessen?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #29 am: 20. October 2006, 11:41 »
Wenn dieser Code nicht an Segment 0 geladen ist, solltest du noch Segment * 16 zur Basis im GDTR addieren.
Dieser Text wird unter jedem Beitrag angezeigt.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #30 am: 20. October 2006, 15:48 »
Ocer muss ich [ORG 0x10000] einfügen oder so was?
ja (wenn dein kernel nach 0x1000 geladen wird )
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #31 am: 20. October 2006, 16:34 »
okay, nun ist CS 32 bit breit, und enthält 0x8, wie es - glaub ich - sein soll. DS ist immer noch 0x1000, somit ist der nun einen befehl weiter, mov ax, datasel, oder die Exception tritt auf bei mov ds, ax......

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #32 am: 20. October 2006, 16:46 »
Zitat
oder die Exception tritt auf bei mov ds, ax.....
du benutzt anchscheinend nicht den debugmodus von bochs

versuch ma
damit findet man schnell raus wo der fehler ist
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #33 am: 20. October 2006, 22:19 »
Dieses Bochs-Tutorial brachte mir nicht viel... wie komme ich in den 'debug-mode'? Bochsdbg.exe verhielt sich genauso wie bochs, also... keine Ahnung...

hier der ausschnitt aus der logfile, wieß nich, ob's hilft...
00009148317i[CPU  ] LOCK prefix unallowed (op1=0x53, attr=0x0, mod=0x0, nnn=0)
00009148317e[CPU  ] interrupt(): gate descriptor is not valid sys seg
00009148317e[CPU  ] interrupt(): gate descriptor is not valid sys seg
00009148317i[CPU  ] protected mode
00009148317i[CPU  ] CS.d_b = 32 bit
00009148317i[CPU  ] SS.d_b = 16 bit
00009148317i[CPU  ] | EAX=00000011  EBX=00001000  ECX=00170001  EDX=00000022
00009148317i[CPU  ] | ESP=0000fffc  EBP=00000000  ESI=000088f0  EDI=0000ffde
00009148317i[CPU  ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af pf cf
00009148317i[CPU  ] | SEG selector     base    limit G D
00009148317i[CPU  ] | SEG sltr(index|ti|rpl)     base    limit G D
00009148317i[CPU  ] |  CS:0008( 0001| 0|  0) 00000000 000fffff 1 1
00009148317i[CPU  ] |  DS:1000( 0000| 0|  0) 00010000 0000ffff 0 0
00009148317i[CPU  ] |  SS:9000( 0000| 0|  0) 00090000 0000ffff 0 0
00009148317i[CPU  ] |  ES:9200( 0000| 0|  0) 00092000 0000ffff 0 0
00009148317i[CPU  ] |  FS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00009148317i[CPU  ] |  GS:0000( 0000| 0|  0) 00000000 0000ffff 0 0
00009148317i[CPU  ] | EIP=0000001b (0000001b)
00009148317i[CPU  ] | CR0=0x00000011 CR1=0 CR2=0x00000000
00009148317i[CPU  ] | CR3=0x00000000 CR4=0x00000000
00009148317i[CPU  ] >> lock push ebx : F053
00009148317e[CPU  ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
« Letzte Änderung: 20. October 2006, 23:21 von FalShen »

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #34 am: 20. October 2006, 23:39 »
ich glaube das das mit dem bochsdbg.exe schon richtig ist (3 tage linux und Win schon ganz vergessen)
do solten wi immer zwei fenster aufgehen,
1. der 'Monitor'(bleibt schwarz, weil die ausfürung noch nicht gestartet wurde)
2. so ne art Konsole
für die Konsole gibts dann ne reihe befehle, mit denen du den programmmablauf steuern kanst

c       normale ausfüren
s       einzel schritt ausfüren
vb seg:offs  brackpoint setzen (virtuell adresse)
lb addr    brackpoint (lineare addresse)
pb addr   brackpoint (physikaliche addresse
d   n       brackpoint nummer n löschen
q          beenden

versuchs ma mit den kommandos

lb 0x1000    # um den bios boot forgang zu über springen
c  # bis zum Brackpoint ausführen
d 1  # brackpoint wieder löschen (hier die nummer eintragen di nach dem lb befehl angezeigt wird
s   # mit s bis zum programmabsturz for arbeiten (einfach enter widerholt den letzten konsolen befehl)

den fehler haften bereich erkänzt du an einer abweichung von deinem code ( der nächste auszu fürende code wird immer angezeigt) meist ist das ein jmp F000:0000 oder so

liste mit ein par mehr befehlen (was besseres hab ich auf die schnelle nicht gefunden)
http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.html

edit:
00009148317i[CPU  ] | EIP=0000001b (0000001b)siht so aus als fehlt ein [org 0x1000] den dein code liegt beschtimmt nicht bei 0x001B

« Letzte Änderung: 20. October 2006, 23:42 von M.Nemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #35 am: 21. October 2006, 00:26 »
Also... danke für den link, hat mir echt geholfen...
Das problem liegt offenbar nich mal in meinem Code. Der Fehler ist ein Befehl lock push ss, der irgendwie nicht funktioniert. Hab keine Ahnung wo der herkommt, ist nicht in meinem Code...

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #36 am: 21. October 2006, 01:28 »
dann must du gucken wo dein code verlassen wird
warscheinlich mit nem
JMP 0x001B
(dein code ligt ja bei 0x1000 !?)


PS: hast du da jezt das [org 0x1000] drin ?
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #37 am: 21. October 2006, 10:57 »
Hab ich schon längst!

ein [ORG 0x10000], da der bootloader den kernel nach 0x1000:0x0 packt.
« Letzte Änderung: 21. October 2006, 11:00 von FalShen »

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #38 am: 21. October 2006, 12:55 »
Und beim Bootloader hast du auch ein entsprechendes??

FalShen

  • Beiträge: 73
    • Profil anzeigen
    • ScénOS
Gespeichert
« Antwort #39 am: 21. October 2006, 13:15 »
Beim Bootloader natürlich ORG 0x7C00...
Oder was meinst du? Der Bootloader is der von TeeJay, den Code hier zu posten wäre sinnlos...

 

Einloggen