一、存储管理类
定义的有关页目录与页表操作的宏。相关定义都在<asm/pgtable.h>文件中
1:
#define pgd_index(addr) ((addr) >> PGDIR_SHIFT)
#define __pgd_offset(addr) pgd_index(addr)
提取被访问地址中用于在页目录中索引的部分
2:
#define pgd_offset(mm,addr) ((mm)->pgd+pgd_index(addr))
根据逻辑地址及页目录基地址找到对应的页目录项
3:
#define pte_none(pte) (!pte_val(pte))
判断页表项是否为空
4:
#define pte_clear(ptep) set_pte((ptep), __pte(0))
把对应页表项清为空
5:
#define pte_page(x) (virt_to_page(__va(pte_val ((x)))))
找出页表项对应的页首地址
6:
#define mk_pte(page,pgprot) /
({ /
pte_t __pte; /
pte_val(__pte) = __pa(page_address(page)) + pgprot_val(pgprot); /
__pte; /
})
根据页首地址和访问属性合成为一个合法的页表项
其它:
1:
在2.6内核中,随处可以见到likely()和unlikely()宏。定义如下
#define likely() __builtin_expect(!!(x), 1)
#define unlikely() __builtin_expect(!!(x), 0)
__builtin_expect()是GCC(version>=2.96)提供给程序员使用的,目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降。
__builtin_expect((x), 1)表示x的值为真的可能性更大。
__builtin_expect((x), 0)表示x的值为假的可能性更大。
也就是说,使用likely(),执行if后面的语句的机会更大;使用unlikely(),执行else后面的语句的机会更大。例见kernel/fork.c中do_fork函数。
待续。。。