MACHINE_START宏

转载 2011年01月12日 12:20:00
MACHINE_START宏
 
linux2.6.18内核,在Mach-s3c2410.c文件中,有如下的宏定义:
 

MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch to SMDK2410 */
 /* Maintainer: Jonas Dietsche */
 .phys_io = S3C2410_PA_UART,
 .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
 .boot_params = S3C2410_SDRAM_PA + 0x100,
 .map_io = smdk2410_map_io,
 .init_irq = s3c24xx_init_irq,
 .init_machine = smdk_machine_init,
 .timer = &s3c24xx_timer,
MACHINE_END

 
MACHINE_START定义在include/asm-arm/mach/arch.h中

#define MACHINE_START(_type,_name) /
static const struct machine_desc __mach_desc_##_type /
 __attribute_used__ /
 __attribute__((__section__(".arch.info.init"))) = { /
 .nr = MACH_TYPE_##_type, /
 .name = _name,
#define MACHINE_END /
};

 
将前面定义的MACHINE_START展开后得到,

static const struct machine_desc __mach_desc_SMDK2410
 __attribute_used__
 __attribute__((__section__(".arch.info.init"))) = {
 .nr = MACH_TYPE_SMDK2410, /* architecture number */
 .name = "SMDK2410", /* architecture name */
 /* Maintainer: Jonas Dietsche */
 .phys_io = S3C2410_PA_UART, /* start of physical io */
 .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
 .boot_params = S3C2410_SDRAM_PA + 0x100, /* tagged list */
 .map_io = smdk2410_map_io, /* IO mapping function */
 .init_irq = s3c24xx_init_irq,
 .init_machine = smdk_machine_init,
 .timer = &s3c24xx_timer,
}

 
MACH_TYPE_SMDK2410定义在arch/include/asm-arm/mach-types.h内,值为193.
/* arch/include/asm-arm/mach-types.h */
#define MACH_TYPE_SMDK2410             193
这个值是机器的类型值,编译时由arch/arm/tool/mach-types里面定义的数据生成的。
/* arch/arm/tool/mach-types */
smdk2410  ARCH_SMDK2410  SMDK2410  193

由上发现,MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。

各个成员函数在不同时期被调用:
1. .init_machine 在 arch/arm/kernel/setup.c 中被 customize_machine 调用,放在 arch_initcall() 段里面,会自动按顺序被调用。
2. init_irq在start_kernel() --> init_IRQ() --> init_arch_irq() 被调用
3. map_io 在 setup_arch() --> paging_init() --> devicemaps_init()被调用
其他主要都在 setup_arch() 中用到。

MACHINE_START-内核板级初始化实现机制(linux3.1.0)

在驱动开发时,我们都是以一块开发板为基础移植驱动程序。每一块开发板对应一个板级文件,如开发 TI AM335x系列,则对应board-am335xevm.c,这个文件完成芯片和板级的初始化工作。对于驱...
  • charliewangg12
  • charliewangg12
  • 2014年11月26日 17:03
  • 1716

window的版本宏

一、_WIN32_WINDOWS,_WIN32_WINNT,WINVER 这三个宏其实都是Windows的版本宏,在Windows 95,98,Me这一分支的OS中,Windows的定义的版本宏...
  • fqmsly
  • fqmsly
  • 2017年02月13日 12:02
  • 484

ARM Linux启动流程分析——start_kernel前启动阶段(汇编部分)

本文整理了ARM Linxu启动流程的第二阶段——start_kernel前启动阶段(汇编部分),内核版本为3.12.35。我以手上的树莓派b(ARM11)为平台示例来分析Linux内核在自解压后到跳...
  • luckyapple1028
  • luckyapple1028
  • 2015年04月26日 13:08
  • 2864

C/C++语言中#的神奇作用:把宏参数字符串化/贴合宏参数

宏中"#"和"##"的用法  一、一般用法   我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. #define STR(s)      #s   #define...
  • peter_teng
  • peter_teng
  • 2013年08月03日 11:49
  • 12452

宏定义中#和##符号的使用和宏定义展开问题

有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题   程序如下: #include #define f(a,b) a##b #define g(a)  #a #...
  • xingqingly
  • xingqingly
  • 2016年01月06日 23:02
  • 1112

C++ 宏定义与常量

前言:突然想起很久之前上课时被问及C++ 宏定义与常量的区别,仔细了想了想,并没有答起(尴尬),这次就简单总结一下C++宏常量与常量的区别吧。 1. 宏定义 宏定义是C语言提供的三种预处理中的一种...
  • t894690230
  • t894690230
  • 2016年01月29日 13:10
  • 2040

项目后期Lua接入笔记04--宏定义处理HelloWorld

Lua和我们Unity游戏用的C#脚本语言有些不同,并不是编译型语言,虽然lua语言在真正执行以前,也会进行编译,这就意味着脚本里面并不支持c#里的宏定义形式,比如我们常用的平台判定UNITY_AND...
  • suifcd
  • suifcd
  • 2017年03月28日 20:29
  • 984

函数式宏定义与普通函数

函数式宏定义与普通函数   在C及C++语言中允许用一个标识符来表示一个字符串,称为宏,该字符串可以是常数、表达式、格式串等。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字...
  • limingmcu
  • limingmcu
  • 2014年08月16日 18:35
  • 1162

Velocity语法强化56之强大的宏

#macro 指令让模板设计者可以将些重复、相关的的脚本判断定义为一个功能块.无论在什么情况下. 出于单一意图设计的 Velocimacro都会最大程序的减少模板编写中可以的出错,还是看个例子来理解一...
  • Anders_Zhuo
  • Anders_Zhuo
  • 2013年07月26日 13:24
  • 2875

枚举与宏的区别

枚举: 枚举是一种变量类型,枚举基本等效于int类型,占用同样的空间,同样的数值范围,但是枚举通常都是表示常数变量,对枚举变量做一些算术计算通常是编译器不允许的,但是可以加上强制类型转换,本来不在枚...
  • hellomxj1
  • hellomxj1
  • 2014年01月21日 15:26
  • 1972
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MACHINE_START宏
举报原因:
原因补充:

(最多只允许输入30个字)