Ich wollte noch ein wenig Speicher sparen und habe die gesamte PD auf das letzte Element der letzten Tabelle gemappt.
Das müsste gehen, oder?
Mein Problem ist nur, dass ich einen PF bekomme, wenn ich versuche diese Seite anzusprechen.
Finde den Fehler leider nicht.
create_table(dir , PAGING_TABLE((uint32_t)PAGING_VIRT_DIR_ADDR));
table = (page_table_t)dir[PAGING_TABLE((uint32_t)PAGING_VIRT_DIR_ADDR)];
table[PAGING_PAGE((uint32_t)PAGING_VIRT_DIR_ADDR)] = (uint32_t)dir | PAGING_KERNEL;
void create_table(directory_table_t directory , size_t dir_offset){
page_table_t new_table = (page_table_t)palloc(1);
if(dir_offset <= PAGING_KERNEL_DIR_END)
directory[dir_offset] = (uint32_t)new_table | PAGING_KERNEL;
else
directory[dir_offset] = (uint32_t)new_table | PAGING_USER;
new_table = (page_table_t)directory[dir_offset];
memset(new_table , EMPTY , PAGING_TABLE_SIZE);
invalid_tlb((virt_t)(directory + sizeof(uint32_t) * dir_offset));
}
Der Aufruf findet wie folgt statt:
ret_addr = alloc_pages((directory_table_t)PAGING_VIRT_DIR_ADDR ,
(virt_t)0x0 , (virt_t)PAGING_KERNEL_MEM_END , size);
Keine Ahnung woran das liegt.
Habe es auch mal gedebuggt aber leider nicht den Fehler gefunden.