在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...