博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
machine_desc结构体【转】
阅读量:6164 次
发布时间:2019-06-21

本文共 1885 字,大约阅读时间需要 6 分钟。

转自:

1. 简介

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

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

 

2. machine_desc结构体

         machine_desc结构体定义如下:

 

[cpp] 
 
  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.   
  9.     unsigned int        nr_irqs;    /* number of IRQs */  
  10.   
  11.     unsigned int        video_start;    /* start of video RAM   */  
  12.     unsigned int        video_end;  /* end of video RAM */  
  13.   
  14.     unsigned int        reserve_lp0 :1; /* never has lp0    */  
  15.     unsigned int        reserve_lp1 :1; /* never has lp1    */  
  16.     unsigned int        reserve_lp2 :1; /* never has lp2    */  
  17.     unsigned int        soft_reboot :1; /* soft reboot      */  
  18.     void            (*fixup)(struct machine_desc *,  
  19.                      struct tag *, char **,  
  20.                      struct meminfo *);  
  21.     void            (*reserve)(void);/* reserve mem blocks  */  
  22.     void            (*map_io)(void);/* IO mapping function  */  
  23.     void            (*init_early)(void);  
  24.     void            (*init_irq)(void);  
  25.     struct sys_timer    *timer;     /* system tick timer    */  
  26.     void            (*init_machine)(void);  
  27. #ifdef CONFIG_MULTI_IRQ_HANDLER  
  28.     void            (*handle_irq)(struct pt_regs *);  
  29. #endif  
  30. };  

 

 3. machine_desc初始化

machine_desc初始化例子如下:

[cpp] 
 
  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宏定义如下:

[cpp] 
 
  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.   
  12. #define MACHINE_END             \  
  13. };  

转载地址:http://nekba.baihongyu.com/

你可能感兴趣的文章
plist文件中iphone和ipad的应用图片设置
查看>>
搜集的一些资源网站链接
查看>>
struts2中类型转换器的使用
查看>>
11G Oracle RAC添加新表空间时数据文件误放置到本地文件系统的修正
查看>>
从91移动应用发展趋势报告看国内应用现状
查看>>
【ORACLE技术嘉年华PPT】MySQL压力测试经验
查看>>
Linux下汇编调试器GDB的使用
查看>>
C# Socket初探
查看>>
Liunx下文件权限详解
查看>>
linux软件安装与卸载
查看>>
1.10 基础知识——GP3.1 制度化 & GP3.2 收集改进信息
查看>>
[sinatra] Sinatra再入门
查看>>
[问题2014S04] 解答
查看>>
【转载】ShowWindow函数
查看>>
(转)用AGG实现高质量图形输出(三)
查看>>
微信开发调试工具
查看>>
关于SO_REUSEADDR的使用说明~
查看>>
使用CXF+spring创建一个web的接口项目
查看>>
Android 之布局(二)
查看>>
【被C折腾系列】用C调DIOCP编码客户端通信
查看>>