Hi Community!
Taljeth hat in dem Thread Thema: C-Programm laden vollkommen recht gehabt! Irgendetwas stimmt mit meinem Paging noch immer nicht und ich komm einfach nicht dahinter WAS!
Folgende Routine initialisiert mein Paging:
/*die struktur kernelPagingStructure*/
struct kernelPagingStructure {
unsigned int *pageDirectory;
unsigned int *pageTable[1024];
unsigned short aktPageDirectory;
unsigned short aktPageTable;
};
//globaleVariable
struct kernelPagingStructure kernelPageMap;
void initPaging(){
unsigned int count;
unsigned int ende = 0x400000;
kernelPageMap.pageDirectory = getFreeMemory();
for(count = 0; count < 1024; count++){
kernelPageMap.pageTable[count] = ((void *)0);
}
for(count = 0; count < ende;){
mapPage(count);
count += 0x1000;
}
asm volatile( "mov %0, %%cr3" : : "r" (kernelPageMap.pageDirectory) );
unsigned int cr0;
asm volatile("mov %%cr0, %0": "=r"(cr0));
cr0 |= 0x80000000;
asm volatile("mov %0, %%cr0":: "r"(cr0));
pagingOn = 1;
}
diese Methode ruft
void mapPage(unsigned int physMemory) auf:
#define MEMORY_PRESENT 0x1
#define PAGE_WRITEABLE 0x2
#define EVERYONE_ACCESSABLE 0x4
#define WRITE_THROUGH_ON 0x8
#define CACHING_OFF 0x10
void mapPage(unsigned int physMemory){
int pageFrames = physMemory / 0x1000;
int pageFrameIndex = pageFrames % 1024;
pageFrames /= 1024;
int pageTableIndex = pageFrames % 1024;
pageFrames /= 1024;
int pageDirIndex = pageFrames % 1024;
if(kernelPageMap.pageTable[pageTableIndex] == ((void *)0)){
kernelPageMap.pageTable[pageTableIndex] = getFreeMemory();
}
kernelPageMap.pageTable[pageTableIndex][pageFrameIndex] = physMemory | MEMORY_PRESENT | PAGE_WRITEABLE | EVERYONE_ACCESSABLE;
kernelPageMap.pageDirectory[pageTableIndex] = (unsigned int)kernelPageMap.pageTable[pageTableIndex] | MEMORY_PRESENT | PAGE_WRITEABLE | EVERYONE_ACCESSABLE;
}
Die Funktion
void *getFreeMemory() liefert die Adressen 0x1000(physisch) 0x2000(physisch) und 0x3000(physisch) usw da diese physischen Adressen ja frei sind.
Das PageDirectory lässt sich auch ohne Anstände laden und auch der Kernel arbeitet ohne Probleme weiter, aber jetzt kommts!
Wenn ich mein Filesystem initialisieren will (FAT12), dann muss ich ja die FAT Tabelle auslesen. Das mache ich folgendermaßen:
//FAT ist eine globale Variable
unsigned short FAT[2880];
//die Funktion readFAT
void readFAT(){
int sektors = 0, aktEntry = 0, i,j = 0, first = 0;;
unsigned char b[4608];
printf("leseFat\n");
while(sektors < 9){
unsigned char *sek = readSectorLBA(sektors + 1);
for(i = 0; i < 512;i++){
b[j] = sek[i];
j++;
}
sektors++;
}
printf("alles gelesen\n");
j = 0;
while(aktEntry < 2880){
printf("zugriff FAT[%d]\n", aktEntry);
FAT[aktEntry] = up(b[j], b[j+1]);
aktEntry++;
j++;
printf("zugriff FAT[%d]\n", aktEntry);
FAT[aktEntry] = lo(b[j], b[j+1]);
aktEntry++;
j += 2;
}
}
Nun geht der Zugriff auf FAT 640 Mal gut und dann kommt die Page Fault Exception.
Nur warum? Ich Mappe doch die Adresse
0x119000. Ich Mappe jede Adresse bis
0x400000.
Ich hoffe ihr könnt mir in diesem Fall helfen, ich bin mit meiner Weisheit am Ende irgendetwas hab ich da übersehen!
Danke vielmals schonmal im Vorraus!
lg