Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3115066
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: LINUX

2014-11-05 17:26:57

原文地址:http://blog.csdn.net/myarrow/article/details/8609564

1. 简介

  内核提供了一个重要的结构体struct machine_desc ,这个结构体在内核移植中起到相当重要的作用,内核通过machine_desc结构体来控制系统体系架构相关部分的初始化。

machine_desc结构体通过MACHINE_START宏来初始化,在代码中, 通过在start_kernel->setup_arch中调用setup_machine_fdt来获取。

2. machine_desc结构体

machine_desc结构体定义如下:

  1. /* 在文件:arch/arm/include/asm/mach/arch.h */
  2. struct machine_desc {
  3. unsigned int nr; /* architecture number */
  4. const char *name; /* architecture name */
  5. unsigned long boot_params; /* tagged list */
  6. const char **dt_compat; /* array of device tree
  7. * 'compatible' strings */
  8. unsigned int nr_irqs; /* number of IRQs */
  9. unsigned int video_start; /* start of video RAM */
  10. unsigned int video_end; /* end of video RAM */
  11. unsigned int reserve_lp0 :1; /* never has lp0 */
  12. unsigned int reserve_lp1 :1; /* never has lp1 */
  13. unsigned int reserve_lp2 :1; /* never has lp2 */
  14. unsigned int soft_reboot :1; /* soft reboot */
  15. void (*fixup)(struct machine_desc *,
  16. struct tag *, char **,
  17. struct meminfo *);
  18. void (*reserve)(void);/* reserve mem blocks */
  19. void (*map_io)(void);/* IO mapping function */
  20. void (*init_early)(void);
  21. void (*init_irq)(void);
  22. struct sys_timer *timer; /* system tick timer */
  23. void (*init_machine)(void);
  24. #ifdef CONFIG_MULTI_IRQ_HANDLER
  25. void (*handle_irq)(struct pt_regs *);
  26. #endif
  27. };


3. machine_desc初始化

machine_desc初始化例子如下:

  1. MACHINE_START(MA, "myboard")
  2. .boot_params = PLAT_PHYS_OFFSET + 0x800,
  3. .fixup = ma_fixup,
  4. .reserve = &ma_reserve, //内存在交给Linux管理之前,进行预留
  5. .map_io = ma_map_io,
  6. .init_irq = ma_init_irq,
  7. .timer = &ma_timer,
  8. .init_machine = machine_ma_board_init,
  9. MACHINE_END

MACHINE_START和MACHINE_END宏定义如下:

  1. /*
  2. * Set of macros to define architecture features. This is built into
  3. * a table by the linker.
  4. */
  5. #define MACHINE_START(_type,_name) \
  6. static const struct machine_desc __mach_desc_##_type \
  7. __used \
  8. __attribute__((__section__(".arch.info.init"))) = { \
  9. .nr = MACH_TYPE_##_type, \
  10. .name = _name,
  11. #define MACHINE_END \
  12. };


阅读(1092) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~