Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Roshl am 19. April 2005, 15:29
-
Also ich hab in meinem Recodign meines OS das Paging wieder vor. Allerdings meldet mir Bochs nach dem schrieben in cr0 mit aktiviem PG-Bit das die phys adresse nicht vorhanden sei.
Allerdings ist alles linear gemappt mit 4MB Pages. Hier der C-Code vielleicht fällt ja jemandem was auf:
void init_Paging()
{
asm volatile("movl %cr4,%eax\norl $0x10,%eax\nmovl %eax,%cr4"); //4MB Pages erlauben
kernellinear=(Pagedir*)0x3000;
dw page=0;
while(page<1024)
{
kernellinear->Pageframe[page]=(page*0x400000)|PPRESENT|BIGPAGE|RW;
page++;
}
asm volatile("movl $0x3000,%eax\nmovl %eax,%cr3"); //Kernel PDE festlegen
asm volatile("movl %cr0,%eax\norl $0x80000000,%eax\nmovl %eax,%cr0"); //Paging aktivieren
}
EDIT: paar fehlende defis zum verständnis
#define BIGPAGE 0x80
#define RW 0x02
#define PPRESENT 0x01
typedef union Pagedir
{
Pagetab *Pagetable[1024]; //Für 4KB Pages pointer auf Tables
dd Pageframe[1024]; //Für 4MB Pages direkte Frames
}Pagedir;
-
Keiner ne Idee?
-
Es wird immer seltsamer...
Weitere Forschungen haben ergeben, dass wenn ich in bochs mit dem befehl "x" den speicher anschaue, nach dem switch zum paging in vielen bereichen nur noch 0xFF steht
wenn er in einen anderen 4kb-bereich eintritt kommt wieder "invalid" und dann sind in den 4kb wieder alle richtig. Also theoretisch alles korrekt weil der ja die pages dann erst in den TLB lädt. Dummerweise verwende ich ja 4MB pages im kernel ist also das mit den 4kb irgendwie seltsam.
Ebenfalls problematisch ist, das dannach sogar an den stellen der gdt idt des pagingdirs nur 0xFF auch im fürs Multitasking alle TSS nur noch 0xFF
wenn er also beim Taskswitch laden will versucht er selektoren mit 0xFF zu laden und so, da aktualisiert er dann nix, beim farjump zum taskswitch sagt mir bochs dann auch, dass das cs mit was ungültigem beladen wurde.
Irgendwie seh ich nicht mehr durch...
[schild=1]HELP[/schild]
-
GCC fehler? Nasm fehler?
maumo
-
Unwahrscheinlich ich werds nochmal mit 4kb Pages versuchen, da scheint es das nicht zu geben, muss aber erst testen.
-
So das Problem ist gelöst, auch mit 4MB Pages geht es nun.
Es lag gar nicht am Paging selbst sondern am Multitasking, das Problem war, das ich davon ausgegangen bin, das bei einem Taskswitch der Prozessor den aktuellen Inhalt von cr3 mit speichert. Das passiert aber garnicht, also wurde beim nächsten Aufruf des Tasks nicht das richtige Paging dir verwendet, weshalb auch die ganzen Daten falsch waren, er also ein falsches CS-Segement laden wollte->Error
Also merkt euch bei Paging+TSS-MT das cr3 Feld vorher im TSS festzulegen^^