我正在创建一个简单的驱动程序,并遇到了一个示例代码,它执行此操作
if(IS_ERR(c = class_create(THIS_MODULE, "char")))
{
...
}
我试着知道IS_ERR()后面是什么,我看到了这一点 它定义为, ...
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
static inline long __must_check IS_ERR(const void *ptr)
{
return IS_ERR_VALUE((unsigned long)ptr);
}
这是什么'不太可能'事?
答案 0 :(得分:3)
参考:http://kernelnewbies.org/FAQ/LikelyUnlikely
possible()和impossible()是编译器指令,用于以最佳利用处理器管道的方式重新排列生成的条件分支代码。
if(可能(条件)):这个条件将是" true"在大多数情况下,编译器应该以这样的方式安排分支,即'然后'语句具有最少的跳转和管道刷新。
if(不太可能(条件)):这个条件将是" false"在大多数情况下,编译器应该以这样的方式安排分支,即“' else'语句具有最少的跳转和管道刷新。
答案 1 :(得分:0)
unlikely()
的定义位于include/linux/compiler.h
,其中之一是:
# ifndef likely
# define likely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 1))
# endif
# ifndef unlikely
# define unlikely(x) (__builtin_constant_p(x) ? !!(x) : __branch_check__(x, 0))
# endif
这些宏是编译器的优化提示。