MACHINE_START宏
linux2.6.18內核,在Mach-s3c2410.c文件中,有如下的宏定義:
MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch to SMDK2410 */ /* Maintainer: Jonas Dietsche */ .phys_io = S3C2410_PA_UART, .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, .map_io = smdk2410_map_io, .init_irq = s3c24xx_init_irq, .init_machine = smdk_machine_init, .timer = &s3c24xx_timer, MACHINE_END |
MACHINE_START定義在include/asm-arm/mach/arch.h中
#define MACHINE_START(_type,_name) \ static const struct machine_desc __mach_desc_##_type \ __attribute_used__ \ __attribute__((__section__(".arch.info.init"))) = { \ .nr = MACH_TYPE_##_type, \ .name = _name, #define MACHINE_END \ }; |
將前面定義的MACHINE_START展開后得到,
static const struct machine_desc __mach_desc_SMDK2410 __attribute_used__ __attribute__((__section__(".arch.info.init"))) = { .nr = MACH_TYPE_SMDK2410, /* architecture number */ .name = "SMDK2410", /* architecture name */ /* Maintainer: Jonas Dietsche */ .phys_io = S3C2410_PA_UART, /* start of physical io */ .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, /* tagged list */ .map_io = smdk2410_map_io, /* IO mapping function */ .init_irq = s3c24xx_init_irq, .init_machine = smdk_machine_init, .timer = &s3c24xx_timer, } |
MACH_TYPE_SMDK2410定義在arch/include/asm-arm/mach-types.h內,值為193.
/* arch/include/asm-arm/mach-types.h */
#define MACH_TYPE_SMDK2410 193
這個值是機器的類型值,編譯時由arch/arm/tool/mach-types里面定義的數(shù)據(jù)生成的。
/* arch/arm/tool/mach-types */
smdk2410 ARCH_SMDK2410 SMDK2410 193
由上發(fā)現(xiàn),MACHINE_START主要是定義了"struct machine_desc"的類型,放在 section(".arch.info.init"),是初始化數(shù)據(jù),Kernel 起來之后將被丟棄。
各個成員函數(shù)在不同時期被調用:
1. .init_machine 在 arch/arm/kernel/setup.c 中被 customize_machine 調用,放在 arch_initcall() 段里面,會自動按順序被調用。
2. init_irq在start_kernel() --> init_IRQ() --> init_arch_irq() 被調用
3. map_io 在 setup_arch() --> paging_init() --> devicemaps_init()被調用
其他主要都在 setup_arch() 中用到。