MINI2440 kernel starting

#define pure_initcall(fn) __define_initcall("0",fn,0)


#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,2)
#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
#define arch_initcall(fn) __define_initcall("3",fn,3)
#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
#define subsys_initcall(fn) __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn) __define_initcall("5",fn,5)
#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn) __define_initcall("6",fn,6)
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn) __define_initcall("7",fn,7)
#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)
#define INITCALLS \
*(.initcallearly.init) \
VMLINUX_SYMBOL(__early_initcall_end) = .; \
  *(.initcall0.init) \
  *(.initcall0s.init) \
  *(.initcall1.init) \
  *(.initcall1s.init) \
  *(.initcall2.init) \
  *(.initcall2s.init) \
  *(.initcall3.init) \
  *(.initcall3s.init) \
  *(.initcall4.init) \
  *(.initcall4s.init) \
  *(.initcall5.init) \
  *(.initcall5s.init) \
*(.initcallrootfs.init) \
  *(.initcall6.init) \
  *(.initcall6s.init) \
  *(.initcall7.init) \
  *(.initcall7s.init)

./arch/arm/kernel/vmlinux.lds.S{
__tagtable_begin = .;
        *(.taglist.init)
__tagtable_end = .;
. = ALIGN(16);
__setup_start = .;
        *(.init.setup)
__setup_end = .;
__early_begin = .;
        *(.early_param.init)
__early_end = .;
__initcall_start = .;
        INITCALLS
__initcall_end = .;
__con_initcall_start = .;
        *(.con_initcall.init)
__con_initcall_end = .;
__security_initcall_start = .;
        *(.security_initcall.init)
__security_initcall_end = .;
}


kernel->init->mian.c


asmlinkage void __init start_kernel(void)
{
setup_arch(&command_line);->parse_tags(tags);->parse_tag(t);-> for (t = &__tagtable_begin; t < &__tagtable_end; t++)


setup_arch(&command_line);->parse_cmdline(cmdline_p, from);->for (p = &__early_begin; p < &__early_end; p++) 


parse_early_param();->parse_early_options(tmp_cmdline);->do_early_param->for (p = __setup_start; p < __setup_end; p++) 


console_init();-> call = __con_initcall_start; while (call < __con_initcall_end)


rest_init();-
}           |
->kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
static int __init kernel_init(void * unused)
{
do_basic_setup();->do_initcalls();->for (call = __early_initcall_end; call < __initcall_end; call++)


}

猜你喜欢

转载自blog.csdn.net/yangchaofeng001/article/details/45609827