#include #include #include uint32_t *page_directory; uint32_t *page_tables[1024]; void set_page_directory(uint32_t page_directory) { asm volatile("mov %0, %%cr3":: "b"(page_directory)); } void enable_paging() { unsigned int cr0; asm volatile("mov %%cr0, %0": "=b"(cr0)); cr0 |= CR0_ENABLE_PAGING; asm volatile("mov %0, %%cr0":: "b"(cr0)); } void paging_map_4kb(uint32_t vmem, uint32_t pmem) { uint32_t pdEntry = vmem >> 22; uint32_t ptEntry = (vmem >> 12) % 1024; //kprintf("[ PAGING ] Mapping PDEntry: %d, PTEntry: %d\n Wert in der PageTable: 0x%x\n", pdEntry, ptEntry, pmem | FLAG_PRESENT | FLAG_WRITEABLE | FLAG_ACCESS); ((uint32_t*)(page_directory[pdEntry] & ~(FLAG_PRESENT | FLAG_WRITEABLE | FLAG_ACCESS | FLAG_WT_CACHE | FLAG_NO_CACHE | FLAG_PT_USED | FLAG_WRITTEN | FLAG_4MB_PAGES | FLAG_KEEP_TLB)))[ptEntry] = pmem | FLAG_PRESENT | FLAG_WRITEABLE | FLAG_ACCESS; asm volatile("invlpg %0"::"m"(*(char*)vmem)); } /// Mappt [size] Seiten von der angegebenen physischen Adresse in die angegebene virtuelle Adresse void paging_map_physical(uint32_t vmem, uint32_t pmem, uint32_t size) { unsigned int i; for(i = 0; i < size; i++) { paging_map_4kb(vmem + (i * 0x1000), pmem + (i * 0x1000)); } } void init_paging() { page_directory = pmm_alloc(); //kprintf("[ PAGING ] Page directory is located at 0x%x\n", page_directory); unsigned int i; for(i = 0; i < 1024; i++) { page_tables[i] = pmm_alloc(); page_directory[i] = (uint32_t)page_tables[i] | FLAG_PRESENT | FLAG_WRITEABLE | FLAG_ACCESS; //kprintf("[ PAGING ] Page table %d is located at 0x%x\n", i, page_tables[i]); } paging_map_physical(0, 0, 4096); set_page_directory((uint32_t)page_directory); //kprintf("[ PAGING ] Page directory set\n"); //enable_paging(); //kprintf("[ PAGING ] Paging enabled\n"); }