Linux页表机制管理初始化


linux页表机制的建立分为两个阶段,第一个阶段在启动初始化时,调用汇编代码实现临时的分页;第二阶段在内核初始化时建立完整的完整的页表机制。对于物理地址扩展(PAE)分页机制中,intel通过在她得处理器上把管脚数从32增加到36已经满足了这些需求,寻址能力可以达到64GB。不过,只有引入一种新的分页机制把32位线性地址转换为36位物理地址才能使用所增加的物理地址。linux为对多种体系的支持,选择了一套简单的通用实现机制。在这里,只分析x86 32位下的实现。

下图为一个linux分页机制框架图:

Linux页表机制管理初始化





一、临时内核页表初始化

setup_32.S

[cpp]
  1. page_pde_offset = (__PAGE_OFFSET >> 20);  
  2.   
  3.     movl $pa(__brk_base), %edi  
  4.     movl $pa(swapper_pg_dir), %edx  
  5.     movl $PTE_IDENT_ATTR, %eax  
  6. 10:  
  7.     leal PDE_IDENT_ATTR(%edi),%ecx      /* Create PDE entry */  
  8.     movl %ecx,(%edx)            /* Store identity PDE entry */  
  9.     movl %ecx,page_pde_offset(%edx)     /* Store kernel PDE entry */  
  10.     addl $4,%edx  
  11.     movl $1024, %ecx  
  12. 11:  
  13.     stosl  
  14.     addl $0x1000,%eax  
  15.     loop 11b  
  16.     /* 
  17.      * End condition: we must map up to the end + MAPPING_BEYOND_END. 
  18.      */  
  19.     movl $pa(_end) + MAPPING_BEYOND_END + PTE_IDENT_ATTR, %ebp  
  20.     cmpl %ebp,%eax  
  21.     jb 10b  
  22.     addl $__PAGE_OFFSET, %edi  
  23.     movl %edi, pa(_brk_end)  
  24.     shrl $12, %eax  
  25.     movl %eax, pa(max_pfn_mapped)  
  26.   
  27.     /* Do early initialization of the fixmap area */  
  28.     movl $pa(swapper_pg_fixmap)+PDE_IDENT_ATTR,%eax  
  29.     movl %eax,pa(swapper_pg_dir+0xffc)  

对于页表初始化的原理如果可以参考intel手册。

其中常量PTE_IDENT_ATTR定义在patable_types.h中。

[cpp]
  1. #define PTE_IDENT_ATTR   0x003      /* PRESENT+RW */  

二、启动分页机制

实现代码在head_32.S中。

[cpp]
  1. movl $pa(swapper_pg_dir),%eax  
  2. movl %eax,%cr3      /* set the page table pointer.. */  
  3. movl %cr0,%eax  
  4. orl  $X86_CR0_PG,%eax  
  5. movl %eax,%cr0      /* ..and set paging (PG) bit */  
  • 1
  • 2
  • 3
  • 下一页

相关内容