Chinaunix首页 | 论坛 | 博客
  • 博客访问: 622004
  • 博文数量: 69
  • 博客积分: 1891
  • 博客等级: 上尉
  • 技术积分: 1359
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-20 23:38
文章分类

全部博文(69)

文章存档

2012年(46)

2011年(23)

分类: LINUX

2012-03-20 00:30:48

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

看看其中几个重要的常量
  • PMD_SHIFT 指定了页内偏移量和最后一级页表项所需的比特位的总数,该值表明了中间也表层管理的地址空间的大小,即是2^PMD_SHIFT字节
  • PUD_SHIFT,是PMD_SHIFT机上中间层也表索引所需的长度,它对应全局也目录一项中能寻址的地址长度
以下是一些常量,就不多说了

点击(此处)折叠或打开

  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来定义的。


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