Autor Thema: Paging mal wieder...  (Gelesen 3437 mal)

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« 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;
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #1 am: 20. April 2005, 14:01 »
Keiner ne Idee?
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #2 am: 20. April 2005, 17:05 »
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]
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #3 am: 20. April 2005, 17:52 »
GCC fehler? Nasm fehler?

maumo

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #4 am: 20. April 2005, 18:09 »
Unwahrscheinlich ich werds nochmal mit 4kb Pages versuchen, da scheint es das nicht zu geben, muss aber erst testen.
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #5 am: 22. April 2005, 13:43 »
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^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen