zoukankan      html  css  js  c++  java
  • 网络模块初始化

    初始化相关的文件

    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型号的网络设备驱动的初始化函数

  • 相关阅读:
    AxInterop.VPIClient DLL注册
    多个事务同时操作数据库
    aspx小试
    WPF 或得PNG图片的外形Path的Data
    Spass导出数据
    Excel VBA小试
    合并Excel文件
    asp.net 中文编码问题
    Delphi中的容器类(3)
    Delphi中的容器类(1)
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6790074.html
Copyright © 2011-2022 走看看