Пример #1
0
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);
}
Пример #2
0
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));
}
Пример #3
0
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));
}
Пример #4
0
 friend std::uint32_t luma_buffer_phys(std::shared_ptr<buffer<U>> const& p) {
   return phys_addr(p);
 }
Пример #5
0
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();

}
Пример #6
0
inline std::uint32_t luma_buffer_phys(sink::buffer const& b) { return phys_addr(b); }