【轉】MACHINE_START分析

本文轉自: http://blog.sina.com.cn/s/blog_4ae5be930100nyfl.html

 

在友善mini2440提供的linux2.6.32.2內核中,有如下定義:

MACHINE_START(MINI2440, "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,
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() 中用到。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章