nuaagcj 发表于 2008-5-17 22:27:33

linux2.6内核中的MACHINE_START宏

现在正在阅读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) >> 18) & 0xfffc,
        .map_io                = mainstone_map_io,
        .init_irq        = mainstone_init_irq,
        .timer                = &pxa_timer,
        .init_machine        = mainstone_init,
MACHINE_END
请问各位大侠,这个宏定义甚么时候调用的,是谁调用的它,象里面的mainstone_init是哪个函数调用的它?是不是在main函数中的初始化的时候?

eric_myc 发表于 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中的链接器段属性用的比较牛,将相同数据通过链接器放在一个段,相当于一个数组,增加删除数组项贼方便。
页: [1]
查看完整版本: linux2.6内核中的MACHINE_START宏