红联Linux门户
Linux帮助

Linux内核编译中的小技巧

发布时间:2010-08-18 18:08:25来源:红联作者:easthome18
关于Linux的内核编译有不少系统管理员都不知道如何去处理。其实就像平时的Linux系统管理一样Linux内核编译也有技巧可以掌握。在本文中我们就向大家介绍下Linux内核编译几个个技巧。
 1构建泛型宏 (./linux/include/linux/kernel.h)
以下是代码片段:
#define min(x, y) ({ \
typeof(x) _min1 = (x); \
typeof(y) _min2 = (y); \
(void) (&_min1 == &_min2); \
_min1 < _min2 ? _min1 : _min2; })
 大家看了就明白是什么意思了。但是我还有几点疑问:
 (1)(void) (&_min1 == &_min2);这行代码是用来干什么的?
 (2)为什么{}的外面要加(),不加的时候编译是不通过的,具体是什么原因?
 2 范围的扩展
 (1) switch 语句
以下是代码片段:
switch(a)
{
case 1 ... 3:
printf("fafadsf");
break;
case 4 ... 8:
printf("dsafaf");
break;
}
 (2)数组的初始化 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };以上部分内核中用的很多。
 3 零长度的数组
以下是代码片段:
struct iso_block_store {
atomic_t refcount;
size_t data_size;
quadlet_t data[0];
};
 这允许结构中的元素引用结构实例后面紧接着的内存。在需要数量可变的数组成员时,这个特性很有用应用实例:
以下是代码片段:
struct iso_block_store * p =(void *)malloc(sizeof(struct iso_block_store) + data_size);
 4 获得函数的返回地址
 如下面的代码所示,__builtin_return_address 接收一个称为 level 的参数。这个参数定义希望获取返回地址的调用堆栈级别。例如,如果指定 level 为 0,那么就是请求当前函数的返回地址。如果指定 level 为 1,那么就是请求进行调用的函数的返回地址,依此类推。
以下是代码片段:
void * __builtin_turn_address( unsigned int level );
 在下面的示例中(见 ./linux/kernel/softirq.c),local_bh_disable 函数在本地处理器上禁用软中断,从而禁止在当前处理器上运行 softirqs、tasklets 和 bottom halves。使用 __builtin_return_address 捕捉返回地址,以便在以后进行跟踪时使用这个地址。
以下是代码片段:
void local_bh_disable(void){ __local_bh_disable((unsigned long)__builtin_return_address(0));}
文章评论

共有 1 条评论

  1. lyanxia28 于 2010-08-19 08:43:39发表:

    看不懂!