MACHINE_START宏(内核启动相关) - 东海的日志 - 网易博客

来源:百度文库 编辑:神马文学网 时间:2024/04/29 04:17:09

MACHINE_START宏(内核启动相关)

linux内核相关 2009-03-05 15:01:12 阅读102 评论0   字号: 订阅

原文:http://blog.chinaunix.net/u2/60011/showart_1010489.html

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宏(内核启动相关) - 东海的日志 - 网易博客 linux启动时对编译进内核驱动模块的加载 - wilson的日志 - 网易博客 东海和钓鱼岛问题的死结何在? - 宇斯的日志 - 网易博客 [转]相关子查询与非相关子查询 - 鸥的日志 - 网易博客 Linux 系统内核空间与用户空间通信的实现与分析 - wilson的日志 - 网易博客 [转]linux内核启动地址的确定 - Passion~嵌入式_磊磊的技术博客的blog ... 与酶相关的曲线例析 - 潜龙惊天的日志 - 网易博客 电脑显示器的相关设置与常见故障排除方法 - 沧海的日志 - 网易博客 bs_t结构及其相关函数的定义(艳阳天) - 随风的日志 - 网易博客 引用 拖慢操作系统启动的8个原因 - 成靖的日志 - 网易博客 让电脑启动更快的十五绝招 - 小调皮的日志 - 网易博客 启动人体自身的“大药房”! - fs的日志 - 网易博客 [看盘技巧]股价启动前的征兆(上) - 都市愚夫的日志 - 网易博客 [看盘技巧]股价启动前的征兆(下) - 都市愚夫的日志 - 网易博客 电脑启动慢的原因 - 蓝色妖姬的日志 - 网易博客 三字经 及相关视频 - 囧囧之家的日志 - 网易博客 佛教相关资料整理 - 無為居士的日志 - 网易博客 相关健康知识及紧急求救电话 - hal0390的日志 - 网易博客 网络专业术语-网络相关名词解释 - E网十族的日志 - 网易博客 光伏发电相关上市公司有哪些?概念股一览 - kamejin的日志 - 网易博客 如何全方位地启动内需 - 十八子li的日志 - 网易博客 启动海底轮,寻求自我实现 - 听风的日志 - 网易博客 SD卡启动系统步骤(可用于64M板) - linux lover的日志 - 网易博客 十招成功排除Windows XP无法启动故障 - 理睬的日志 - 网易博客