Chinaunix首页 | 论坛 | 博客
  • 博客访问: 277913
  • 博文数量: 54
  • 博客积分: 2756
  • 博客等级: 少校
  • 技术积分: 677
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 22:51
文章分类

全部博文(54)

文章存档

2011年(30)

2010年(22)

2009年(2)

我的朋友

分类: LINUX

2011-07-27 22:27:46

在linux-2.6.28.2/arch/arm/mach-s3c2410/mach-smdk2410.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   = smdk2410_init,
.timer      = &s3c24xx_timer,
MACHINE_END


而MACHINE_START和MACHINE_END宏定义在arch/arm/include/asm/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_START和MACHINE_END展开后得到:

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里面定义的数据生成的。
/* arch/arm/tool/mach-types */
smdk2410  ARCH_SMDK2410  SMDK2410  193

由上发现,MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。

kernel boot 起来的时候期望 bootloader 传参数进来,其中包括 Machine Type,参考arch/arm/tools/mach-types 和MACHINE_START() 第一个参数对上号。因此,哪个MACHINE 是 run-time 的时候决定的,this way, you can pack as many machine as you want, and dynamically initialize the specific platforms.

各个成员函数在不同时期被调用:
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() 中用到。

zz http://hi.baidu.com/kkernel/blog/item/48daf0d16237f0df562c844d.html
阅读(1363) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~