内核中的基础知识积累

1、__bitwise

__be32,其定义扩展开为:

<span style="font-family:SimSun;font-size:18px;">#define __bitwise __attribute__((bitwise))
typedef unsigned int __u32;
typedef __u32 __bitwise __be32;
</span>

【作用】:

1.1 如果不利用sparse,__be32和__u32没有任何差别,但是如果利用sparse,它就能提供一种超强制的类型匹配检查。bitwise属性总是创建一个新的数据类型,所以一般的情况就是把bitwise用在typedef内。sparse是linus开发的一个静态检查代码的工具,通过 gcc 的扩展属性 __attribute__ 以及自己定义的 __context__ 来对代码进行静态检查。

1.2 强制安全位运算;保证数据位不丢失或循环移动。如加法运算不是位运算安全的,因为加法运算会导致位循环移动;但与运算(后面有特例)、比较运算就是位运算安全的;对一个bitwise的short或char做与运算也是不安全的。因为会导致类型提升,即转为int类型,此时可能会导致符号位改变。


2、sparse工具

2.1 __bitwise 的使用
如果此变量在多个位方式下(big-endian, little-endian)被使用了, Sparse 会给出警告.

2.2 __user 的使用
如果使用了 __user 宏的指针不在用户地址空间初始化, 或者指向内核地址空间, 设备地址空间等等, Sparse会给出警告.

2.3 __kernel 的使用

如果使用了 __kernel 宏的指针不在内核地址空间初始化, 或者指向用户地址空间, 设备地址空间等等, Sparse会给出警告.

2.4 __iomem 的使用

如果使用了 __iomem 宏的指针不在设备地址空间初始化, 或者指向用户地址空间, 内核地址空间等等, Sparse会给出警告.

2.5 __safe 的使用

使用了 __safe修饰的变量在使用前没有判断它是否为空(null), Sparse会给出警告.

gcc已经会对这种情况给出警告, 所以没有必要用Sparse去检查了.

2.6 __force 的使用

使用了__force修饰的变量可以进行强制类型转换, 没有使用 __force修饰的变量进行强制类型转换时, Sparse会给出警告.

2.7 __nocast 的使用
使用了__nocast修饰的参数的类型必须和实际传入的参数类型一致才行,否则Sparse会给出警告.

2.8 __acquires __releases __acquire __release的使用
这4个宏都是和锁有关的, __acquires 和 __releases 必须成对使用, __acquire 和 __release 必须成对使用, 否则Sparse会给出警告.

2.9 __cond_lock 的使用
这个宏有点特别, 因为没有 __cond_unlock 之类的宏和它对应.

当编译内核代码的时候,使用make C=1或C=2的时候,会调用Sparse

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值