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 マクロは、Qualcomm チップセット 8974 のボード ファイルの 1 つにあります。私の質問は、「.init_machine」が呼び出されるときに、この MACHINE START に制御がどのように到達するかということです。

4

1 に答える 1

1

Linux カーネルはセクション マジックとリンカー スクリプトを使用して ARRAY を作成し、ブート ローダーはキー MSM8974_DTを Linux に渡す必要があります。Linuxの初期化コードは、マシン構造を検索し、初期化中の適切なタイミングでこれらの関数ポインターを呼び出します。呼び出し場所については、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 に答える