今天在看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) |