概述
用户态软件
/
||
/
系统库函数
/
||
/
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/80643164
register_pernet_subsys相关学习
https://blog.csdn.net/lickylin/article/details/18013879
Linux 以太网驱动
https://blog.csdn.net/dongkun152/article/details/74906670
环回设备接口(loopback)上如何发送和接收数据报 //上下文的网口驱动文章可以学习一下
http://blog.chinaunix.net/uid-26675482-id-3067061.html
suiming2005的ChinaUnix博客
http://blog.chinaunix.net/uid-23250294-id-5790231.html
Linux网络设备驱动框架
http://t.zoukankan.com/linfeng-learning-p-9547356.html
最后
以上就是和谐御姐为你收集整理的慢慢欣赏linux 网络协议栈一 全景图的全部内容,希望文章能够帮你解决慢慢欣赏linux 网络协议栈一 全景图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复