Linux中,特殊宏 __bitwise、 __force、 __init 、__initdata 的使用



  •  __bitwise 
 用于编译时sparse的强制类型检查,我们知道数值类型有Little-Endian,Big-Endian 以及 CPU-Endian等,

 参考 http://www.woxihuan.com/74285086/1351231634127226.shtml

  • __init、__initdata和__exit、__exitdata

定义位于<linux/init.h>,

这些宏定义的作用是告诉编译器将这些函数或者数据放入相应的section中,而在模块加载的阶段,.ko文件中的代码和数据的加载区域是根据section来加载的。

 

函数的定义中带有__init: 这个函数的所有代码会被放入.init.text的section中。

函数的定义中带有__initdata:这个函数的所有代码会被放入.init.data的section中。 

之所以要使用这个宏定义,是标记为初始化的函数和数据,表明该函数和数据仅在初始化期间使用。

在模块装载之后,模块装载就会将初始化函数扔掉。这样可以将该函数占用的内存释放出来。 

这种释放根据是否编译进内核是有区别的:

(1)模块编译进内核:所有的初始化数据和函数都是在系统启动的最后阶段,在所有模块都初始化完成以后被内核统一释放的。所有你一般可以在内核启动信息的后面看到:

1.                        Freeing init memory: 196K

(2)独立的模块:模块是通过module-init-tool中的insmod的程序利用系统调用来挂载的,而所有的初始化数据和函数都是被这个系统调用所使用的,在模块挂载完成并初始化过后,由系统调用来完成对初始化数据和函数所占空间的释放。

所以对于将内核驱动代码中的函数和数据定义为“初始化”时需要注意:不要将驱动定义的文件方法(如 open、read、write、close)或者驱动在实际工作中需要使用的函数和数据定义为“初始化”属性,因为在驱动初始化后这些东东就已经被释放了,如果使用了就会Oops。

  • __weak
也可以通过GCC的"__attribute__((weak))"
变量加上weak时,是弱符号。函数加上weak时,是弱引用,可以不实现。
给函数加上weak属性时,即使函数没定义,函数被调用也可以编译成功。
当有两个函数同名时,则使用强符号(也叫全局符号,即没有加weak的函数)来代替弱符号(加weak的函数)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值