网络模块初始化

初始化相关的文件

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


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


  
  
  1. #define INITCALLS \
  2. *(.initcallearly.init) \
  3. VMLINUX_SYMBOL(__early_initcall_end) = .; \
  4. *(.initcall0.init) \
  5. *(.initcall0s.init) \
  6. *(.initcall1.init) \
  7. *(.initcall1s.init) \
  8. *(.initcall2.init) \
  9. *(.initcall2s.init) \
  10. *(.initcall3.init) \
  11. *(.initcall3s.init) \
  12. *(.initcall4.init) \
  13. *(.initcall4s.init) \
  14. *(.initcall5.init) \
  15. *(.initcall5s.init) \
  16. *(.initcallrootfs.init) \
  17. *(.initcall6.init) \
  18. *(.initcall6s.init) \
  19. *(.initcall7.init) \
  20. *(.initcall7s.init)
  21. #define INIT_CALLS \
  22. VMLINUX_SYMBOL(__initcall_start) = .; \
  23. INITCALLS \
  24. VMLINUX_SYMBOL(__initcall_end) = .;
init/main.c


  
  
  1. static void __ init do_initcalls(void)
  2. {
  3. initcall_t *call;
  4. for (call = __early_initcall_end; call < __initcall_end; call++)
  5. do_one_initcall(*call);
  6. /* Make sure there is no pending stuff from the initcall sequence */
  7. flush_scheduled_work();
  8. }
模块加载函数的module_init()宏定义


  
  
  1. #define module_init(initfn) \
  2. static inline initcall_t __inittest(void) \
  3. { return initfn; } \
  4. 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型号的网络设备驱动的初始化函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值