qemu源碼分析1--Apple的學(xué)習(xí)筆記

一,前言

vl.c中main開始初始化,然后就是一個(gè)while循環(huán)進(jìn)行事件處理。今天主要從QOM模型入手來(lái)分析初始化代碼。且圍繞boards-discovery.c中注冊(cè)的函數(shù)來(lái)分析,主要了解什么時(shí)候注冊(cè),什么時(shí)候使用,通過(guò)這樣來(lái)了解設(shè)計(jì)方法。

二,源碼分析

  1. 通過(guò)每個(gè)模塊的type_init在main函數(shù)調(diào)用前就進(jìn)行注冊(cè),加入到hash表就不多說(shuō)了。static GHashTable *type_table;

  2. 然后就開始調(diào)用這個(gè)hash表了,Type_new函數(shù)就是把TypeInfo內(nèi)容復(fù)制到TypeImpl。


  3. 總的來(lái)說(shuō)type_register_internal就是創(chuàng)建一個(gè)TypeImpl類,然后添加到hash表中。

static TypeImpl *type_register_internal(const TypeInfo *info)
{
    TypeImpl *ti;
    ti = type_new(info);

    type_table_add(ti);
    return ti;
}
  1. 可以看到ti->name為key,ti為value。
static void type_table_add(TypeImpl *ti)
{
    assert(!enumerating_types);
    g_hash_table_insert(type_table_get(), (void *)ti->name, ti);
}
  1. 關(guān)于父類繼承是通過(guò)parent_type進(jìn)行的連接。type_get_by_name通過(guò)hash表的name找到TypeImpl,然后子類指向父類的TypeImpl,其實(shí)是在type_initialize函數(shù)中處理的type_get_parent。
static TypeImpl *type_get_parent(TypeImpl *type)
{
    if (!type->parent_type && type->parent) {
        type->parent_type = type_get_by_name(type->parent);
        g_assert(type->parent_type != NULL);
    }

    return type->parent_type;
}

在代碼中,其實(shí)就是通過(guò)name進(jìn)行了父類關(guān)系連接。

  1. type_initialize是一個(gè)關(guān)鍵函數(shù),利用了歸遞方式,這是類似圖形HMI編程常用的方法,比如litegul和LVGL都有類似的歸遞代碼來(lái)處理圖層,從底層繪制到頂層。當(dāng)前qemu中是從父類開始,先復(fù)制父類的class到子類,然后一次進(jìn)行type實(shí)例中class的初始化。
  1. type_initialize還將Objectclass和TypeImpl進(jìn)行了掛鉤。ti->class->type = ti;
  2. stm32f4_discovery_board_class_init_callback函數(shù)的關(guān)鍵路徑。
    居然是find_default_mechine后進(jìn)行foreach循環(huán)處理之前添加到hash表的TypeImpl對(duì)象,然后進(jìn)行歸遞初始化mc。


  3. MachineClass *mc = MACHINE_CLASS(oc);我理解直接指向class等于直接引用,但是mc是個(gè)臨時(shí)變量啊,有什么用?那么就看看賦值的函數(shù)在哪里用吧!那么我就在這個(gè)函數(shù)內(nèi)打斷點(diǎn)。


  4. 看上去來(lái)源是machine_class,在select_machine函數(shù)中,也就是qemu啟動(dòng)傳入的參數(shù)里面包括board名字,然后就找到了machine_class。
    MachineClass *mc = find_machine(board_name);
    if (mc == NULL) {
        cm_board_help_func("?");
    } else {
        machine_class = mc;
}

剛剛說(shuō)的mc臨時(shí)參數(shù),原來(lái)是find_machine的返回值,而且還給了變量machine_class,所以找到了關(guān)系。只是里面用了g_hash_table_foreach等api,不熟悉,僅先猜測(cè)功能,當(dāng)黑盒處理。


三,小結(jié)

繼續(xù)逐各擊破來(lái)分析。真心不清楚,現(xiàn)在簡(jiǎn)書的圖上傳后怎么自動(dòng)壓縮了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容