转自: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. Leetcode 414.Fizz Buzz By Python

    写一个程序,输出从 1 到 n 数字的字符串表示. 如果 n 是3的倍数,输出"Fizz": 如果 n 是5的倍数,输出"Buzz": 3.如果 n 同时是3和 ...

  2. [luogu4268][bzoj5195][USACO18FEB]Directory Traversal

    题目大意 给你\(n\)个文件的关系,求出某一个点,这个点到叶节点的长度的总距离最短.(相对长度的定义在题目上有说明) 感想 吐槽一下出题人,为什么出的题目怎么难看懂,我看了整整半个小时,才看懂. 题 ...

  3. PMOS 与 NMOS

    PMOS: NMOS: NMOS是栅极高电平(VGS > Vt)导通,低电平断开,可用来控制与地之间的导通.PMOS是栅极低电平(VGS < Vt)导通,高电平断开,可用来控制与电源之间的 ...

  4. python常见面试题(三)

    问题1 到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做). 答案 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行 ...

  5. 从C,C++,JAVA和C#来看String库的发展(二)---JAVA和C#篇

    http://www.cnblogs.com/wenjiang/p/3272859.html 终于要进入面向对象的世界了,虽然C++也是面向对象,但是它的面向对象程度并不高,因为考虑到要兼容C语言的移 ...

  6. 转载:Unity3D游戏对象消失enabled、Destroy与active的区别

    转自:http://www.manew.com/3276.html Unity3D游戏对象消失三种方法的区别: gameObject.active:是否在场景中停用该物体,在你gameObject.a ...

  7. C# 哈希表&列队&栈

    哈希表://不规定类型,不规定长度,不规定键值 Hashtable ht = new Hashtable();  //定义 ht[1] = 1; ht['a'] = "abc"; ...

  8. P1099 树网的核

    NOIP 2007 提高第四题. 啊......我还是看了题解才做出来的. 这题乍一看毫无头绪,但是我们spy on一下,暗中观察发现:n才300!随便打暴力水过去啊! 然后,这破题怎么暴力?感觉我的 ...

  9. 如何在通用权限管理系统中集成log4net日志功能

    开发人员都知道,在系统运行中要记录各种日志,自己写一个日志功能,无论是在效率还是功能扩展上来说都不是很好,目前大多用的是第三方的日志系统,其中一个非常有名,用的最多的就是log4net.下面是关于这个 ...

  10. 51job_selenium测试

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...