static void reserve_kernel_memory(void) { const unsigned long kern_addr = phys_addr(__kernel_begin); const unsigned long kern_end = phys_addr(__kernel_end); debug("Reserve kernel memory 0x%x-0x%x\n", kern_addr, kern_end - 1); boot_mem_reserve(kern_addr, kern_end); }
void init_mm (u32_t magic, u32_t addr) { multiboot_info_t *mbi = (multiboot_info_t *) addr; u32_t up_mem_kb = 0; if ( is_bit_set (mbi->flags, 0) ) up_mem_kb = mbi->mem_upper; init_paging (up_mem_kb, phys_addr ( (u32_t) __kernel_img_end) ); _mbi = mbi; init_page_alloc (up_mem_kb, phys_addr ( (u32_t) __kernel_img_end)); }
static void remap_lower_memory(void) { memcpy(swapper_page_dir + LOWMEM_PAGE_DIR, initial_page_dir + LOWMEM_PAGE_DIR, KERNEL_PAGE_DIRS * sizeof(pde_t)); load_cr3(phys_addr(swapper_page_dir)); }
friend std::uint32_t luma_buffer_phys(std::shared_ptr<buffer<U>> const& p) { return phys_addr(p); }
void init_paging (u32_t upper_mem_kb, u32_t img_phys_end_addr) { u32_t tmp1 = 0xA000; u32_t tmp2 = PAGE_OFFSET; u32_t phys_end_of_kernel = kernel_phys_end_addr ( upper_mem_kb, img_phys_end_addr); /* Setup the page directory entry for the region 0-4 MB */ insert_pg_dir_entry ( 0, (u32_t *) phys_addr ( (u32_t) kernel_pg_dir), phys_addr ( (u32_t) pg_table2), PRESENT | RW | ACCESSED); /* Identity map the video memory */ while ( tmp1 <= 0xFF000) { insert_pg_table_entry ( tmp1, (u32_t *) phys_addr ( (u32_t) pg_table2), tmp1, PRESENT | RW | CACHE_DISABLE | ACCESSED); tmp1 += PAGE_SIZE_BYTES; } tmp1 = (u32_t) __kernel_load_addr; /* Identity map the kernel */ while ( tmp1 < phys_end_of_kernel) { insert_pg_table_entry ( tmp1, (u32_t *) phys_addr ( (u32_t) pg_table2), tmp1, PRESENT | RW | GLOBAL | ACCESSED); tmp1 += PAGE_SIZE_BYTES; } /* Set the page directory entry for the 4 MB starting at * virtual address 0xC0000000 */ insert_pg_dir_entry (PAGE_OFFSET, (u32_t *) phys_addr ( (u32_t) kernel_pg_dir), phys_addr ( (u32_t) pg_table1), PRESENT | RW | GLOBAL | ACCESSED); tmp1 = (u32_t) __kernel_load_addr; tmp2 = PAGE_OFFSET; /* Map the virtual kernel address space onto the physical * pages */ while ( tmp1 < phys_end_of_kernel) { insert_pg_table_entry ( tmp2, (u32_t *) phys_addr ( (u32_t) pg_table1), tmp1, PRESENT | RW | GLOBAL | ACCESSED); tmp1 += PAGE_SIZE_BYTES; tmp2 += PAGE_SIZE_BYTES; } /* Map the page directory onto itself in the upper 4 MB of the * virual address space. This is needed for mapping physical * pages into the virtual address space */ kernel_pg_dir [1023] = (u32_t) kernel_pg_dir | PRESENT | RW | ACCESSED; /* Let the CPU know where the page directory is */ set_pg_dir ( phys_addr ( (u32_t) kernel_pg_dir)); /* Lets get the show on the road :) */ enable_paging(); }
inline std::uint32_t luma_buffer_phys(sink::buffer const& b) { return phys_addr(b); }