转自: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. };

machine_desc结构体【转】的更多相关文章

  1. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  2. C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱

    一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...

  3. go语言结构体

    定义: 是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体. 成员: 每个值称为结构体的成员. 示例: 用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号.员工的名字. ...

  4. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

  5. C++_系列自学课程_第_12_课_结构体

    #include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...

  6. java socket传送一个结构体给用C++编写的服务器解析的问题

    另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...

  7. swift学习笔记3——类、结构体、枚举

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  8. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. C语言结构体对齐

    1.结构体变量中的元素如何访问? (1)数组中元素的访问方式:表面上有2种方式(数组下标方式和指针方式):实质上都是指针方式访问.(2)结构体变量中的元素访问方式:只有一种,用.或者->的方式来 ...

随机推荐

  1. Python的双向链表实现

    思路 链表由节点组成,先规定节点(Node),包含data和指向下个节点的next 初始化 data当然就是传入的data了,next和prev指向None 添加 分两种情况: 链表为空,那么头节点和 ...

  2. 自学Zabbix3.10.2-事件通知Notifications upon events-Actions报警配置

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix3.10.2-事件通知Notifications upon events-Acti ...

  3. 学习Spring Boot:(二十五)使用 Redis 实现数据缓存

    前言 由于 Ehcache 存在于单个 java 程序的进程中,无法满足多个程序分布式的情况,需要将多个服务器的缓存集中起来进行管理,需要一个缓存的寄存器,这里使用的是 Redis. 正文 当应用程序 ...

  4. 【BZOJ2246】[SDOI2011]迷宫探险(搜索,动态规划)

    [BZOJ2246][SDOI2011]迷宫探险(搜索,动态规划) 题面 BZOJ 洛谷 题解 乍一看似乎是可以求出每个东西是陷阱的概率,然而会发现前面走过的陷阱是不是陷阱实际上是会对当前状态产生影响 ...

  5. 小trick总结

    一个圆上的整点数量不会很多.(Cf AIM TR 5 F) 二分图完美匹配求字典序最小的方案:先一遍匈牙利求出任意一组完美匹配.再跑一遍逐位确定,要求不能修改编号比它小的匹配.(LG 4100) 如果 ...

  6. 1. vim 的安装及配置

    简介 vim是什么 vim是一款功能强大.支持各种插件.配置极为灵活的编辑器,且支持多种主流OS(linux.Unix.mac.windows),可用来各种编程预言的coding和文件编辑,用习惯了v ...

  7. Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)

    Luogu 1080 [NOIP2012]国王游戏 (贪心,高精度) Description 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己 ...

  8. 多线程(Thread,Runnable)

    一.多线程. 1.进程:一个正在执行的程序叫做进程. 每一个进程的执行都有一个执行顺序,这个顺序就是一个执行的路径,或者叫做一个控制单元. 2.线程:就是上述进程中的一个独立控制单元, 线程在控制着进 ...

  9. Word2010中的页眉怎样删除和添加横线

    http://jingyan.baidu.com/article/f79b7cb3bb3c629144023e05.html 我们在使用Word2010编辑文档中时,有时需要在页眉下方删除或添加一条横 ...

  10. 修改Linux Operating System的时间与时区

    修改Linux Operating System的时间与时区 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 有的小伙伴可能会遇到安装了linux系统后,尽管时区选择正确,也会发现系 ...