Linux源码 宏文件,技术分享-高效学习Linux内核——从源码中的宏下手

在阅读Linux内核代码时,在代码的开头总是有各种各样的宏定义,了解熟悉这些宏定义,对于代码的理解和快速修改代码提供了便利。有些宏相对简单,一眼便可以了解作用,有些就稍微复杂一些,需要一些逻辑,今天就给大家总结了一些常见的宏定义,帮助大家更快,更好的理解内核代码。

一、什么是宏

在C语言中,可以采用命令#define来定义宏。该命令允许把一个名称指定成任何所需的文本,例如一个常量值或者一条语句。在定义了宏之后,无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本替换掉。

186790610_1_20200329101256494

替换列表和标识符列表都是将字符串token化以后的列表。区别在于标识符列表使用,作为不同参数之间的分割符。每一个参数都是一个token化的列表。在宏中空白符只起到分割token的作用,空白符的多少对于预处理器是没有意义的。

二、内核中常见的宏

__CONCAT宏

"##"用于粘贴两个参数,"#"用于替换参数:

186790610_2_20200329101256947

BUILD_BUG_ON宏

186790610_3_2020032910125725

!!(e)对e的结果进行两次求非。如果e为0,则结果为0;如果e不为0,则结果为1。所以上述表达式的结果有两种:

1,condition为真时,sizeof(char[-1]),产生错误,编译不通过

2,condition为假时,sizeof(char[1]),编译通过

例如,在飞凌6Q的3.0.35的内核中,/driver/usb/storage/uas.c/usb接口u盘的驱动中就有使用该宏

186790610_4_20200329101257119

BUILD_BUG_ON_ZERO(e)宏

186790610_5_20200329101257588

检查表达式e是否为0,为0编译通过且返回0;如果不为0,则编译不通过

186790610_6_20200329101258119

如果e为0,则该结构体拥有一个int型的数据域,并且规定它所占的位的个数为0。

186790610_7_20200329101258447

如果e非0,结构体的int型数据域的位域将变为一个负数,产生语法的错误

typecheck宏

该宏在/include/linux/typecheck.h中定义

186790610_8_20200329101258744

用于检查x是否为type类型,如果不是会抛出(warning: comparison of distinct pointer types lacks a cast)例如,在内核中/include/linux/rwlock.h中便使用到了该宏,用于读写锁的定义中。

186790610_9_20200329101259229

__is_constexpr宏

186790610_10_20200329101302494

判断x是否为整数常量表达式:如果x是常量表达式,则(void )((long)(x) 0l)是一个空指针常量,就会使用第三个操作数即((int *)8)的类型。如果不是常量表达式,则会使用第二个操作数void类型。

roundup宏

该宏在/include/linux/kernel.h中被定义。

186790610_11_20200329101304510

返回一个能够整除y并且大于x,最接近x的值,向上取整,可用于地址的内存对齐。

clamp宏

186790610_12_20200329101304854

判断val是否在lo和hi的范围内,如果小于lo,返回lo,如果大于hi则返回hi,如果在lo和hi之间就返回val。

swap宏

186790610_13_20200329101305104

利用typeof获取要交换变量的类型

container_of宏

186790610_14_20200329101305369

根据一个结构体变量中的成员变量来获取整个结构体变量的指针

ALIGN对齐宏

186790610_15_20200329101306119

对齐是采用上对齐的方式,例如0x123以16对齐,结果是0x130,因为对齐常在分配内存时使用,所以分配的要比需要的大。

mdelay宏

186790610_16_20200329101307447

忙等待函数,在延迟过程中无法运行其他任务,会占用CPU时间,延迟时间是准确的

三、总结

像开头说的,内核源码中有各种各样的宏,在这里不能一一罗列。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值