本文共 2839 字,大约阅读时间需要 9 分钟。
用户态软件 /\ || \/系统库函数 /\ || \/C标准库或者glibc /\ || 系统调用 \/内核态系统调用接口 /\ || \/内核协议栈L3到最上层 /\ || \/L2协议栈以及驱动 /\ || \/L1硬件网卡NIC
网络初始化入口
int __init net_dev_init(void) dev_proc_init() =>int __init dev_proc_init(void) return register_pernet_subsys(&dev_proc_ops); static struct pernet_operations __net_initdata dev_proc_ops = { .init = dev_proc_net_init, .exit = dev_proc_net_exit, }; =>int register_pernet_subsys(struct pernet_operations *ops) error = register_pernet_operations(first_device, ops); =>int register_pernet_operations(struct list_head *list, struct pernet_operations *ops) error = __register_pernet_operations(list, ops); =>int __register_pernet_operations(struct list_head *list, struct pernet_operations *ops) err = ops_init(ops, &init_net); =>int ops_init(const struct pernet_operations *ops, struct net *net) return ops->init(net); =>int __net_init dev_proc_net_init(struct net *net) proc_net_fops_create(net, "dev", S_IRUGO, &dev_seq_fops) proc_net_fops_create(net, "softnet_stat", S_IRUGO, &softnet_seq_fops) proc_net_fops_create(net, "ptype", S_IRUGO, &ptype_seq_fops) netdev_kobject_init() =>int netdev_kobject_init(void) return class_register(&net_class);//在/sys/class下注册net类 INIT_LIST_HEAD(&ptype_all); for (i = 0; i < PTYPE_HASH_SIZE; i++) INIT_LIST_HEAD(&ptype_base[i]); register_pernet_subsys(&netdev_net_ops) struct pernet_operations __net_initdata netdev_net_ops = { .init = netdev_init, .exit = netdev_exit, }; ... ...//同register_pernet_subsys(&dev_proc_ops); =>int __net_init netdev_init(struct net *net) INIT_LIST_HEAD(&net->dev_base_head); net->dev_name_head = netdev_create_hash(); net->dev_index_head = netdev_create_hash(); for_each_possible_cpu(i) struct softnet_data *queue; queue = &per_cpu(softnet_data, i); skb_queue_head_init(&queue->input_pkt_queue); queue->completion_queue = NULL; INIT_LIST_HEAD(&queue->poll_list); queue->backlog.poll = process_backlog; queue->backlog.weight = weight_p; queue->backlog.gro_list = NULL; queue->backlog.gro_count = 0; register_pernet_device(&loopback_net_ops) register_pernet_device(&default_device_ops) open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq(NET_RX_SOFTIRQ, net_rx_action); hotcpu_notifier(dev_cpu_callback, 0); dst_init(); dev_mcast_init();
理解 Linux 网络栈(1):Linux 网络协议栈简单总结
https://www.cnblogs.com/sammyliu/p/5225623.html网络设备模块初始化(net/core/dev.c/net_dev_init)
https://blog.csdn.net/sun172270102/article/details/80643164register_pernet_subsys相关学习
https://blog.csdn.net/lickylin/article/details/18013879Linux 以太网驱动
https://blog.csdn.net/dongkun152/article/details/74906670环回设备接口(loopback)上如何发送和接收数据报 //上下文的网口驱动文章可以学习一下
http://blog.chinaunix.net/uid-26675482-id-3067061.htmlsuiming2005的ChinaUnix博客
http://blog.chinaunix.net/uid-23250294-id-5790231.html