下文参考了:http://blog.chinaunix.net/u3/102367/showart_2220188.html 原文是针对了s3c平台,由于最近在弄9260相关的工作,看了上篇文章,深受启发,感谢原博主。下面结合了9260的下面的mach代码,做一个相关的分析,作为自己的一个笔记吧。
start_kernel() -> setup_arch(&command_line) -> mdesc = setup_machine(machine_arch_type) -> list = lookup_machine_type(nr) -> return struct machine_desc.
内核在启动的时候就是最先运行start_kernel() , 然后她就会调用体系结构相关的setup_arch(&command_line), 如arm体系结构的在arch/arm/kernel/setup.c中, 进一步,就要初始化板级相关的设备, 但在此之前, 必须找到这块目标板的描述结构, 所以她就先通过lookup_machine_type(nr)来查找这个结构, 传入的参数是又uboot传过来的, 存储在r2中.对与9260传入的参数AT91SAM9260EK,lookup_machine_type(nr) 就会找到如下的machine_desc. 这个结构在一个专门描述AT91SAM9260EK的文件在..arch/arm/mach-at91/board-ek.c中。
MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK") /* Maintainer: SAN People/Atmel */
.phys_io = AT91_BASE_SYS,
.io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
.boot_params = AT91_SDRAM_BASE + 0x100,
.timer = &at91rm9200_timer,
.map_io = ek_map_io,
.init_irq = ek_init_irq,
.init_machine = ek_board_init,
MACHINE_END
关于宏MACHINE_START在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 /
};
对于## 可以参考百度的define 说明,其实就是一个字符串的连接吧。
MACH_TYPE_##_type, 对于9260Ek来说就是 MACH_TYPE_AT91SAM9260EK , 此宏定义在/include/asm-arm/mach-types.h中,如下。
#define MACH_TYPE_AT91SAM9260EK 1099
对于ek_map_io、 ek_board_init,ek_init_irq 函数在实现在 board-ek.c中,主要完成设备注册,和中断的远射。关于中断的映射参考网上一个“ARM Linux 中断机制分析”的文档写的很好。 具体的实现函数在at91sam9260.c等文件中。
至此已实现了一个struct machine_desc常量,_mach_desc_AT91RM9200EK。