一个人的差异在于业余时间
分类: LINUX
2014-03-03 23:47:31
点击(此处)折叠或打开
先看dev_proc_init函数 它在/proc/net 下注册3个文件:
Dev 如果cat 表示输出系统所以netdevie 设备的统计信息. 而这些设备都挂着全局设备链表dev_base上.
Softnet :
#cat /proc/net/softnet_stat
0d02effd 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000f43
00010042 00000000 00000000 00000000 00000000
00000000 00000000 00000000 000009b9
000026be 00000000 00000000 00000000 00000000
00000000 00000000 00000000 0000012a
0000113e 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000054
四行表示4个CPU,
第一列为该CPU所接收到的所有数据包, 第二列为该CPU缺省queue满的时候, 所删除的包的个数,(没有统计对于使用NAPI的adapter, 由于ring 满而导致删除的包),第三列表示time_squeeze, 就是说,一次的软中断的触发还不能处理完目前已经接收的数据,因而要设置下轮软中断,time_squeeze 就表示设置的次数.
第四--第八暂时没用, 最后一个为CPU_collision,cpu 碰撞ci数.(net/sched.c) 这些信息对分析cpu队列性能会有帮助.
ptye:
通过dev_add_pack函数注册网络协议,包类型
void dev_add_pack(struct
packet_type *pt)
{
int hash;
spin_lock_bh(&ptype_lock);
if (pt->type == htons(ETH_P_ALL))
list_add_rcu(&pt->list,
&ptype_all);
else {
hash = ntohs(pt->type) &
PTYPE_HASH_MASK;
list_add_rcu(&pt->list,
&ptype_base[hash]);
}
spin_unlock_bh(&ptype_lock);
}
INIT_LIST_HEAD(&ptype_all);
for
(i = 0; i < PTYPE_HASH_SIZE; i++)
INIT_LIST_HEAD(&ptype_base[i]);
点击(此处)折叠或打开
点击(此处)折叠或打开
dst_init();
注册路由通知链
dev_mcast_init();
在proc/net/下创建 dev_mcast 和链路层组播相关.
cat 输出当前内核注册网络处理协议 .
netdev_kobject_init() 在/sys/class/下注册net类 它和设备模型有关.
接下来我们看
register_pernet_subsys注册的所有的网络命名空间子系统都加入到 static struct list_head *first_device = &pernet_list;这个链表里.而它的深远意义目前不是很懂.
接着初始化cpu收发队列 ,这里是重点.
对于struct softnet_data这个结构体需要单独讲解. cpu队列在以后数据收发时我们会经常见到它,看过NAPI机制的人应该更加熟悉.
register_pernet_device(&loopback_net_ops)注册lo 回环网络设备.
open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);
注册收发软中断,发送中断和tc有关. 看它的调用机制就明白。 接收中断napi机制有关.
hotcpu_notifier(dev_cpu_callback, 0); 注册cpu通知链,在cpu热插拔的时候,调用回调函数.