linux宏定义初始化结构体,MACHINE的结构体初始化及宏定义

machine_desc   __mach_desc_##_type结构体的初始化一般都定义在(以arm平台为例)kernel\arch\arm\mach-xxx\xxx.c中,是用宏来定义的(后面有说明)

这是linux启动时的汇编代码中需要使用的

struct machine_desc,定义在asm-arm/mach/arch.h中:

struct machine_desc {

/*

* Note! The first four elements are used

* by assembler code in head-armv.S

*/unsigned int nr;/* architecture number*/

unsigned int phys_ram;/* start of physical ram */

unsigned int phys_io;/* start of physical io*/

unsigned int io_pg_offst;/* byte offset for io page table entry*/

const char *name;/* architecture name*/

unsigned int param_offset;/* parameter page*/

unsigned int video_start;/* start of video RAM*/

unsigned int video_end;/* end of video RAM*/

unsigned int reserve_lp0 :1;/* never has lp0*/,

unsigned int reserve_lp1 :1;/* never has lp1*/

unsigned int reserve_lp2 :1;/* never has lp2*/

unsigned int soft_reboot :1;/* soft reboot*/

void(*fixup)(struct machine_desc *,

struct param_struct *, char **,

struct meminfo *);

void(*map_io)(void);/* IO mapping function*/

void(*init_irq)(void);

};

结构体的具体定义一般都定义在(以arm平台为例)kernel\arch\arm\mach-xxx\xxx.c中,是用宏来定义的,以mainstone的开发板为例:

定义在kernel\arch\arm\mach-pxa\mainstone.c文件中,如下所示:

MACHINE_START(MAINSTONE, "Intel DBBVA0 Development Platform")

MAINTAINER("MontaVista Software Inc.")

BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))

FIXUP(fixup_mainstone)

MAPIO(mainstone_map_io)

INITIRQ(mainstone_init_irq)

MACHINE_END

这些宏也定义在kernel/include/asm-arm/mach/arch.h中,以MACHINE_START为例:

#define MACHINE_START(_type,_name)      \

const struct machine_desc __mach_desc_##_type   \

__attribute__((__section__(".arch.info"))) = { \

.nr     = MACH_TYPE_##_type,    \

.name       = _name,

展开之后结构的是:

__mach_desc_MAINSTONE = {

.nr = MACH_TYPE_MAINSTIONE,

.name = "Intel DBBVA0 Development Platform",

中间的1行__attribute__((__section__(".arch.info"))) = {说明将这个结构放到指定的段.arch.info中,这和前面的

.proc.info是一个意思,__attribute__((__section__的含义参考GNU手册。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用宏定义初始化结构体有多种方式。其中一种方式是在宏定义中使用花括号来指定结构体的成员和对应的初始值。例如,可以使用下面的宏定义初始化一个名为test的结构体变量: #define INIT_TS(_NUM, _NAME, _SCORE) \ { \ .Num = _NUM, \ .Name = _NAME, \ .Score = _SCORE \ } 然后可以通过调用这个初始化结构体变量: TS test = INIT_TS(1, "Sun", 100); 这样,test的成员Num被初始化为1,成员Name被初始化为"Sun",成员Score被初始化为100。这种方式可以简化代码并提高可读性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [12.第十二章 自定义数据类型.txt](https://download.csdn.net/download/qq_40730378/11966399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C语言学习-21-初始化结构体结构体嵌套函数指针示例](https://blog.csdn.net/qq_45111959/article/details/128564542)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C语言中宏定义初始化结构体](https://blog.csdn.net/weixin_45045399/article/details/120839920)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值