1. 结构体machine_desc的定义
在arch/arm/mach-s3c64xx/mach-smdk6410.c中定义了6410的machine_desc
2. 寻找结构体machine_desc
在arch.info.init的section中定义了结构体machine_desc,那么内核在初始化中是如何找到这个结构体的呢?
通过搜索arch.info.init 这个section
start_kernel
--> setup_arch(&command_line);
arch/arm/kernel/setup.c
start_kernel
--> setup_arch(&command_line);
--> setup_machine_tags
arch/arm/kernel/setup.c
3. 第一个函数 map_io
下面是一系列的调用过程
在arch/arm/mach-s3c64xx/mach-smdk6410.c中定义了6410的machine_desc
-
MACHINE_START(SMDK6410, "SMDK6410")
-
.boot_params = S3C64XX_PA_SDRAM + 0x100,
-
.init_irq = s3c6410_init_irq,
-
.map_io = smdk6410_map_io,
-
.init_machine = smdk6410_machine_init,
-
.timer = &s3c24xx_timer,
-
MACHINE_END
-
- 宏MACHINE_START定义如下:
-
#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_SMDK6410
-
__used __attribute__((__section__(".arch.info.init"))) = {
- .nr = MACH_TYPE_SMDK6410, //匹配的nr
-
.name = SMDK6410,
-
.boot_params = S3C64XX_PA_SDRAM + 0x100,
-
.init_irq = s3c6410_init_irq,
-
.map_io = smdk6410_map_io,
-
.init_machine = smdk6410_machine_init,
-
.timer = &s3c24xx_timer,
- };
-
这不就是一个完整的结构体定义嘛,放在了section (arch.info.init)中
在arch.info.init的section中定义了结构体machine_desc,那么内核在初始化中是如何找到这个结构体的呢?
通过搜索arch.info.init 这个section
start_kernel
--> setup_arch(&command_line);
arch/arm/kernel/setup.c
-
void __init setup_arch(char **cmdline_p)
-
{
-
mdesc = setup_machine_tags(machine_arch_type); //寻找平台结构体的指针
-
machine_desc = mdesc;
-
machine_name = mdesc->name;
- }
--> setup_arch(&command_line);
--> setup_machine_tags
arch/arm/kernel/setup.c
-
static struct machine_desc * __init setup_machine_tags(unsigned int nr)
-
{
-
struct machine_desc *mdesc = NULL, *p;
-
for_each_machine_desc(p) //搜索section
arch.info.init
- if (nr == p->nr) { //如果nr相同说明寻找到了
-
mdesc = p;
-
break;
- }
-
.......
- //省略了uboot与kernel参数传递部分
-
-
return mdesc;
-
}
-
-
#define for_each_machine_desc(p) \
- for (p = __arch_info_begin; p < __arch_info_end; p++)
-
start_kernel
-
--> setup_arch(char **cmdline_p)
-
--> paging_init arch/arm/mm/mmu.c
-
arch/arm/mm/mmu.c
-
static void __init devicemaps_init(struct machine_desc *mdesc)
-
{
-
-
if (mdesc->map_io)
-
mdesc->map_io();
- }
-
arch/arm/kernel/setup.c:setup_arch[890]: next setup_machine_tags
-
arch/arm/kernel/setup.c:setup_machine_tags[810]: Machine: SMDK6410
-
arch/arm/mm/mmu.c:devicemaps_init[984]: next mdesc->map_io
-
arch/arm/mach-s3c64xx/mach-smdk6410.c:smdk6410_map_io[1019]: next s3c64xx_init_io
-
arch/arm/mach-s3c64xx/cpu.c:s3c64xx_init_io[157]: next s3c_init_cpu
-
arch/arm/plat-samsung/init.c:s3c_init_cpu[62]: next cpu->map_io
-
arch/arm/mach-s3c64xx/s3c6410.c:s3c6410_map_io[49]:
-
arch/arm/mach-s3c64xx/mach-smdk6410.c:smdk6410_map_io[1022]: next s3c24xx_init_clocks
-
arch/arm/plat-samsung/init.c:s3c24xx_init_clocks[79]:
-
arch/arm/plat-samsung/init.c:s3c24xx_init_clocks[87]:
-
arch/arm/mach-s3c64xx/s3c6410.c:s3c6410_init_clocks[67]: next s3c64xx_register_clocks
-
S3C24XX Clocks, Copyright 2004 Simtec Electronics
-
camera: no parent clock specified
- arch/arm/mach-s3c64xx/s3c6410.c:s3c6410_init_clocks[69]: next s3c6400_setup_clocks