资源描述:
《内核启动组件式初始化》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux内核源码中多处会看到诸如__init,__initdata,__exitdata的关键字,大部分这样的关键字定义在include/linux/init.h头文件中,它们都会在编译连接阶段被实现处理。#define__init __section(.init.text)__coldnotrace __init标记的数据被存储在.init.text节#define__initdata __section(.init.data) __initdata标记的数据被存储在.init.data节#define__initconst__section(.init.rodata)
2、 __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,
3、fn,id) staticinitcall_t__initcall_##fn##id__used __attribute__((__section__(".initcall"level".init")))=fn#defineearly_initcall(fn) __define_initcall("early",fn,early)#definepure_initcall(fn) __define_initcall("0",fn,0)#definecore_initcall(fn) __define_initcall("1",fn,1)#definesubsys_in
4、itcall(fn)__define_initcall("4",fn,4)#definecore_initcall_sync(fn) __define_initcall("1s",fn,1s)......#definelate_initcall_sync(fn) __define_initcall("7s",fn,7s)#define__initcall(fn)device_initcall(fn)#define__exitcall(fn) staticexitcall_t__exitcall_##fn__exit_call=fn可以看出每个与__define_initcal
5、l相关的注册函数都被解释为:staticinitcall_t__initcall_fn_id,入口地址将被存储在.initcall"level".init节中。我们常在Linux模块中用到的module_init和module_exit的真身也可以看到:#definemodule_init(x) __initcall(x);#definemodule_exit(x) __exitcall(x);init.h中还有一些代码设计boot与kernel的参数交换例如:#define__setup_param(str,unique_id,fn,early) staticconst
6、char__setup_str_##unique_id[]__initconst __aligned(1)=str; staticstructobs_kernel_param__setup_##unique_id __used__section(.init.setup) __attribute__((aligned((sizeof(long))))) ={__setup_str_##unique_id,fn,early}#define__setup(str,fn) __setup_param(str,f
7、n,fn,0)/*NOTE:fnisaspermodule_param,not__setup! Emitswarningiffn *returnsnon-zero.*/#defineearly_param(str,fn) __setup_param(str,fn,fn,1)/*Reliesonboot_command_linebeingset*/void__initparse_early_par