举例说明:
MACHINE_START(AM335XEVM, "am335xevm")
/* Maintainer: Texas Instruments */
.atag_offset = 0x100,
.map_io = am335x_evm_map_io,
.init_early = am33xx_init_early,
.init_irq = ti81xx_init_irq,
.handle_irq = omap3_intc_handle_irq,
.timer = &omap3_am33xx_timer,
.init_machine = am335x_evm_init,
MACHINE_END
宏展开以后:
#define MACH_TYPE_AM335XEVM 3589
static const struct machine_desc __mach_desc_AM335XEVM \
__used \
__attribute__((__section__(".arch.info.init"))) = { \
.nr = MACH_TYPE_AM335XEVM, \// architecture number
.name = "am335xevm", // architecture name
.atag_offset = 0x100, // tagged list (relative)
.map_io = am335x_evm_map_io,//IO mapping function
.init_early = am33xx_init_early,
.init_irq = ti81xx_init_irq,
.handle_irq = omap3_intc_handle_irq,
.timer = &omap3_am33xx_timer, //system tick timer
.init_machine = am335x_evm_init,
\
};
该结构体里定义的函数执行循序如下:
start_kernel()->setup_arch()->paging_init()->devicemaps_init()->map_io()
start_kernel()->setup_arch()->init_early()
start_kernel()->init_IRQ()->init_irq()
start_kernel()->time_init()->system_timer->init();
arch_initcall(customize_machine);
customize_machine()->init_machine()
其中arch_initcall(customize_machine);等效于
static int(*__initcall_customize_machine3)(void) __used \
__attribute__((__section__(".initcall3.init"))) = customize_machine
关于.initcall3.init段的说明参考这里initcall机制