关于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));}
                  	
				

lyanxia28 于 2010-08-19 08:43:39发表:
看不懂!