QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3566|回复: 2

linux2.6内核中的MACHINE_START宏

[复制链接]
发表于 2008-5-17 22:27:33 | 显示全部楼层 |阅读模式
现在正在阅读linux2.6.18内核,在mainstone.c文件中,有如下的宏定义:
MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
        /* Maintainer: MontaVista Software Inc. */
        .phys_io        = 0x40000000,
        .boot_params        = 0xa0000100,        /* BLOB boot parameter setting */
        .io_pg_offst        = (io_p2v(0x40000000) >> 1 & 0xfffc,
        .map_io                = mainstone_map_io,
        .init_irq        = mainstone_init_irq,
        .timer                = &pxa_timer,
        .init_machine        = mainstone_init,
MACHINE_END
请问各位大侠,这个宏定义甚么时候调用的,是谁调用的它,象里面的mainstone_init是哪个函数调用的它?是不是在main函数中的初始化的时候?
发表于 2008-5-20 15:52:34 | 显示全部楼层
自己看宏的定义,主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。

kernel boot 起来的时候期望 bootloader 传参数进来,其中包括 Machine Type,参考
arch/arm/tools/mach-types 并和 MACHINE_START() 第一个参数对上号。因此,哪个
MACHINE 是 run-time 的时候决定的,this way, you can pack as many machine as you
want, and dynamically initialize the specific platforms.

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

其他主要都在 setup_arch() 中用到
回复

使用道具 举报

发表于 2008-8-6 16:32:29 | 显示全部楼层
LINUX中的链接器段属性用的比较牛,将相同数据通过链接器放在一个段,相当于一个数组,增加删除数组项贼方便。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-25 21:36 , Processed in 0.080389 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表