staticinitcall_t__initcall_##fn __attribute_used__ \ __attribute__((__section__(".initcall"level".init"))) = fn #define early_initcall(fn) __define_initcall(".early1",fn) #define core_initcall(fn) __define_initcall("1",fn) #define postcore_initcall(fn) __define_initcall("2",...
#define late_initcall(fn) __define_initcall("7",fn,7) #define late_initcall_sync(fn) __define_initcall("7s",fn,7s) #definemodule_init(x) __initcall(x); #define __initcall(fn)device_initcall(fn) 所有的__init函数在区段.init.text区段中,同时还在.initcall.init中还保存了一份函数指针,...
module_init和late_initcall区别 在init.h 中有如下定义 #define pure_initcall(fn) __define_initcall("0",fn,1) #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,...
#define late_initcall_sync(fn) __define_initcall("7s",fn,7s) #definemodule_init(x) __initcall(x); #define __initcall(fn)device_initcall(fn) 所有的__init函数在区段.init.text区段中,同时还在.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数指针,并在...
initcall机制的由来 我们都知道,linux对驱动程序提供静态编译进内核和动态加载两种方式,当我们试图将一个驱动程序编译进内核时,开发者通常提供一个xxx_init()函数接口以启动这个驱动程序同时提供某些服务。 那么,根据常识来说,这个xxx_init()函数肯定是要在系统启动的某个时候被调用,才能启动这个驱动程序。
所有的__init函数在区段.init.text区段中,同时还在.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数指针,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等)。 这些函数在内核初始化过程中的调用顺序只和这里的函数指针的顺序有关。
device_initcall(fn) __define_initcall("6",fn,6)#definedevice_initcall_sync(fn) __define_initcall("6s",fn,6s)#definelate_initcall(fn) __define_initcall("7",fn,7)#definelate_initcall_sync(fn) __define_initcall("7s",fn,7s)#define__initcall(fn) device_initcall(fn)#definemodule_init(...
module_init宏 在写驱动模块的时候会提供自己的init和exit函数。最后将使用module_init宏,比如: static int hello_init(void) { int ret; printk("hello_init \n"); dump_stack(); devno = MKDEV(major,minor); ret = register_chrdev(major,"hello",&hello_ops); ...
static inline initcall_t __maybe_unused __inittest(void) \ {returninitfn; } \ int init_module(void) __copy(initfn) \ __attribute__((alias(#initfn))); \ __CFI_ADDRESSABLE(init_module) #endif 显然,MODULE宏是由Makefile控制的。上面部分用于将模块静态编译连接进内核,下面部分用于编译可动态...
static inline initcall_t __inittest(void) \ { return initfn; } \ int init_module(void) __attribute__((alias(#initfn))); ... 当我们使用make menuconfig来配置内核时,或者makefile 将某个module配置为m时,MODULE这个宏就被定义了,而当配置为y时,则没有定义,具体的实现在kernel的根Makefile(-D...