linux内核中常用的一些宏收集

一、存储管理类

定义的有关页目录与页表操作的宏。相关定义都在<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函数。

 

待续。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值