Autor Thema: GPF... [gelöst]  (Gelesen 2479 mal)

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« am: 11. March 2009, 22:12 »
Schönen guten Abend,

Nachdem ich nun endlich auf C und Paging umgestiegen bin, habe ich es auch geschafft, Multitasking mit CPL0-Prozessen zu implementieren. Beim Umstieg auf CPL3 habe ich aber noch (mindestens) ein Problem: Wenn ich über einen Syscall Speicher anfordere, dann wird die entsprechende Adresse auch korrekt zurückgegeben, beim Versuch des CPL3-Prozesses, darauf zuzugreifen, enden aber sämtliche "normalen" Computer und BOCHS mit einem GPF, bei QEMU und VirtualBox funktioniert jedoch alles.
Der zurückgegebene Speicher ist korrekt gemappt (der Kernel kann ohne Probleme darauf zugreifen) und eigentlich sollte er auch von Userprozessen verwendet werden können - das Ausführen des Codes funktioniert schließlich und der ist ebenso gemappt.
Am TLB kann es auch nicht liegen, da "invlpg" nach der Allokation ausgeführt wird (ich habe es auch mit Neuschreiben von CR3 versucht).

Falls es wichtig sein sollte: Die IDT besteht aus 256 Elementen, alle sind zumindest auf einen einfachen iret-Handler umgeleitet, der Sysint ist 0x80. Die GDT enthält 6 Elemente (Null-Handler, Systemcode (Von 0 bis 4 GB, DPL=0), Systemdaten (ebenso), Benutzercode (Von 0 bis 2 GB, DPL=3), Benutzerdaten (ebenso) und TSS (nur esp0 und ss0 gesetzt)). Der Kernel ist nach 0x80000000 (bzw. 0x80010000) gemappt.

Daten, die mein BlueScreen(tm) liefert:
ErrorCode = 0
CS:EIP = 0x1B:0x0000094C ("for (i = 0; tmem; i++)" - tmem ist der allokierte Speicher (Typ (char*))
SS:ESP = 0x23:0x000FFD28
(kernel: SS:ESP = 0x10:0x81239FE8)
DS, ES, FS, GS = 0x23
TR = 0x28
GDT ab 0x81000000
IDT ab 0x80017200


Ich hoffe, irgendjemand hat eine Ahnung, woran es liegen könnte... :|

P. S.: Wenn ich Code posten soll, kein Problem. Es könnte nur ein bisschen unübersichtlich sein (und ich benutze bei Inlineassembler die Intelsyntax (bei GCC)).
« Letzte Änderung: 13. March 2009, 22:57 von XanClic »

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 12. March 2009, 17:26 »
Hast du vielleicht vergessen das Userflag zu setzen?
Das fällt mir jetzt so auf die Schnelle ein.
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. March 2009, 17:59 »
Hast du schonmal das Loglevel bei bochs auf debug gestellt und geschaut, ob dabei irgendwann hilfreiches rauskommt?

Ansonsten wäre interessant zu wissen, welche Instruktion genau schiefgeht, und was die benutzten Register enthalten.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #3 am: 13. March 2009, 22:56 »
[Schade, ich hatte gehofft, es hätte noch niemand geantwortet und ich könnte den Thread jetzt löschen...]

Ich hatte beim IRQ0-Handler folgendes geschrieben:
pop   gs
pop   fs
pop   es
pop   fs
Es hätte am Ende (natürlich) aber pop   ds heißen müssen... So konnte ich nach dem malloc zwar noch auf lokale Variablen zugreifen, bei globalen bekam ich aber natürlich einen GPF (da "ds" vom Prozessor auf 0 gesetzt worden war, um nicht bei CPL3 auf ein DPL0-Descriptor zu verweisen)... :roll:

 

Einloggen