MACHINE_START(BOARD_NAME,"bord name") .fixup = fixup_board, .map_io = board_map_io, .init_irq = board_init_irq, .init_machine = mxc_board_init, .timer = &mxc_timer, MACHINE_END這個 MACRO 定義在 arch/arm/include/asm/mach/arch.h
##define MACHINE_START(_type,_name) \ static const struct machine_desc __mach_desc_##_type \ __used \ __attribute__((__section__(".arch.info.init"))) = { \ .nr = MACH_TYPE_##_type, \ .name = _name, #define MACHINE_END \ };
arch/arm/kernel/setup.c -- void _init setup_arch(char *cmdline_p) init/main.c: -- asmlinkage void _init start_kernel(void)
asmlinkage void __init start_kernel(void) { char * command_line; extern struct kernel_param __start___param[], __stop___param[]; smp_setup_processor_id(); lockdep_init(); debug_objects_early_init(); boot_init_stack_canary(); cgroup_init_early(); local_irq_disable(); early_boot_irqs_off(); early_init_irq_lock_class(); lock_kernel(); tick_init(); boot_cpu_init(); page_address_init(); printk(KERN_NOTICE "%s", linux_banner); setup_arch(&command_line);
在 init/main.c 的 do_early_param(char *param,char *val):
{ struct obs_kernel_param *p; for (p = __setup_start; p < __setup_end; p++) { if ((p->early && strcmp(param, p->str) == 0) || (strcmp(param, "console") == 0 && strcmp(p->str, "earlycon") == 0) ) { if (p->setup_func(val) != 0) printk(KERN_WARNING "Malformed early option '%s'\n", param); } } /* We accept everything at this stage. */ return 0; }參考 __setup_start, __setup_end, 這宣告/tag 在 lds 中。 配合 include/asm-generic/vmlinux.lds.h :
#define INIT_SETUP(initsetup_align) \ . = ALIGN(initsetup_align); \ VMLINUX_SYMBOL(__setup_start) = .; \ *(.init.setup) \ VMLINUX_SYMBOL(__setup_end) = .;還有在 arch/arm/kernel/vmlinux.lds 中
__setup_start = .; *(.init.setup) __setup_end = .;所以
沒有留言:
張貼留言