Linux内核源码中多处会看到诸如__init,__initdata,__exitdata的关键字,
大部分这样的关键字定义在include/linux/init.h头文件中,它们都会在编译连接阶段被实现处理。
#define __init __section(.init.text) __cold notrace __init标记的数据被存储在.init.text节
#define __initdata __section(.init.data) __initdata标记的数据被存储在.init.data节
#define __initconst __section(.init.rodata) __initconst标记的数据被存储在.init.rodata节
#define __exitdata __section(.exit.data) __exitdata标记的数据被存储在.exit.data节
#define __exit_call __used __section(.exitcall.exit) __exit__call__used标记的数据被存储在.exitcall.exit节
我们也经常看到许多诸如subsystem_initcall(fn)的语句,fn为某个函数的名称,也可以在init.h中找到它的踪影。
#define __define_initcall(level,fn,id) \
static initcall_t __initcall_##fn##id __used \
__attribute__((__section__(".initcall" level ".init"))) = fn
#define early_initcall(fn) __define_initcall("early",fn,early)
#define pure_initcall(fn) __define_initcall("0",fn,0)
#define core_initcall(fn) __define_initcall("1",fn,1)
#define subsys_initcall(fn) __define_initcall("4",fn,4)
#define