es ist toll, daß es so super dokumentationen über den protected mode gibt. jeder gibt einen einstieg bis zu dem punkt, wo es zum taskwechsel und diesem mystetiösen cr3 register geht. das haben anscheinend die wenigsten wirklich verstanden. ich gehöre blöderweise auch dazu.
So mysteriös ist das gar nicht, ich habe mich bisher nur noch nicht aufraffen können, den nächsten Teil der Tutorialreihe zu schreiben. Da würde dann Paging vorkommen.
1. frage ist die adresse die ich mit lgdt lade cr3 relativ oder ist es eine absolute adresse?
Erstmal den groben Überblick: Aus einer virtuellen Adresse wird über die Segmentierung eine lineare Adresse, dafür ist die GDT zuständig. Danach wird aus der linearen Adresse über Paging eine physische Adresse, dafür sind die Page Tables zuständig. Wenn man sich merkt, dass Segmentierung "oberhalb" von Paging stattfindet, klappt das auch mit der GDT: Die GDT-Adresse ist eine lineare Adresse, wird also von cr3 beeinflusst.
2. ich habe eine gdt mit 4 werten (0, codedescriptor, datadescriptor und stackdescriptor). alle zeigen auf die adresse 0 und haben das maximale limit des speichers.
Sehen Daten- und Stackdeskriptor dann nicht genau gleich aus? Meistens verwendet man da einfach denselben.
ich lege einen tss descriptor an und trage ihn in die gdt. ich fülle den tss aus, wobei ich das cr3 register auf eine pagedir/pagetable setze die alles ab 0 mb auf 1 mb (wo ich mein neues programm hinkopiert habe) mapped und ip ist 0. cs,ds,es ... setze ich entsprechend der gdt. der stack liegt 4096 bytes hinter dem programm und der esp ist auf die adresse -4 gesetzt.
sobald ich den descriptor des tss anspringe, stürzt er ab. seltsamerweise wenn ich das mapping der neuen pagedir/pagetable nur bis 8000h auf 1mb mappe, klappt es. sehr seltsam. oder gibts da eine einfache erklärung?
Ich komme hier ehrlichgesagt nicht ganz mit, was du machst. Aber eine einfache Erklärung gibt es ziemlich sicher.
Was für einen Absturz gibt es denn genau? Grundsätzlich produzieren TSS-bezogene Sachen sehr gern einen GPF, aber dein Problem scheint ja mit Paging zusammenzuhängen - ist es also ein Page Fault?
Ich glaube, an dieser Stelle musst du einfach mal ein bisschen Code herzeigen, damit wir sehen, was du genau machst.
ps: gibt es eigentlich bücher über dieses thema? die meißten behandeln das paging nur nebenbei.
Ich kann dazu eigentlich nur zwei "Standardwerke" empfehlen: Die Doku von Intel und die von AMD. Dort ist alles (und zwar wirklich alles) sehr detailliert beschrieben - dummerweise ist es dann halt wieder so ausführlich, dass man als Anfänger den Wald vor lauter Bäumen nicht mehr sieht.