pagetable_init()

来源:互联网 发布:js字符串比较大小 编辑:程序博客网 时间:2024/05/20 10:22
pagetable_init()根据物理内存初始化页目录项及页表项
static void __init pagetable_init (void)
{
    unsigned 
long vaddr;
    pgd_t 
*pgd_base = swapper_pg_dir;

#ifdef CONFIG_X86_PAE
    
int i;
     //初始化整个页目录项(1024项)
    
for (i = 0; i < PTRS_PER_PGD; i++)
        set_pgd(pgd_base 
+ i, __pgd(__pa(empty_zero_page) | _PAGE_PRESENT));
#endif

    
if (cpu_has_pse) {
        set_in_cr4(X86_CR4_PSE);
    }

    
if (cpu_has_pge) {
        set_in_cr4(X86_CR4_PGE);
        __PAGE_KERNEL 
|= _PAGE_GLOBAL;
        __PAGE_KERNEL_EXEC 
|= _PAGE_GLOBAL;
    }

    kernel_physical_mapping_init(pgd_base);
    remap_numa_kva();
    vaddr 
= __fix_to_virt(__end_of_fixed_addresses - 1& PMD_MASK;
    page_table_range_init(vaddr, 
0, pgd_base);

    permanent_kmaps_init(pgd_base);

#ifdef CONFIG_X86_PAE
    pgd_base[
0= pgd_base[USER_PTRS_PER_PGD];
#endif
}