7
« am: 11. August 2009, 10:42 »
hallo.
ich habe da wohl ein kleines problem mit dem protected mode.
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.
deswegen frage ich hier einfach mal nach und hoffe auf hilfe.
also.
1. frage ist die adresse die ich mit lgdt lade cr3 relativ oder ist es eine absolute adresse?
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.
dann habe ich eine pagedir und die entsprechenden pagetables um den speicher von 0 bis 4 mb zu mappen. gut.
mein programm liegt ab 8000h. soweit funktioniert alles.
jetzt kommt das seltsame, was ich nicht verstehe.
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?
wenn ihr code braucht einfach bescheid sagen.
danke.
gruß.
ps: gibt es eigentlich bücher über dieses thema? die meißten behandeln das paging nur nebenbei.