网络模块初始化-net成员

本文深入探讨了Linux内核网络模块的初始化过程,重点关注全局变量在网络namespace.c、net-procfs.c、dev.c和dst.c中的初始化。通过register_pernet_subsys(&netdev_net_ops)调用netdev_init,实现网络设备的初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在net中有很多成员,这些都是全局量,它们的初始化在不同的函数进行实现:

[ net/core/net_namespace.c ]

static struct pernet_operations __net_initdata netdev_net_ops = {
	.init = netdev_init,
	.exit = netdev_exit,
};

/* Initialize per network namespace state */
static int __net_init netdev_init(struct net *net)
{
    /* 初始化网络设备列表
     * init_net此列表已经在系统启动时进行了初始化
     */
    if (net != &init_net)
        INIT_LIST_HEAD(&net->dev_base_head); 

    net->dev_name_head = netdev_create_hash();    // 网络名字堆栈
    if (net->dev_name_head == NULL)
        goto err_name;

    net->dev_index_head = netdev_create_hash();    // 网络设备的设备号堆栈
    if (net->dev_index_head == NULL)
        goto err_idx;

    return 0;

err_idx:
    kfree(net->dev_name_head);
err_name:
    return -ENOMEM;
}

static void __net_exit netdev_exit(struct net *net)
{
    kfree(net->dev_name_head);
    kfree(net->dev_index_head);
}
 

上面就是用了pernet_operations结构的方法进行初始化,当调用register_pernet_subsys(&netdev_net_ops)时,就会调用netdev_init。

[ net/core/net-procfs.c ]

static struct pernet_operations __net_initdata dev_proc_ops = {
	.init = dev_proc_net_init,
	.exit = dev_proc_net_exit,
};

static void __net_exit dev_proc_net_exit(struct net *net)
{
    wext_proc_exit(net);

    remove_proc_entry("ptype", net->proc_net);
    remove_proc_entry("softnet_stat", net->proc_net);
    remove_proc_entry("dev", net->proc_net);
}

static int __net_init dev_proc_net_init(struct net *net)
{
    int rc = -ENOMEM;

    if (!proc_create("dev", S_IRUGO, net->proc_net, &dev_seq_fops))    // /proc/net/dev
        goto out;
    if (!proc_create("softnet_stat", S_IRUGO, net->proc_net,    // /proc/net/softnet_stat
             &softnet_seq_fops))
        goto out_dev;
    if (!proc_create("ptype", S_IRUGO, net->proc_net, &ptype_seq_fops))    // /proc/net/ptype
        goto out_softnet;

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值