转自: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. 添加AD RMS role时,提示密码不能被验证The password could not be validated

    "The password could not be validated" when attempting to provision an AD RMS server. Sympt ...

  2. Ubuntu 13.04下构建Qt5开发环境

    虽然Qt命运多舛,但是也阻挡不了程序员对它的喜爱.经历了一系列波折之后,现在到在芬兰公司Digia手中,Qt又将迎来一个发展.Qt5就是在这种情况之下发布的.正值Ubuntu刚刚发布了13.04版,我 ...

  3. C# winform C/S WebBrowser qq第三方授权登录

    qq的授权登录,跟微信相似,不同的地方是: 1 申请appid与appkey的时候,注意填写回调地址. 2 这里可以在WebBrowser的是Navigated事件中直接得到Access Token, ...

  4. JS中every()和some()的用法

    every()与some()方法都是JS中数组的迭代方法. every()是对数组中每一项运行给定函数,如果该函数对每一项返回true,则返回true. some()是对数组中每一项运行给定函数,如果 ...

  5. poj3070_斐波那契数列(Fibonacci)

    用矩阵求斐波那契数列,快速幂log(n),只用求最后4位(加和乘的运算中前面的位数无用) #include <stdio.h> #include <stdlib.h> int ...

  6. 解决invalid record found in VCF4 file (at least 8 tab-delimited fields expected)问题,批量修改空格改为制表格格式

    出现这种问题说明一般存在两个问题: 第一,vcf文件不足8个分割制表符,比如像如下文件: 为了解决这个问题,说明在做snp filter时候,需要提取至少8个制表符的字符串,比如,像如下文件所示: 第 ...

  7. Educational Codeforces Round 42 (Rated for Div. 2) E. Byteland, Berland and Disputed Cities

    http://codeforces.com/contest/962/problem/E E. Byteland, Berland and Disputed Cities time limit per ...

  8. Omnibus test

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...

  9. Scala进阶之路-Spark独立模式(Standalone)集群部署

    Scala进阶之路-Spark独立模式(Standalone)集群部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们知道Hadoop解决了大数据的存储和计算,存储使用HDFS ...

  10. OS + Linux RedHat 6 / redhat 6 configuration / configure / autoconf / make / make install

    s These critical programs are missing or too old: as ld http://blog.csdn.net/testcs_dn/article/detai ...