在arch/arm/mach-davinci/board_evm.c中有:
MACHINE_START(DAVINCI_EVM, "Dahua Product")
MAINTAINER("Dahua")
BOOT_MEM(DAVINCI_DDR_BASE, IO_PHYS, IO_VIRT)
BOOT_PARAMS(0x80000100)
MAPIO(davinci_map_io)
INITIRQ(davinci_irq_init)
.timer = &davinci_timer,
INIT_MACHINE (evm_init)
這里實(shí)際上是定義了一個(gè)struct machine_desc結(jié)構(gòu),放在.arch.info段中。MAPIO定義了machine_desc的map_io函數(shù),INIT_MACHINE定義了 init_machine函數(shù)。這兩個(gè)函數(shù)在什么時(shí)候執(zhí)行呢。
MAPIO:
文件:arch/arm/kernel/setup.c
setup_arch
==> paging_init(mdesc);
文件:arch/arm/mm/mmu.c
==> paging_init
==> devicemaps_init(mdesc);
if (mdesc->map_io)
mdesc->map_io();
INIT_MACHINE:
文件:init/main.c
start_kernel
==> setup_arch(&command_line);
文件:arch/arm/kernel/setup.c
setup_arch
/*
* Set up various architecture-specific pointers
*/
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
文件:arch/arm/kernel/setup.c
static int __init customize_machine(void)
{
/* customizes platform devices, or adds new ones */
if (init_machine)
init_machine();
return 0;
}
arch_initcall(customize_machine);
定義在了initcall里,所以他將和驅(qū)動(dòng)程序一樣在內(nèi)核線程kernel_init中完成
start_kernel
==> rest_init
==*> kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); 創(chuàng)建內(nèi)核線程
kernel_init
==> do_basic_setup
==*> do_initcalls
static void __init do_initcalls(void)
{
initcall_t *call;
for (call = __early_initcall_end; call < __initcall_end; call++)
do_one_initcall(*call); // 將按照排序規(guī)則在相應(yīng)的存儲(chǔ)位置執(zhí)行函數(shù)customize_machine()
/* Make sure there is no pending stuff from the initcall sequence */
flush_scheduled_work();
}