非装载模块的初始化方法

/* 诸如文件系统之类的子系统,用户可以选择将其直接编译进内核,
* 或者使用可装载模块的编译方式,运行时装入。
* Linux中,这2种方式的选择是通过MODULE宏实现。
* 用户编程过程中遇到的接口是
*   module_init()
 *      module_exit()
 * 两个宏。根据具体的编译选项,这两个宏的展开都不同。
* 具体见下边的代码。
*
*  <include/linux/init.h>
*/


/* 如果不是编译成模块,则使用下面的一套宏定义 */
#ifndef MODULE


/* initcalls are now grouped by functionality into separate
 * subsections. Ordering inside the subsections is determined
 * by link order.
 * For backwards compatibility, initcall() puts the call in
 * the device init subsection.
 *
 * The `id' arg to __define_initcall() is needed so that multiple initcalls
 * can point at the same handler without causing duplicate-symbol build errors.
 */

#define __define_initcall(level,fn,id) /
    static initcall_t __initcall_##fn##id __used /
    __attribute__((__section__(".initcall" level ".init"))) = fn


#define pure_initcall(fn)        __define_initcall("0",fn,0)

#define core_initcall(fn)        __define_initcall("1",fn,1)
#define core_initcall_sync(fn)        __define_initcall("1s",fn,1s)
#define postcore_initcall(fn)        __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn)    __define_initcall("2s",fn,2s)
#define arch_initcall(fn)        __define_initcall("3",fn,3)
#define arch_initcall_sync(fn)        __define_initcall("3s",fn,3s)
#define subsys_initcall(fn)        __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn)    __define_initcall("4s",fn,4s)
#define fs_initcall(fn)            __define_initcall("5",fn,5)
#define fs_initcall_sync(fn)        __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn)        __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn)        __define_initcall("6",fn,6)
#define device_initcall_sync(fn)    __define_initcall("6s",fn,6s)
#define late_initcall(fn)        __define_initcall("7",fn,7)
#define late_initcall_sync(fn)        __define_initcall("7s",fn,7s)

#define __initcall(fn) device_initcall(fn)



/**
 * module_init() - driver initialization entry point
 * @x: function to be run at kernel boot time or module insertion
 *
 * module_init() will either be called during do_initcalls() (if
 * builtin) or at module insertion time (if a module).  There can only
 * be one per module.
 */
#define module_init(x)    __initcall(x);

/**
 * module_exit() - driver exit entry point
 * @x: function to be run when driver is removed
 *
 * module_exit() will wrap the driver clean-up code
 * with cleanup_module() when used with rmmod when
 * the driver is a module.  If the driver is statically
 * compiled into the kernel, module_exit() has no effect.
 * There can only be one per module.
 */
#define module_exit(x)    __exitcall(x);

/*编译成模块的情景*/
#else /* MODULE */

/* Don't use these in modules, but some people do... */
#define core_initcall(fn)        module_init(fn)
#define postcore_initcall(fn)        module_init(fn)
#define arch_initcall(fn)        module_init(fn)
#define subsys_initcall(fn)        module_init(fn)
#define fs_initcall(fn)            module_init(fn)
#define device_initcall(fn)        module_init(fn)
#define late_initcall(fn)        module_init(fn)

#define security_initcall(fn)        module_init(fn)

/* Each module must use one module_init(). */
#define module_init(initfn)                    /
    static inline initcall_t __inittest(void)        /
    { return initfn; }                    /
    int init_module(void) __attribute__((alias(#initfn)));

/* This is only required if you want to be unloadable. */
#define module_exit(exitfn)                    /
    static inline exitcall_t __exittest(void)        /
    { return exitfn; }                    /
    void cleanup_module(void) __attribute__((alias(#exitfn)));


#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值