6. .boot_params = 0x10000100,
7. .map_io = halibut_map_io,
8. .init_irq = halibut_init_irq,
9. .init_machine = halibut_init,
10. .timer = &msm_timer,
11.};
总 结 一 下 : MACHINE_START 主 要 是 定 义 了 "struct machine_desc" 的 类 型 , 放 在
section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。
4. 成员函数被调用的时机
在 setup_arch() [setup.c#758~760]中 init_irq, timer & init_machine 分别被赋值给下列变量:
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
而这三个函数指针是在下列场景中被调用的:
1) start_kernel()[main.c#589]-> init_IRQ() [irq.c] ->init_arch_irq();
2) start_kernel()[main.c#595]->time_init () [time.c] ->system_time->init();
3) customize_machine()[setup.c#692] -> init_machine();
customize_machine 是被放在 arch_initcall 段的,按照顺序被调用。xxx_initcall 段内的函数是按下
列顺序被调用的:start_kernel() [main.c#682] -> rest_init() [启动内核线程]-> kernel_init() –>
do_basic_setup()-> do_initcalls();
map_io 是在下列顺序中被调用
4) start_kernel()[main.c#546]-> setup_arch () [setup.c#745] -> paging_init()
[mmu.c#1028] -> devicemaps_init()[mmu.c#993] -> map_io()