深入理解Linux网络技术内幕——内核基础架构和组件初始化
引导期间的内核选项
注册关键字:
__setup(string, fn)
#ifndef MODULE #define early_param(str, fn) __setup_param(str, fn, fn, 0) #else /* MODULE */ #define early_param(str, fn) #endif
//net/core/dev.c _setup("netdev=", netdev_boot_setup); //net/ethernet/eth.c __setup("ether=", netdev_boot_setup);
#define __setup(str, fn) __setup_param(str, fn, fn, 0) #define early_param(str, fn) __setup_param(str, fn, fn, 1) #define __setup_param(str, unique_id, fn, early) static char __setup_str_##unique_id[] __initdata __aligned(1) = str; static struct obs_kernel_param __setup_##unique_id __used __section(.init.setup) __attribute__((aligned((sizeof(long))))) = { __setup_str_##unique_id, fn, early } early_param和__setup唯一不同的就是传递给__setup_param的最后一个参数early。_setup_param定义了一个struct obs_kernel_param类型的结构,然后通过_section宏,使这个变量在链接的时候能够放置在段.init.setup。下文有.init.setup的介绍。 struct obs_kernel_param结构如下: struct obs_kernel_param { const char *str; int (*setup_func)(char *); int early; };
两遍分析:
parse_args("early options", tmp_cmdline, NULL, 0, do_early_param); parse_args("Booting kernel", static_command_line, __start___param, __stop___param - __start___param, &unknown_bootoption);
.init.setup 内存区
struct obs_kernel_param { const char *str; int (*setup_func)(char *); int early; };
模块初始化代码:
module_init(XXX); module_exit(XXX);
static char version[] _ _devinitdata = DRV_NAME " ... "; static struct vortex_chip_info { ... } vortex_info_tbl[] _ _devinitdata = { {"3c590 Vortex 10Mbps", ... ... ... } static int _ _init vortex_init (void) { ... } static void _ _exit vortex_cleanup (void) { ... } module_init(vortex_init); module_exit(vortex_cleanup);
基于宏标签的优化:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。