uint32 ArchMemory::getValueForCR3() { // last 5 bits must be zero! assert(((uint32)page_dir_pointer_table_ & 0x1F) == 0); size_t ppn = 0; if (get_PPN_Of_VPN_In_KernelMapping(((size_t)page_dir_pointer_table_) / PAGE_SIZE,&ppn) > 0) return ppn * PAGE_SIZE + ((size_t)page_dir_pointer_table_ % PAGE_SIZE); assert(false); return 0; }
uint64 ArchMemory::get_PAddr_Of_VAddr_In_KernelMapping(uint64 virtual_addr) { uint64 physical_addr; uint32 page_size = get_PPN_Of_VPN_In_KernelMapping(virtual_addr / PAGE_SIZE, &physical_addr); return physical_addr * page_size + (virtual_addr % PAGE_SIZE); }