首页 > Linux > [读书笔记] 网络模块初始化
2014
10-10

[读书笔记] 网络模块初始化

读《Linux 内核源码剖析- TCP/IP 实现》第四章笔记。 此书用的是2.6.20的内核,我在看的同时对比了3.14.17的内核源码,所以内容有变动,都是基于3.14.17内核源码。    
有关网络的初始化过程主要由sysctl_init()和do_initcalls()完成。其中系统调用sysctl_init()是在start_kernel() ->proc_root_init()->proc_sys_init()->sysctl_init()。完成sysctl的初始化注册过程。后者进行了一系列的初始化模块:

对模块的初始化,一般是通过module_init宏来登记初始化函数。对于静态编译到内核中的驱动程序模块,module_init宏指示编译器把模块的入口函数放到一个特殊的段中,在内核初始化过程中,由do_initcalls()调用这些函数从而达到初始化的效果。Module_init宏定义在include/linux/init.h中

其中INITCALLS定义在vmlinux.lds.h (include\asm-generic)

__initcall_start和__initcall_end来记录.initcall.init的起始结束地址。这个我们可以在编译后的vmlinux.lds中看到:

定义模块加载函数的宏module_init被定义在include/linux/init.h中

关于网络的一些初始化函数:

  • subsys_initcall(proto_init):套接口层的初始化函数
  • fs_initcall(inet_init):传输层的初始化函数
  • subsys_initcall(net_dev_init):Internet协议簇的初始化函数
  • core_initcall(sock_init):设备处理层的初始化函数
  • module_init(e100_init_module):e100型号的网络设备驱动的初始化函数

其中sock_init(),proto_init(),inet_init()初始化函数涉及网络的三层、四层协议。  

最后编辑:
作者:zxy_snow
吃好,喝好,学习好!