Autor Thema: Paging aktivieren und VESA-Mode LFB  (Gelesen 7199 mal)

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« am: 25. June 2007, 01:34 »
hi Leute,

sorry, dass ich ständig neue threads öffne, aber ich hab einfach mehrere probleme gleichzeitg...
wenn ich paging aktiviere, dann muss ich doch zuvor ein pagedirectory und 1024 pagetables (angenommen ich setze alle pages auf present) anlegen, oder? das habe ich getan. folgender codeabschnitt sorgt dafür:

paging.h:
  #define adr_PageDirectory 0x120000
  #define adr_PageTables 0x121000

  typedef struct
  {
    ulong Entry[1024];
  } SPAGETABLE;
paging.c:
static ulong *PageDirectory = (ulong *)(adr_PageDirectory);
static SPAGETABLE *PageTable = (SPAGETABLE *)(adr_PageTables);

void setup_Paging()
{
  int i1, i2;
  ulong adr = 0;
  for (i1 = 0; i1 < 1024; i1++)
  {
    PageDirectory[i1]=(ulong)PageTable + (i1*1024);
    for (i2 = 0; i2 < 1024; i2++)
    {
      PageTable[i1].Entry[i2] = adr | 3;                                        // alle pages present
      adr += 4096;
    }
  }
  write_cr3((ulong)PageDirectory);
  put_PagingBit();
}

die funktion put_PagingBit() ist in asm geschrieben:
[global _put_PagingBit]
_put_PagingBit:
        mov              eax,       cr0
        or               eax,       080000000h
        mov              cr0,       eax
        jmp              $
        ret

das problem ist, dass noch vor dem jmp $ ein neustart ausgeführt wird... es kommt noch nicht einmal ein "page-fault". woran liegt das?
an der stelle, an der ich setup_Paging() ausführe, befinde ich mich bereits im pm und habe ein flaches speichermodell.

grüße

Cheebi
« Letzte Änderung: 26. June 2007, 23:02 von Cheebi »
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 25. June 2007, 01:41 »
Spontan fällt mir da auf, daß der PD-Eintrag auch gern ein gesetztes Present-Bit hätte.

Und der Reboot wird in Wirklichkeit nichts anderes als ein durch Page Faults verursachter Triple Fault sein. Du bekommst also schon einen PF, du kannst ihn dank des kaputten PDs nur nicht behandeln. ;)
« Letzte Änderung: 25. June 2007, 01:43 von taljeth »
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #2 am: 26. June 2007, 13:55 »
Zitat
Spontan fällt mir da auf, daß der PD-Eintrag auch gern ein gesetztes Present-Bit hätte.
das war der fehler für den reboot... danke! jetzt funktioniert es aber immer noch nicht...
ich scheine die pages nicht korrekt gefüllt zu haben... mal sehen

Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #3 am: 26. June 2007, 22:51 »
hi Leute,

ich habe (wohl) einen fehler gefunden... ich habe mir den zeiger des linear framebuffers vom vesa-mode (0118h) ausgeben lassen und festgestellt, dass er 0xf0000000 ist. das kannn in einem 128mb-ram-pc aber schlecht möglich sein.. es funktioniert aber!
warum ich also nichts mehr zu sehen bekomme, sobald paging aktiviert ist, ist, dass ich erstmal die ganzen 4gb mappe und alle pages present setze, deshalb gibt es die adresse 0xf0000000. dort kann ja aber nichts gespeichert werden.
kann es sein, dass schon (bevor ich paging aktiviere) eine art mapping des rams vorhanden ist? denn wie soll denn der linear framebuffer bei 0xf0000000 liegen und trotzdem auf dem bildschirm etwas abgespeichert werden? ich bin total verwirrt... helft mir bitte!!!

danke

Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #4 am: 26. June 2007, 23:12 »
Doch, dieser Speicher ist vorhanden. Es handelt sich nähmlich um den Video-Ram auf der Grafikkarte. Und der wird möglichst so eingebunden, dass er dem "normalen" Arbeitsspeicher nicht in die Quere kommt.

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #5 am: 26. June 2007, 23:19 »
Zitat
Doch, dieser Speicher ist vorhanden. Es handelt sich nähmlich um den Video-Ram auf der Grafikkarte. Und der wird möglichst so eingebunden, dass er dem "normalen" Arbeitsspeicher nicht in die Quere kommt.
hm... muss ich dann diesen Adressraum aus meiner Pagetabelle heraus nehmen? oder wo kann das problem noch liegen?

  write_cr3((ulong)PageDirectory);
  put_PagingBit();
  sound(200);
  for(;;);
}
bei diesem code wird der sound ausgegeben. das zeigt eindeutig, dass das problem nicht beim code selbst sondern beim vesa-mode und dem grafik-speicher liegt...

Cheebi
« Letzte Änderung: 27. June 2007, 00:08 von Cheebi »
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 27. June 2007, 00:25 »
wenn ich raten soll, muss es 4096 und nicht 1024 in der zeile PageDirectory[i1]=(ulong)PageTable + (i1*1024); heissen.
Dieser Text wird unter jedem Beitrag angezeigt.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 27. June 2007, 07:59 »
hm... muss ich dann diesen Adressraum aus meiner Pagetabelle heraus nehmen? oder wo kann das problem noch liegen?
Nein. Dein Paging greif ja nur auf der Ebene der Translation von virtueller nach physikalischer Adresse. VRam, Ram und noch ein paar andere nette Sachen (lokale APIC, I/O APIC, andere memory-mapped Gerät) liegen ja alle im physikalischen Adressraum, deshalb müssen da schon page tables und page table einträge bestehen.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #8 am: 27. June 2007, 12:31 »
wenn ich raten soll, muss es 4096 und nicht 1024 in der zeile PageDirectory[i1]=(ulong)PageTable + (i1*1024); heissen.
WOW! nicht raten!!! das war der fehler.......... VIELEN DANK PorkChicken! *freu*

Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

 

Einloggen