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

页表操作宏解析
本文介绍了Linux内核中页目录与页表操作相关的宏定义,包括页目录索引提取、页目录项定位、页表项判断及清除等,并简要说明了likely与unlikely宏的作用。

一、存储管理类

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

 

待续。。。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值