qemu2 machine的註冊和的選擇

2021-09-26 01:43:46 字數 3721 閱讀 9575

在qemu裡面,machine代表一台要虛擬的硬體機器,那麼qemu是如何註冊和選擇機器的?我們今天就來分析一下

我們以i386機器為例子進行分析

首先

# for now, use stubs/sdl-null.c as an empty/fake sdl ui backend.

# todo: use the glue code to use the qt-based ui instead.

local_src_files += \

android-qemu2-glue/main.cpp \

$(call qemu2-if-target,x86 x86_64, \

hw/i386/acpi-build.c \

hw/i386/pc_piix.c \

) \$(call qemu2-if-windows, \

android-qemu2-glue/stubs/win32-stubs.c \

) \vl.c \

在build/makefile.qemu2-target.mk下面定義了參與編譯的檔案,對於x86或者x64使用pc_piix.c用於註冊machine資訊。

hw/i386/pc_piix.c **很多,大概註冊了10幾種支援的主辦資訊

piix的英文解釋為pci ide isa xcelerator (piix),is a family of intel southbridge microchips。所以這些都是intel家族的晶元配置.

我們來看看machine資訊是如何註冊的。

以pc-i440fx-2.12 為例進行分析,英特爾440fx(代號為natoma)

static void pc_i440fx_2_12_machine_options(machineclass *m)

define_i440fx_machine(v2_12, "pc-i440fx-2.12", null,

pc_i440fx_2_12_machine_options);

#define define_i440fx_machine(suffix, name, compatfn, optionfn) \

static void pc_init_##suffix(machinestate *machine) \

\pc_init1(machine, type_i440fx_pci_host_bridge, \

type_i440fx_pci_device); \

} \define_pc_machine(suffix, name, pc_init_##suffix, optionfn)

這段**其實就是把machine註冊到qom系統裡面, 關於qom請參考文章qemu2的qom系統分析

pc_i440fx_2_12_machine_options函式對於qom的class_init,也就是用處初始化qcom的class。

machine的初始化則在machin的選擇部分

static machineclass *select_machine(void)

if (!machine_class)

loc_pop(&loc);

return machine_class;

}

函式只要執行的操作有,1 找到預設的machine類 2 引數是否指定machine,如果沒有指定則使用預設的。 從引數中獲取的部分我就不分析了,machine 的初始化就是在find_default_machine中,所以我們重點分析。

machineclass *find_default_machine(void)

}g_slist_free(machines);

return mc;

}

函式主要找到型別為type_machine的machineclass列表,之後找到machineclass.is_default 為真的作為預設machineclass返回。

我們主要分析object_class_get_list如何找到machineclass

#define type_machine "machine"

gslist *object_class_get_list(const char *implements_type,

bool include_abstract)

void object_class_foreach(void (*fn)(objectclass *klass, void *opaque),

const char *implements_type, bool include_abstract,

void *opaque)

; enumerating_types = true;

g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);

enumerating_types = false;

}static void object_class_foreach_tramp(gpointer key, gpointer value,

gpointer opaque)

if (data->implements_type &&

!object_class_dynamic_cast(k, data->implements_type))

data->fn(k, data->opaque);

}static void object_class_get_list_tramp(objectclass *klass, void *opaque)

函式主要是遍歷type_table_get() 這個hash table裡面所有元素,使用object_class_foreach_tramp函式處理, 注意object_class_foreach_tramp函式首先執行type_initialize(type)初始化列表中的所有type,閱讀qemu2的qom系統分析 這片文章後你應該執行type_table_get() 這個hash table裡面註冊了系統的所有qom class的型別資訊,並且所有class只會初始化一次。

也就是說,第一次執行object_class_foreach_tramp,註冊過的所有型別都會被初始化。select_machine函式正式第一次呼叫object_class_foreach_tramp的地方,所以這裡所有型別的machine也被初始化了。

object_class_foreach_tramp初始化了所有物件之後,如果對應的objectclasss屬於machineclass或者它的子類,則正式我們要找的class,交給object_class_get_list_tramp 函式處理。object_class_get_list_tramp函式只是把找到的machineclass放在了傳出引數列表上。 這樣所有machineclass就被收集到了。

回過頭來我們在看pc_i440fx_2_12_machine 的初始化,這裡is_default被設定成1,所以它就是預設的machin.

static void pc_i440fx_2_12_machine_options(machineclass *m)

static void pc_i440fx_machine_options(machineclass *m)

另外這裡 m->default_machine_opts 把bios設定為bios-256k.bin。我們後續可以分析下如何載入bios

qemu中模擬裝置的註冊是在main函式之前

qemu將要模擬的裝置分成了5類 typedef enum module init type define block init function module init function,module init block define opts init function module init...

2 當前網域名稱 網域名稱註冊的簡易流程

在網際網路時代,網域名稱註冊對企業的重要性不言而喻。在乙個企業誕生之際,首先要註冊乙個 網域名稱,擁有屬於自己的 這樣才能更好的為企業以後的生存 發展以及騰飛做好鋪墊。那麼為什麼企業一定需要坐乙個網域名稱註冊呢?具體來說,怎樣去註冊乙個新的網域名稱呢?這就是本文要討論的問題。企業為什麼一定要註冊乙個...

基於SSH2框架下的 使用者註冊 驗證碼功能

jsp頁面 驗證碼 js 驗證碼 chknumber click function struts.xml檔案配置 image jpeg inputstream action處理 輸出流 private bytearrayinputstream inputstream 驗證碼獲取 public str...