<span style="font-family:courier new,courier;">在Bootloader将 Linux 内核映像拷贝到 RAM 以后,可以通过下例代码启动 Linux 内核: </span><br />
<span style="font-family:courier new,courier;">call_linux(0, machine_type, kernel_params_base)。<br />
</span><br />
<span style="font-family:courier new,courier;">其中,machine_tpye 是Bootloader检测出来的处理器类型ID, kernel_params_base 是启动参数在 RAM 的地址。通过这种方式将 Linux 启动需要的参数从 bootloader传递到内核。 </span><br />
<span style="font-family:courier new,courier;"><br />
theKernel (0, machid, bd->bi_boot_params); </span><br />
machid<br />
Uboot中在board/embedclub/Smdk2440.c 设置了bi_arch_number<br />
#if defined(CONFIG_S3C2410)<br />
/* arch number of SMDK2410-Board */<br />
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;//193<br />
#endif<br />
<br />
#if defined(CONFIG_S3C2440)<br />
/* arch number of S3C2440-Board */<br />
gd->bd->bi_arch_number = MACH_TYPE_SMDK2440A;//1999<br />
//gd->bd->bi_arch_number = 782;<br />
#endif<br />
<br />
在内核启动初期内核引导阶段时有检测内核是否支持该单板,类型是否匹配,即当前内核中的machid和boot传入的ID是否匹配。<br />
__lookup_machine_type<br />
匹配方法如何?
不同的machine_desc结构用于不同的开发板,U-BOOT调用内核时,会在r1寄存器中给出开发板的标记(机器类型ID);对于S3C2410、S3C2440开发板,U-Boot传入的机器类型ID为MACH_TYPE_SMDK2410、MACH_TYPE_S3C2440,它们对应的machine_desc结构分别在内核中 arch/arm/mach-s3c2410/mach-smdk2410.c和
arch/arm/mach-s3c2440/mach-smdk2440.c中定义
MACHINE_START(S3C2440, "SMDK2440")
/* Maintainer: Ben Dooks <ben@fluff.org> */
.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 = smdk2440_map_io,
.init_machine = smdk2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
#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 \
};
可见.nr=MACH_TYPE_S3C2440,可是这个是一个宏怎么没见定义呢?
阅读(1170) | 评论(0) | 转发(0) |