Hallo,
ich habe ein Problem mit meiner Initialisierung des Pagings.
Ich habe meinen Code ein wenig umgeschrieben und habe nun ein Problem mit dem Mappen der Bitmap.
Die Bitmap wird laut Anzeige auf 0 gemappt.
Leider bekomme ich dabei einen panic, da das System angeblich versucht die Page zu remappen.
Ich weiß leider nicht woran das liegt, denn die Ausgaben sagen mir, dass in dem Bereich nichts gemappt wird außer der Bitmap.
Die Methoden sehen wie folgt aus:
void map_init(phys_t paddr , virt_t vaddr , size_t size){
size_t i , offset , overflow = 0;
uint32_t phys;
page_table_t table;
offset = ((uint32_t)vaddr >> PAGING_SHIFT_TABLE) % PAGING_TABLE_SIZE;
if(size > PAGING_TABLE_SIZE - offset){
if(kernel_dir[(uint32_t)vaddr >> PAGING_SHIFT_DIRECTORY + 1] == EMPTY)
create_table(kernel_dir , (uint32_t)vaddr >> PAGING_SHIFT_DIRECTORY + 1);
table = (page_table_t)((uint32_t)kernel_dir[(uint32_t)vaddr >> PAGING_SHIFT_DIRECTORY + 1] & PAGING_REMOVEFLAGS);
overflow = size - PAGING_TABLE_SIZE + offset;
for(i = 0; i < overflow; i++){
phys = (uint32_t)paddr + PAGING_TABLE_SIZE - offset + i * PAGING_PAGESIZE;
if(table[i] & PAGING_INUSE)
panic("Tried to map a mapped page");
table[i] = phys | PAGING_KERNEL;
}
}
if(kernel_dir[(uint32_t)vaddr >> PAGING_SHIFT_DIRECTORY] == EMPTY)
create_table(kernel_dir , (uint32_t)vaddr >> PAGING_SHIFT_DIRECTORY);
table = (page_table_t)(kernel_dir[(uint32_t)vaddr >> PAGING_SHIFT_DIRECTORY] & PAGING_REMOVEFLAGS);
for(i = 0; i < size - overflow; i++){
phys = (uint32_t)paddr + i * PAGING_PAGESIZE;
if(table[i + offset] & PAGING_INUSE)
panic("Tried to map a mapped page");
table[i + offset] = phys | PAGING_KERNEL;
}
puts("from %p to %p\n" , vaddr , (vaddr + size * PAGING_PAGESIZE));
}
und die Methode, die die Tabellen erstellt:
void create_table(directory_table_t directory , size_t dir_offset){
page_table_t table;
table = (page_table_t)palloc(PAGING_TABLE_SIZE * sizeof(page_table_t) / PAGING_PAGESIZE);
if(table == EMPTY)
//TODO call swapping
panic("Not enough physical memory");
memset(table , EMPTY , PAGING_TABLE_SIZE);
if(dir_offset >= PAGING_KERNEL_DIR_SIZE)
directory[dir_offset] = (uint32_t)table | PAGING_USER;
else
directory[dir_offset] = (uint32_t)table | PAGING_KERNEL;
}
Der Aufruf sieht wie folgt aus:
kernel_dir = (directory_table_t)palloc(PAGING_KERNEL_DIR_SIZE * sizeof(directory_table_t) / PAGING_PAGESIZE);
memset(kernel_dir , EMPTY , PAGING_KERNEL_DIR_SIZE);
//map the kernel
size = ((uint32_t)kernel_end - (uint32_t)kernel_start) / PAGING_PAGESIZE;
puts("\tMapped the kernel ");
map_init(kernel_start , kernel_mem_start , size);
//map the txt-video-memory
size = 80 * 25 * 2 / PAGING_PAGESIZE + 1;
puts("\tMapped the video-memory ");
map_init((phys_t)0xB8000 , (virt_t)0xB8000 , size);
//map the kernel_directory
puts("\tMapped the kernel-directory ");
map_init(kernel_dir , kernel_dir , 1);
//map the bitmap
size = bitmap_size / PAGING_PAGESIZE;
puts("\tMapped the bitmap ");
map_init(bitmap_entry, bitmap_entry , size);
PAGING_KERNEL setzt das Present, Readwrite und den Kernel-Flag in use
Vllt findet ihr den Fehler