linux 2.6源代码情景分析笔记之内存4

--------------------------------------------------
几个宏:
PGDIR_SHIFT:确定页全局目录项能映射的区域大小的对数。此宏用于计算页全局目录中一个单独表项所能映射区域的大小。PGDIR_MASK用于屏蔽offset table,middle air,upper dir.字段的所有位。
#define PGDIR_SHIFT     22//当物理地址扩展机制(pae)被禁止时,当激活的时候,此时就为30位(12位偏移,9位表,9位中间目录)
#define PGDIR_SIZE      (1UL << PGDIR_SHIFT)//此时为2的22次方,4MB.当激活的时候,就是2的30次方,1GB.
#define PGDIR_MASK      (~(PGDIR_SIZE-1))//0xffc00000

PUD_SHIFT:确定页上级目录项能映射的区域大小的对数。此宏用于计算全局目录中的一个单独表项所能映射的区域大小。PUD_MASK用于屏蔽offset字段,table字段,中间层字段,upper dir字段的所有位。
#define PUD_SHIFT       PGDIR_SHIFT
#define PUD_SIZE        (1UL << PUD_SHIFT)
#define PUD_MASK        (~(PUD_SIZE-1))

指定线性地址的offset字段和table字段的总位数。是页中间目录项可以映射的区域大小的对数。size用于计算由页中间目录的一个单独表项所映射的区域大小(页表大小)mask用于屏蔽offset字段与table字段的所有位。。
#define PMD_SHIFT       PUD_SHIFT
#define PMD_SIZE        (1UL << PMD_SHIFT)
#define PMD_MASK        (~(PMD_SIZE-1))

PAGE_SHIFT:指定offset字段的位数;当x86时,为12.再看他的尺寸:1<< PAGE_SHIFT将1左移12位,也就是1*2^12=4096个字节。1UL的意思是unsigned long的1.而PAGE_MASK用以屏蔽offset字段的所有位置。
#define PAGE_SHIFT      12
#define PAGE_SIZE       (1UL << PAGE_SHIFT)
#define PAGE_MASK       (~(PAGE_SIZE-1))

以上也就是全局->上级—>中间目录—>页表这个顺序。而除了上面的宏之外,还有表明各个层次之间表项个数的宏。
PTRS_PER_PTE,当ape失效时,1024;当有效时,512.
PTRS_PER_PMD,当。。。。。,1;。。。。。。。512.
PTRS_PER_PUD,当。。。。。,1;。。。。。。。1.
PTRS_PER_PGD,当。。。。。,1024;。。。。。4.

typedef struct { unsigned long pte;} pte_t;
typedef struct { unsigned long pmd[16];} pmd_t;
typedef struct { unsigned long pgd;} pgd_t;
typedef struct { pgd_t pgd;} pud_t;
对应上面的几个。
typedef struct { unsigned long pgprot;} pgprot_t;//表示与一个单独表项相关的保护标志。
-------------------------------------------------------
定义了下面的几个宏,用于转换类型,将无符号整数转换成所需的类型。
#define __pte(x)        ((pte_t) { (x) } )
#define __pmd(x)        ((pmd_t) { (x) } )
#define __pgd(x)        ((pgd_t) { (x) } )
#define __pgprot(x)     ((pgprot_t) { (x) } )
#define __pud(x)        ((pud_t) { __pgd(x) } )

还定义了反向的几个宏,
#define pte_val(x)      ((x).pte)
#define pmd_val(x)      ((&x)->pmd[0])
#define pgd_val(x)      ((x).pgd)
#define pgprot_val(x)   ((x).pgprot)
#define pud_val(x)      (pgd_val((x).pgd))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值