Bochs源碼分析-初始化部分

由於學習須要,要看虛擬機Bochs的源代碼。寫隨筆主要爲了學習總結,其次是分享你們共同研究,大神勿噴,歡迎評論。函數

手頭資料:bochs源代碼,下於:bochs.sourceforge.net,還有喻強寫的源碼分析電紙書。oop

從程序運行到模擬機真正開始工做,即模擬程序代碼的運行,這一部分稱爲程序的初始化。其中主要包括1:獲取用戶參數決定程序運行方式,2:獲取模擬器配置信息(主要放在配置文件bochsrc裏),獲取完整的配置信息才能組成完整的模擬機,而後進行3:模擬機各個部件的初始化化,如:CPU初始化,內存初始化等,4:還要新建一個窗口做爲模擬機的屏幕顯示模擬系統信息。下面咱們來看程序源碼是如何完成這四部分工做的,上篇講到程序的入口地址在bochs/main.cpp裏,兩個不一樣的編譯入口聚集與bxmian()函數,該函數完成初始化工做。第四行調用bx_init_siminterface ();,該函數在文件文件gui/siminterface.cpp裏面,該文件定義類bx_real_sim_c : public bx_simulator_interface_c,該類屬於接口類負責模擬機和配置類進行通訊,就是經過配置界面不能直接對模擬機的配置變量進行調用,只能經過該類的具體函數來訪問,爲了封裝。該函數新建bx_real_sim_c:SIM,開始接受配置信息。緊接着調用bx_init_main();,就在本文件內,主要做用是從命令行獲取運行方式如:-q -r 等,還有獲取配置文件的信息 -f bochsrc.txt。而後的工做就是解析bochsrc,完成模擬機的配置工做。源碼裏面主要調用:init_text_config_interface();該函數在gui/textconfig.cpp,工做是在類SIM裏註冊一個配置類,和相應的回調函數。bochs裏面的配置接口(Config Interface)和顯示接口(GUIinterface)分開來實現可能有不一樣的實現方式,如:文本模式,win32窗口模式等。後面調用PLUG_load_plugin(wx, PLUGTYPE_CORE);函數,該函數做用是在SIM裏面註冊一個GUI類和相應的回調函數。bochs的GUI類在gui/gui.cpp裏面,可是該類bx_gui(),是一個虛類即函數沒有徹底實現,須要具體的實現子類進行繼承,完成相應的函數。如:win32實現方式類,在gui/win32.cpp裏面,上面函數對應於該類裏面的IMPLEMENT_GUI_PLUGIN_CODE(win32)一句。在/gui/win32.cpp文件裏有函數specific_init()主要進行GUI類的初始化工做,包括建立各類窗口組件和新建一個線程和主線程分別服務於模擬機工做和GUI的顯示,代碼:workerThread = _beginthread (UIThread, 0, NULL);,UIThread也是本件的一個函數,也是新建線程的運行代碼主體。當SIM註冊完CI類和GUI類,而後調用SIM->configuration_interface(ci_name, CI_START);即轉到配置類進行配置信息的分析與獲取,主要實如今文件gui/textconfig.cpp,裏面。當配置信息分析完,調用(代碼410行)case BX_CI_START_SIMULATION:SIM->begin_simulation(bx_startup_flags.argc bx_startup_flags.argv);對應bochs/main.cpp裏的bx_begin_simulation(),能夠看到裏面有CPU和內存的初始化工做,加載這種模塊。並最終跳入:CPU->loop(),此時虛擬的CPU開始取指令、執行指令循環下去。源碼分析

相關文章
相關標籤/搜索