閱讀1016 返回首頁    go 技術社區[雲棲]


網絡子係統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

  上一篇:go 網絡子係統3_do_softirq調用點
  下一篇:go 網絡子係統1_socket文件係統相關的初始化