MACHINE_START分析

来源:互联网 发布:白骑士大数据有限公司 编辑:程序博客网 时间:2024/05/16 12:14
在友善mini2440提供的linux2.6.32.2内核中,有如下定义.phys_io = S3C2410_PA_UART,.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,.boot_params = S3C2410_SDRAM_PA + 0x100,.init_irq = s3c24xx_init_irq,.map_io = mini2440_map_io,.init_machine = mini2440_machine_init,.timer = &s3c24xx_timer,MACHINE_END下面分析一下:include/asm-arm/mach/arch.h中,有定义#define MACHINE_START(_type,_name) \static const struct machine_desc __mach_desc_##_type \ __used \ __attribute__((__section__(".arch.info.init"))) = { \.nr = MACH_TYPE_##_type, \.name = _name,#define MACHINE_END \};列出machine_desc的定义:struct machine_desc {unsigned int nr;unsigned int phys_io;unsigned int io_pg_offst;const char *name;unsigned long boot_params;unsigned int video_start;unsigned int video_end;unsigned int reserve_lp0 :1;unsigned int reserve_lp1 :1;unsigned int reserve_lp2 :1;unsigned int soft_reboot :1;void (*fixup)(struct machine_desc *,struct tag *, char **,struct meminfo *);void (*map_io)(void);void (*init_irq)(void);struct sys_timer *timer;void (*init_machine)(void);};按定义展开后:static const struct machine_desc __mach_desc_MINI2440 \ __used \ __attribute__((__section__(".arch.info.init"))) = {.nr = MACH_TYPE_MINI2440,.name "FriendlyARM Mini2440 development board",.phys_io = S3C2410_PA_UART,.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,.boot_params = S3C2410_SDRAM_PA + 0x100,.init_irq = s3c24xx_init_irq,.map_io = mini2440_map_io,.init_machine = mini2440_machine_init,.timer = &s3c24xx_timer,};MACH_TYPE_MINI2440 是mini2440开发板在linux中的机器号。"FriendlyARM Mini2440 development board"是开发板信息,在终端输入cat /proc/cpuinfo可以查看。MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。其余各个成员函数在setup_arch()中被赋值到内核结构体,在不同时期被调用: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()中被调用4. .timer是定义系统时钟,定义TIMER4为系统时钟,在arch/arm/plat-s3c/time.c中体现。在start_kernel() --> time_init()中被调用。5. .boot_params是bootloader向内核传递的参数的位置,这要和bootloader中参数的定义要一致。其他主要都在 setup_arch() 中用到。
MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")
原创粉丝点击