Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3125583
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: LINUX

2015-01-07 16:34:52

原文地址:
http://blog.csdn.net/kernel_details/article/details/1483683
http://blog.csdn.net/kernel_details/article/details/1483691

当RAM小于896MB时,初始化主内核页全局目录表--最终内核页表

void __init paging_init(void)
{
#ifdef CONFIG_X86_PAE
    set_nx();
    if (nx_enabled)
        printk("NX (Execute Disable) protection: active/n");
#endif

初始化页目录表的高256项及其所对应的页表
|----------------------|
|   pagetable_init();  |
|----------------------|

将页目录表的首地址转换成为物理地址,并将写入控制寄存器%%cr3中
|-----------------------------|
|   load_cr3(swapper_pg_dir); |
|-----------------------------|

#ifdef CONFIG_X86_PAE
    if (cpu_has_pae)
        set_in_cr4(X86_CR4_PAE);
#endif

使TLB的所有项无效
|----------------------|
|   __flush_tlb_all(); |
|----------------------|

    kmap_init();



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
}

阅读(949) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~