Hi
ich habe mich jetzt mit paging beschäftigt, und habe den code fertig. Natürlich funktioniert noch nichts.
Leider fehlt mir momentan die Idee, wie ich dass debuggen könnte.
Das Problem liegt wahrscheinlich beim erstellen des PageDirectorys bzw der Tables.
Ich könnte jetzt die gesammten Daten per rs232 in eine html-Tabelle schreiben, und kontrolieren, was bei ca 4MB Daten allerdings ein enormer aufwand währe.
Wie habt ihr das gemacht??
Hier einfach mal der Code:
Das setzten der Register wird wohl richtig sein:
ich habe mich jetzt mit paging beschäftigt, und habe den code fertig. Natürlich funktioniert noch nichts.
Leider fehlt mir momentan die Idee, wie ich dass debuggen könnte.
Das Problem liegt wahrscheinlich beim erstellen des PageDirectorys bzw der Tables.
Ich könnte jetzt die gesammten Daten per rs232 in eine html-Tabelle schreiben, und kontrolieren, was bei ca 4MB Daten allerdings ein enormer aufwand währe.
Wie habt ihr das gemacht??
Hier einfach mal der Code:
Code: [Auswählen]
#define SIZEOF_PAGEDIRECTORY (1024*4) ////PD = 1024PT * 4B = 4096
#define SIZEOF_PAGETABLE (1024*4) ////PT = 1024PF * 4B = 4096
#define SIZEOF_PAGE (1024*4) ////1 Page-größe (4KB)
#define PG_PRESENT 0x01 //Vorhanden
#define PG_WRITEABLE 0x02 //Speicher auch beschreibbar
#define PG_USERACCRESS 0x04 //Für user zugreifbar (ring3)
#define PG_OUTOFRANGE 0x0200 //Existiert auf Physikalischer ebene nicht (z.B. 17.MB bei 16MB-RAM)
#define PG_REOSDEFAULT (PG_PRESENT | PG_WRITEABLE | PG_USERACCRESS)
#define PG_REOSNULL ( PG_WRITEABLE | PG_USERACCRESS)
DWORD *KernelPageDirectory = (DWORD*)0x701000; //Kernelspace (auch virtuell == physikalisch)
DWORD *KernelPageTables = (DWORD*)0x702000;Code: [Auswählen]
int InitKernelPageDirectory()
{
int error=0;
//1024 PageTables einfügen initialisieren
DWORD currentPT = (DWORD)KernelPageTables;
DWORD *PageDirectory = KernelPageDirectory;
for(int i=0; i<1024; i++)
{
*PageDirectory = currentPT | PG_REOSDEFAULT;
error = InitKernelPageTable(currentPT); //Das flag muss mit, um zu wissen, ob spätere tabels present sein müssen oder nicht
if(error&(~PG_COMPLETE))return error;
if(error == PG_COMPLETE) break;
PageDirectory+=4;
currentPT += SIZEOF_PAGETABLE;
}
return 0;
}Code: [Auswählen]
int InitKernelPageTable(DWORD PageTable)
{
static DWORD paddr = 0;
DWORD flag; //Flags, ob present und son scheiß
if(paddr < 0xB00000) flag = PG_REOSDEFAULT; //bis 11MB gehört dem Kernel
else {flag = PG_REOSNULL; paddr = 0;} //Danach ist frei und verboten
//1024 Pages einfügen initialisieren
for(int i=0; i<1024; i++)
{
if(paddr > MaxPhysicalMemory) flag |= PG_OUTOFRANGE; //Wenn die Andresse auserhalb des Vorhanden Arbeitsspeicher liegt
*(DWORD*)PageTable = paddr | flag; //paddr enthält die physikalische addresse
PageTable += 4;
paddr += SIZEOF_PAGE;
if(paddr < 0xB00000) flag = PG_REOSDEFAULT; //bis 11MB gehört dem Kernel
else {flag = PG_REOSNULL; paddr = 0;} //Danach ist frei, und verboten
}
if(paddr == 0) return PG_COMPLETE;
return 0;
}Das setzten der Register wird wohl richtig sein:
Code: [Auswählen]
#define CR0_PAGING 0x80000000
//...
cpu::cr3((DWORD)KernelPageDirectory);
cpu::cr0(cpu::cr0() | CR0_PAGING);

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken


Gespeichert
- Der kernel soll nicht geschützt werden!
