分类: LINUX
2009-04-13 17:50:56
最近看了一下linux中有关ARM的体系结构有关的内容。在针对每一开发板时都会有这样一个宏,以2410例。其实是一个结构体,该结构体与体系结构上的移植关系非常密切。
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
|
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为机器号,该值将与我们在bootloader中传递给linux入口参数的机器号比较,如果在引导过程中出现无法识别机器号,这是问题就应该出在这里了。
MACH_TYPE_SMDK2410定义在arch/include/asm-arm/mach-types.h内,值为193.
/* arch/include/asm-arm/mach-types.h */
#define MACH_TYPE_SMDK2410 193
注意:mach-types.h在未编译之前时不存在的,在头文件由arch/arm/tool/mach-types里面定义的数据结合脚本在编译时生成的。
/* arch/arm/tool/mach-types */
smdk2410 ARCH_SMDK2410 SMDK2410 193
其它结构:
phys_io:IO空间的开始地址
io_pg_offst:IO对于的虚拟地址
boot_params:为我们bootloader产生的TAG列表的开始地址,这两者要一致。
map_io:实现对IO空间的映射
init_irq:对中断进行初始化
由上发现,MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。
|
|