kernel网络协议栈初始化

kernel的网络初始化顺序:

  1. core_initcall : sock_init
  2. fs_initcall : inet_init
  3. subsys_initcall : net_dev_init
  4. device_initcall : 设备驱动初始化

网络基础系统初始化
第一步,使用core_initcall初始化宏修饰sock_init函数,这个宏指定了sock_init函数放在级别为1的代码中,也就是说它的执行时最先进的一部分,此函数只是分配一些内存空间,以及创建了一个sock_fs_type的文件系统。在do_basic_setup中调用sock_init先于internet协议注册被调用,因此基本的socket初始化必须在每一个TCP/IP成员协议能注册到socket层之前完成。

static int __init sock_init(void)
{
    /*
     * Initialize sock SLAB cache.
     */
    sk_init();
    /*
     * Initialize skbuff SLAB cache
     */
    skb_init();
    /*
     * Initialize the protocols module.
     */
    init_inodecache();
    register_filesystem(&sock_fs_type);
    sock_mnt = kern_mount(&sock_fs_type);
    /* The real protocol initialization is performed in later initcalls.
     */
#ifdef CONFIG_NETFILTER
    netfilter_init();
#endif
#ifdef CONFIG_NETWORK_PHY_TIMESTAMPING
    skb_timestamping_init();
#endif
    return 0;
}

sock_init函数看上去比较简单,其实里面完成了相当重要的工作。第一句调用sk_init(),其实不做什么实质性的事,只是对一些变量进行赋值。

void __init sk_init(void)
{
    if (totalram_pages <= 4096) {
        sysctl_wmem_max = 32767;
        sysctl_rmem_max = 32767;
        sysctl_wmem_default = 32767;
        sysctl_rmem_default = 32767;
    } else if (totalram_pages >= 131072) {
        sysctl_wmem_max = 131071;
        sysctl_rmem_max = 131071;
    }
}

网络内存管理内核
skb_init函数

void __init skb_init(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值