3
`DT_MACHINE_START(MSM8974_DT, "Qualcomm MSM 8974 (Flattened Device Tree)")
 .map_io = msm8974_map_io,
 .init_irq = msm_dt_init_irq,
 .init_machine = msm8974_init,
 .handle_irq = gic_handle_irq,
 .timer = &msm_dt_timer,
 .dt_compat = msm8974_dt_match,
 .reserve = msm_8974_reserve,
 .init_very_early = msm8974_init_very_early,
 .restart = msm_restart,
 .smp = &msm8974_smp_ops,
MACHINE_END`

这个 DT_MACHINE_START 宏位于高通芯片组 8974 的一个板文件中。我的问题是,当“.init_machine”被调用时,控制是如何到达这个 MACHINE START 的。

4

1 回答 1

1

Linux 内核使用节魔法和链接器脚本创建一个 ARRAY ,并且引导加载程序必须将密钥 MSM8974_DT传递给 Linux。Linux init代码查找机器结构并在初始化期间的适当时间调用这些函数指针。有关调用位置,请参见arch/arm/kernel/setup.c

参见类似:SO MACHINE_START 宏。当前的arch.h有定义,而vmlinux.lds.S有链接器部分.init.arch.info

如何将控制权交给 MACHINE START 的“.init_machine”?

此调用来自customize_machine当前 Linux 源代码。

static int __init customize_machine(void)
{
    /*
     * customizes platform devices, or adds new ones
     * On DT based machines, we fall back to populating the
     * machine from the device tree, if no callback is provided,
     * otherwise we would always need an init_machine callback.
     */
    of_iommu_init();
    if (machine_desc->init_machine)
        machine_desc->init_machine(); /** HERE - calls your routine **/
#ifdef CONFIG_OF
    else
        of_platform_populate(NULL, of_default_bus_match_table,
                    NULL, NULL);
#endif
    return 0;
}

结构指针在上面的init代码中machine_desc早先匹配。

于 2015-10-11T14:21:08.143 回答