内存管理(四) 页表数据结构

5537阅读 0评论2012-03-20 kenvifire
分类:LINUX

   我们知道,系统不可能给所有进程3G的地址空间,但是每个进程看到的都是3G的地址空间,其实进程所看到的进程空间是虚拟的,而维持虚拟空间到实际物理空间的映射是通过页表来实现的,下面来讲解一下页表的结构。
   目前内核内存管理总是假定系统使用的是四级的页表。
1、首先,看看内存地址在也表中是如何分解的:

看看其中几个重要的常量
以下是一些常量,就不多说了

点击(此处)折叠或打开

  1. #define PMD_SHIFT PUD_SHIFT
  2. #define PTRS_PER_PMD 1
  3. #define PMD_SIZE (1UL << PMD_SHIFT)
  4. #define PMD_MASK (~(PMD_SIZE-1))

点击(此处)折叠或打开

  1. #define SHARED_KERNEL_PMD 0
  2. #define PAGETABLE_LEVELS 4
  3. /*
  4. * PGDIR_SHIFT determines what a top-level page table entry can map
  5. */
  6. #define PGDIR_SHIFT 39
  7. #define PTRS_PER_PGD 512
  8. /*
  9. * 3rd level page
  10. */
  11. #define PUD_SHIFT 30
  12. #define PTRS_PER_PUD 512
  13. /*
  14. * PMD_SHIFT determines the size of the area a middle-level
  15. * page table can map
  16. */
  17. #define PMD_SHIFT 21
  18. #define PTRS_PER_PMD 512
  19. /*
  20. * entries per page directory level
  21. */
  22. #define PTRS_PER_PTE 512
2、再看看也表的结构
   pgd_t用于全局页目录项
   pud_t用于上层目录项
   pmd_t用于中间页目录项
   pte_t用于直接页目录项


点击(此处)折叠或打开

  1. typedef unsigned long pteval_t;
  2. typedef unsigned long pmdval_t;
  3. typedef unsigned long pudval_t;
  4. typedef unsigned long pgdval_t;

点击(此处)折叠或打开

  1. typedef struct { pgdval_t pgd; } pgd_t;
  2. typedef struct { pudval_t pud; } pud_t;
  3. typedef struct { pmdval_t pmd; } pmd_t;
  4. typedef union {
  5. pteval_t pte;
  6. pteval_t pte_low;
  7. } pte_t;
由以上代码可知,这些页页目录和页表项的类型都是unsigned long的,最后的pte_t是用一个union来定义的。


上一篇:内存管理(三) 内存模型之page
下一篇:内存管理(五) 页表项函数