您的位置:首页 > 理论基础 > 计算机网络

网络模块初始化

2017-04-30 18:38 369 查看
初始化相关的文件

include/linux/init.h 初始化相关的宏定义

include/asm-generic/vmlinux.lds.h 编译链接相关的宏定义

init/main.c 启动时的高级初始化

net/core/dev.c 网络设备注冊、输入和输出等接口

drivers/net/e100.c e100驱动程序

初始化函数调用关系



对模块的初始化,一般通过module_init()宏来登记初始化函数,设备驱动程序能够静态编译到内核。也能够作为一个内核模块动态载入和卸载。这两种方法初始化过程是不一样的。而module_init()宏能够自己主动依据编译条件来选择初始化的方法。

静态编译条件下的module_init()宏定义

includle/linux/init.h

typedef int (*initcall_t)(void);
#define __define_initcall(level,fn,id) \
static initcall_t __initcall_##fn##id __used \
__attribute__((__section__(".initcall" level ".init"))) = fn
#define device_initcall(fn)		__define_initcall("6",fn,6)
#define __initcall(fn) device_initcall(fn)
#define module_init(x)	__initcall(x);
include/asm-generic/vmlinux.lds.h

#define INITCALLS							\
*(.initcallearly.init)						\
VMLINUX_SYMBOL(__early_initcall_end) = .;			\
*(.initcall0.init)						\
*(.initcall0s.init)						\
*(.initcall1.init)						\
*(.initcall1s.init)						\
*(.initcall2.init)						\
*(.initcall2s.init)						\
*(.initcall3.init)						\
*(.initcall3s.init)						\
*(.initcall4.init)						\
*(.initcall4s.init)						\
*(.initcall5.init)						\
*(.initcall5s.init)						\
*(.initcallrootfs.init)						\
*(.initcall6.init)						\
*(.initcall6s.init)						\
*(.initcall7.init)						\
*(.initcall7s.init)

#define INIT_CALLS							\
VMLINUX_SYMBOL(__initcall_start) = .;			\
INITCALLS						\
VMLINUX_SYMBOL(__initcall_end) = .;
init/main.c

static void __init do_initcalls(void)
{
initcall_t *call;

for (call = __early_initcall_end; call < __initcall_end; call++)
do_one_initcall(*call);

/* Make sure there is no pending stuff from the initcall sequence */
flush_scheduled_work();
}
模块载入函数的module_init()宏定义

#define module_init(initfn)					\
static inline initcall_t __inittest(void)		\
{ return initfn; }					\
int init_module(void) __attribute__((alias(#initfn)));


module_init(x)的实如今模块中定义一个别名为init_module的x函数。作为能动态载入的模块,如需初始化,Linux规定初始化接口必须为init_module。模块被载入时,init_module()系统调用会依据x得到初始化函数的地址,并调用。



修饰函数的宏

宏 使用宏的函数说明

__init 启动时初始化函数。在启动阶段运行,通常仅仅运行一次。后期不再须要,这样的函数在初始 化完毕后被从内存中清除

__exit 和__init匹配,相关内核组件卸载时调用。经常使用于module_exit所修饰的函数

core_initcall

postcore_initcall

arch_initcall

subsys_initcall

fs_initcall 用于标记启动时须要运行的初始化函数

device_initcall

late_initcall

__initcall device_initcall的别名

__exitcall 标识退出函数,相关内核组件卸载时调用。通常仅用于标记module_exit函数

初始化数据结构的宏

宏 使用宏的数据说明

__initdata 仅在启动时用于已初始化的数据结构

__exitdata 仅被由__exitcall修饰的函数使用的数据结构

网络设备处理层初始化

文件 初始化函数及宏 说明

net/socket.c core_initcall(sock_init) 套接口层的初始化函数

net/core/sock.c subsys_initcall(proto_init) 传输层的初始化函数

net/ipv4/af_inet.c fs_initcall(inet_init) Internet协议族的初始化函数

net/core/dev.c subsys_initcall(net_dev_init) 设备处理层的初始化函数

drivers/net/e100.c module_init(e100_init_module) e100型号的网络设备驱动的初始化函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: