Bochs源码分析-初始化部分
因为学习需要,要看虚拟机Bochs的源代码。写随笔主要为了学习总结,其次是分享大家共同研究,大神勿喷,欢迎评论。
手头资料:bochs源代码,下于:bochs.sourceforge.net,还有喻强写的源码分析电纸书。
从程序运行到模拟机真正开始工作,即模拟程序代码的运行,这一部分称为程序的初始化。其中主要包括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开始取指令、执行指令循环下去。