linux移植篇一

一、内核执行的第一个文件是:arch/arm/kernel/head.S   并且会调用由u-boot放在r1寄存器中的“机器类型ID”,

首先是检查CPU类型是否执行,然后检查板子类型是否支持。如果内核支持该CPU,r5寄存器返回一个用来描述处理器的结构体的地址,否则r5值为0,

如果支持该板子,则r5寄存器返回一个用来描述该板子的结构体的地址,否则r5值为0.

1、在arch/arm/kernel/head-common.S中为具体的匹配环节,如下:


adr指令基于PC寄存器计算地址值,由于这时候还没时能MMU,pc寄存器中试用的还是物理地址,所以执行"adr r3,3f"后,r3寄存器中存放的就是第178行的物理地址。

2、每种支持的开发板都会试用宏MACHINE_START、MACHINE_END来定义一个machine_desc结构,它定义了开发板相关的一些属性及函数,如机器类型ID、起始

I/O物理地址、Bootloader传入的参数的地址、中断初始化函数、I/O映射函数等。如6410板子在arch/arm/mach-s3c64xx/mach-mini6410.c定义如下:

MACHINE_START(MINI6410, "MINI6410")
/* Maintainer: Darius Augulis <augulis.darius@gmail.com> */
.boot_params = S3C64XX_PA_SDRAM + 0x100,
.init_irq = s3c6410_init_irq,
.map_io = mini6410_map_io,
.init_machine = mini6410_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END


其中的宏MACHINE_START、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 \


所以上一段代码扩展开来就是:

static const struct machine_desc __mach_desc_MINI6410

__used

__attribute__((__section__(".arch.info.init"))) = {

.nr = MACH_TYPE_MINI6410,

.name = "MINI6410",

};

其中的MACH_TYPE_MINI6410在include/generated/mach-types.h中被生成,machine_desc结构在include/asm-arm/mach/arch.h文件中定义。

所有的machine_desc结构都处于".arch.info.init"段中,在连接内核时,他们被组织在一起,开始地址为__arch_info_begin,结束地址为__arch_info_end。

不同的machine_desc结构用于不同开发板,u-boot调用内核时,会在r1寄存器中给出开发板的标记(机器类型ID)。__lookup_machine_type函数将这个值与

machine_desc结构中的nr成员比较,如果两者相等则表示找到匹配的machine_desc结构。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值