Linux内核---34.smdk6410平台的初始化(未完成)

1. 结构体machine_desc的定义
在arch/arm/mach-s3c64xx/mach-smdk6410.c中定义了6410的machine_desc
  1. MACHINE_START(SMDK6410, "SMDK6410")
  2.     .boot_params    = S3C64XX_PA_SDRAM + 0x100,
  3.     .init_irq    = s3c6410_init_irq,
  4.     .map_io        = smdk6410_map_io,
  5.     .init_machine    = smdk6410_machine_init,
  6.     .timer        = &s3c24xx_timer,
  7. MACHINE_END

  8. 宏MACHINE_START定义如下:
  9. #define MACHINE_START(_type,_name)            \
  10. static const struct machine_desc __mach_desc_##_type    \
  11.  __used                            \
  12.  __attribute__((__section__(".arch.info.init"))) = {    \
  13.     .nr        = MACH_TYPE_##_type,        \
  14.     .name        = _name,

  15. #define MACHINE_END                \
  16. };

  17. 把宏展开后:
  18. static const struct machine_desc __mach_desc_SMDK6410    
  19.  __used __attribute__((__section__(".arch.info.init"))) = {    
  20.     .nr        = MACH_TYPE_SMDK6410,                            //匹配的nr
  21.     .name        = SMDK6410,
  22.     .boot_params    = S3C64XX_PA_SDRAM + 0x100,
  23.     .init_irq    = s3c6410_init_irq,
  24.     .map_io        = smdk6410_map_io,
  25.     .init_machine    = smdk6410_machine_init,
  26.     .timer        = &s3c24xx_timer,
  27. };
  28. 这不就是一个完整的结构体定义嘛,放在了section (arch.info.init)中
2. 寻找 结构体 machine_desc
在arch.info.init的section中定义了结构体machine_desc,那么内核在初始化中是如何找到这个结构体的呢?
通过搜索arch.info.init 这个section
start_kernel
    --> setup_arch(&command_line);
arch/arm/kernel/setup.c
  1. void __init setup_arch(char **cmdline_p)
  2. {    
  3.     mdesc = setup_machine_tags(machine_arch_type);            //寻找平台结构体的指针
  4.     machine_desc = mdesc;
  5.     machine_name = mdesc->name;
  6. }
start_kernel
    --> setup_arch(&command_line);
        -->  setup_machine_tags
arch/arm/kernel/setup.c

  1. static struct machine_desc * __init setup_machine_tags(unsigned int nr)
  2. {
  3.     struct machine_desc *mdesc = NULL, *p;
  4.     for_each_machine_desc(p)             //搜索section arch.info.init
  5.         if (nr == p->nr) {               //如果nr相同说明寻找到了
  6.             mdesc = p;
  7.             break;
  8.         }
  9.      ....... 
  10.     //省略了uboot与kernel参数传递部分
  11.     
  12.     return mdesc;    
  13. }

  14. #define for_each_machine_desc(p) \
  15.     for (= __arch_info_begin; p < __arch_info_end; p++)
3. 第一个函数 map_io
  1. start_kernel
  2.     --> setup_arch(char **cmdline_p)
  3.         --> paging_init arch/arm/mm/mmu.c
  4. arch/arm/mm/mmu.c
  5. static void __init devicemaps_init(struct machine_desc *mdesc)
  6. {

  7.     if (mdesc->map_io)
  8.         mdesc->map_io();
  9. }
下面是一系列的调用过程
  1. arch/arm/kernel/setup.c:setup_arch[890]: next setup_machine_tags
  2. arch/arm/kernel/setup.c:setup_machine_tags[810]: Machine: SMDK6410
  3. arch/arm/mm/mmu.c:devicemaps_init[984]: next mdesc->map_io
  4. arch/arm/mach-s3c64xx/mach-smdk6410.c:smdk6410_map_io[1019]: next s3c64xx_init_io
  5. arch/arm/mach-s3c64xx/cpu.c:s3c64xx_init_io[157]: next s3c_init_cpu
  6. arch/arm/plat-samsung/init.c:s3c_init_cpu[62]: next cpu->map_io
  7. arch/arm/mach-s3c64xx/s3c6410.c:s3c6410_map_io[49]: 
  8. arch/arm/mach-s3c64xx/mach-smdk6410.c:smdk6410_map_io[1022]: next s3c24xx_init_clocks
  9. arch/arm/plat-samsung/init.c:s3c24xx_init_clocks[79]: 
  10. arch/arm/plat-samsung/init.c:s3c24xx_init_clocks[87]: 
  11. arch/arm/mach-s3c64xx/s3c6410.c:s3c6410_init_clocks[67]: next s3c64xx_register_clocks
  12. S3C24XX Clocks, Copyright 2004 Simtec Electronics
  13. camera: no parent clock specified
  14. arch/arm/mach-s3c64xx/s3c6410.c:s3c6410_init_clocks[69]: next s3c6400_setup_clocks
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值