1016
技術社區[雲棲]
網絡子係統2_設備子係統相關的初始化
//在socket文件係統注冊之後,設備驅動程序注冊之前被調用
//start_kernel->rest_init->kernel_thread->init->do_basic_setup->do_initcalls->net_dev_init
2.1 static int __init net_dev_init(void)
{
...
//proc文件係統中相關項的初始化
if (dev_proc_init())
goto out;
//注冊網絡設備類
if (netdev_sysfs_init())
goto out;
//初始化ETH_P_ALL的鏈表
INIT_LIST_HEAD(&ptype_all);
//初始化l3協議的hash表
//通過dev_add_pack和dev_remove_pack添加l3協議
//鏈表元素為struct packet_type
for (i = 0; i < 16; i++)
INIT_LIST_HEAD(&ptype_base[i]);
//初始化與設備相關的兩個hash表
//其中一個hash設備名
for (i = 0; i < ARRAY_SIZE(dev_name_head); i++)
INIT_HLIST_HEAD(&dev_name_head[i]);
//另一個hash設備編號
for (i = 0; i < ARRAY_SIZE(dev_index_head); i++)
INIT_HLIST_HEAD(&dev_index_head[i]);
//初始化per-cpu的接收隊列
for (i = 0; i < NR_CPUS; i++) {
struct softnet_data *queue;
queue = &per_cpu(softnet_data, i);
//不適用napi的設備的接收到的流量將會掛載到此queue上
skb_queue_head_init(&queue->input_pkt_queue);
//與擁塞管理算法相關的字段
//表示cpu當前接收隊列是否被關閉,當input_pkt_queue滿時,throttle=1,
//標示此cpu的接收功能被關閉,當第一個幀排入空隊列時,throttle會被netif_rx消除(注:netif_rx由非napi設備調用)
queue->throttle = 0;
//cng_level, avg_blog在get_sample_stats中被更新
//get_sample_states由netif_rx調用
queue->cng_level = 0;//擁塞等級
queue->avg_blog = 10; //平均值
//緩衝區list,其中為完成傳輸的skb,等待被釋放
queue->completion_queue = NULL;
//此list上的設備都帶有輸入幀接收輪詢,中斷功能被關閉
INIT_LIST_HEAD(&queue->poll_list);
//不使用napi的設備,linux默認提供一個積壓設備,完成輪詢
//__LINK_STATE_START表示設備已開啟
set_bit(__LINK_STATE_START, &queue->backlog_dev.state);
//設置積壓設備的權重,weight_p通過proc文件係統修改
queue->backlog_dev.weight = weight_p;
//積壓設備的輪詢函數
queue->backlog_dev.poll = process_backlog;
atomic_set(&queue->backlog_dev.refcnt, 1);
}
//注冊網絡傳輸和接收的軟中斷
open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL);
open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL);
//注冊dst通知鏈,通知dst_entry子係統有關net_device unregister、ifdown的event
dst_init();
//多播的初始化
dev_mcast_init();
rc = 0;
out:
return rc;
}
//subsys_initcall的優先級低於core_initcall
subsys_initcall(net_dev_init);
最後更新:2017-04-03 15:21:55