background image

 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()