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)).