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