Chinaunix首页 | 论坛 | 博客
  • 博客访问: 373264
  • 博文数量: 64
  • 博客积分: 2975
  • 博客等级: 少校
  • 技术积分: 831
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-14 10:59
文章存档

2014年(2)

2012年(7)

2010年(40)

2009年(5)

2008年(8)

2007年(2)

分类: LINUX

2008-10-06 13:52:27

今天在看v2.4.0 net/ipv4/tcp.c的代码时,有这么几行
extern void __skb_cb_too_small_for_tcp(int, int);
void __init tcp_init(void)
{
 struct sk_buff *skb = NULL;
 unsigned long goal;
 int order, i;
 if(sizeof(struct tcp_skb_cb) > sizeof(skb->cb))
  __skb_cb_too_small_for_tcp(sizeof(struct tcp_skb_cb),
        sizeof(skb->cb));
...
}
 
想找到__skb_cb_too_small_for_tcp的实现,找遍所有的代码中都没有找到,确定没有被实现,很是奇怪。
 
后来一想,sizeof是编译时确定值的,那么if(sizeof(struct tcp_skb_cb) > sizeof(skb->cb))编译时大概被替换成if(x>y),x,y为整数,那么编译时就可以计算出该条件的真假,从而可以做出优化。
 
如果x>y为假,则后面的__skb_cb_too_small_for_tcp不会被执行,于是这个判断被会gcc优化掉了。
如果x>y为真,则后面的__skb_cb_too_small_for_tcp将会被执行,在最后链接内核时会报错,告诉__skb_cb_too_small_for_tcp没有被实现,由此得知sizeof(struct tcp_skb_cb) > sizeof(skb->cb),而这是不被允许的,从而提醒我们需要检查代码。
 
阅读(1202) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~