针对龙芯多核cpu模拟的动态代码转换的多线程化方法

文档序号:6374469阅读:134来源:国知局
专利名称:针对龙芯多核cpu模拟的动态代码转换的多线程化方法
技术领域
本发明涉及针对龙芯多核CPU模拟的动态代码转换的多线程化方法,具体涉及一种多线程化的代码转换环境设计、多转换线程之间的通讯机制以及基于以上方法的对龙芯多核CPU的多线程模拟方法,它能够通过在对龙芯多核CPU模拟时多线程并行地进行代码转换从而对模拟效率进行优化,属于计算机虚拟化技术领域。
背景技术
当前采用国产龙芯处理器的服务器中,大部分采用龙芯多核CPU,通常在研发过程中需要对CPU硬件进行模拟,对CPU进行模拟是指通过软件方法模拟出相应的硬件环境,提供给上层一个透明的运行环境,使上层感觉自己就像直接运行在相应的CPU硬件上一样,通常对CPU硬件进行模拟可以满足虚拟化、上层相应软件调试等需求,同时可以在模拟的CPU硬件上注入故障以检查上层软件的健壮性。现有的对龙芯多核CPU的模拟实现中并没有使多个模拟核进行并行的代码转换,这降低了龙芯多核CPU的模拟效率,如图1所示,在当前龙芯多核CPU的模拟实现中,由于每个模拟的CPU核按照轮询方式来获得执行机会,同时在进行核间通讯的过程中,需要响应的模拟核因没有得到执行机会而不能及时完成通讯过程,从而降低了对龙芯多核CPU的模拟效率。如果能在模拟过程中,通过设计实现的多线程代码翻译环境,并且完成多翻译线程之间的通讯机制,如图2所示,使在对多个核的模拟过程中实现并行的动态代码翻译,则可以避免模拟核在需要获得执行机会以及核间通讯过程中的不必要等待,提高对龙芯多核(PU的模拟效率,从而为虚拟化、上层软件调试提供高效的支持。综上,本发明对提高针对龙芯多核CPU的模拟效率有很重要的意义。

发明内容
本发明人认识到,如果能在模拟过程中,通过设计实现的多线程代码转换环境,并且完成多转换线程之间的通讯机制,如图2所示,使在对多个核的模拟过程中实现并行的动态代码转换,则可以避免模拟核在需要获得执行机会以及核间通讯过程中的不必要等待,提高对龙芯多核CPU的模拟效率,从而为虚拟化、上层软件调试提供高效的支持。综上,本发明对提高针对龙芯多核CPU的模拟效率有很重要的意义。本发明的一个目的,是提供一种针对龙芯多核CPU模拟的动态代码转换的多线程化方法,它是针对龙芯多核CPU模拟的将动态代码转换过程多线程化来实现并行的方法,它首先通过针对需要模拟的龙芯CPU核数进行探测,准备对应的多线程代码转换相应环境,再依靠多线程之间的通讯机制保证动态代码转换的并行执行,则避免模拟核在需要获得执行机会以及核间通讯过程中的不必要等待,提高对龙芯多核CPU的模拟效率根据本发明的一个方面,提供了一种针对龙芯多核CPU模拟的动态代码转换的多线程化方法,其特征在于包括
步骤A :对需要模拟的龙芯多核CPU进行初始化;步骤B :为各个待模拟的CPU核准备相应的动态代码转换环境;步骤C :通过线程间通信完成各动态代码转换线程初始化;步骤D :使各个动态代码转换线程开始并行工作。本发明的优点包括本发明是一种针对龙芯多核CPU模拟的多线程动态代码转换方法,它与现有技术相比,其主要优点如下(I)通过使对多核CPU模拟的过程通过多线程技术,实现了动态代码并行化,提高了模拟过程中动态代码转换的效率;(2)通过在多线程代码转换的过程中,通过线程通讯模拟核间通讯过程,避免不必要的等待,进一步提高动态代码转换的效率。


图1是现有技术的龙芯多核CPU模拟动态代码转换时序图。图2是根据本发明的一个实施例的龙芯多核CPU模拟动态代码转换时序图。图3是根据本发明的一个实施例的针对龙芯多核CPU模拟的多线程动态代码转换方法总体流程图。图4是根据本发明的一个实施例的针对龙芯多核CPU模拟的多线程动态代码转换详细工作流程图。
具体实施例方式以下结合附图及具体实施例对本发明再作进一步详细的说明。本发明的一个主要思想,是在对龙芯多核cpu的模拟过程中通过使每个核的动态代码转换并行化,从而避免原本各个核轮询执行过程中以及在核间通讯过程中不必要的等待,进而提高对龙芯多核CPU的模拟效率。经过并行后的龙芯多核CPU动态代码转化时序图如图2所示,从图中我们可以看出多个CPU核在整个代码翻译的过程中采用并行化执行,在同一时刻多个CPU同时进行动态代码转换。如图3所示,根据本发明的一个实施例的一种针对龙芯多核CPU模拟的多线程动态代码转换方法包括以下步骤步骤101.对需要模拟的龙芯多核CPU进行初始化;步骤102.为各个待模拟的CPU核准备相应的动态代码转换环境;步骤103.通过线程间通信完成各动态代码转换线程初始化;步骤104.各个动态代码转换线程开始并行工作。其中,步骤101所述的对需要模拟的龙芯多核CPU进行初始化包括对需要模拟的龙芯CPU进行特定的分析,确定每个CPU中要进行模拟的核数,同时给对应的核进行特定标识,以便之后动态代码转换并行化,然后为其初始化好相应的模拟寄存器、模拟内存等,并且在特定的寄存器中放好启动所需的特定初始值,为启动CPU做好准备。其中,步骤102包括为了保证多线程动态代码转换的并行执行,为每个动态代码转换线程准备独立的代码转换资源,由于动态代码转换过程需要经历将源代码变为中间代码,从而最终转换为目标代码两个过程,所以需要为中间代码和目标代码分别准备配套的资源。其中,步骤103包括为了保证多个代码核能够在同时就绪的情况下同时开始工作,设置特定的信号通讯机制和锁变量,在此基础上线程间通讯保证多个动态代码转换线程的一致性。其中,步骤104包括在之前准备好的多线程代码转换线程环境和动态代码转换进程初始化的基础上,对各个核中的需要模拟执行的指令进行并行的动态代码转换,在转换过程中保持线程间的同步性,保证并行工作的正确性,并且利用线程间通讯完成核间通讯的模拟。本发明适用但不限于针对龙芯多核处理器的模拟效率优化。更具体地,参见图2、图3及图4,根据本发明的一个实施例的一种针对龙芯多核(PU模拟的多线程动态代码转换方法包括以下步骤步骤201 :对需要模拟的龙芯多核CPU进行初始化在对龙芯多核CPU进行模拟前,需要对龙芯多核CPU进行抽象,为保证之后多个核能够在多线程环境下进行并行动态代码转换,每个核需要有自己独立的数据结构,其中包括CPUState和CoreIPIState两方面,需要对核进行唯一编号,从而形成CorelD,以便在动态代码转换的过程中使用数据自己的转换资源;同时对于核内部的CPUState进行独立的初始化以备动态代码转换过程中的映射,通过以上工作来保证每个核在运行过程中不影响其他核的动态代码转换工作。步骤202 :为各个待模拟的CPU核准备相应的动态代码转换环境。通过该步骤主要完成了对动态代码转换所需的相关资源的初始化,为每个核准备特定的资源进行处理;根据如图4所示的本发明的实施例,步骤202的具体实现过程可以包括步骤202-1 :初始化各个核的动态代码转换上下文在为每一个待模拟的CPU核准备动态代码转换环境的过程中,应当为其准备代码转换上下文TCGContext,包括在代码转换过程中核所对应的序号,转换过程中用到的中间变量和全局变量计数,目标代码保存数据及跳转指针,在代码转换上下文TCGContext中较重要的数据结构如下int cpu—index;uint8—t*code—buf;uint8—t*code—ptr;int nb—globals;int nb—temps;unsigned long*tb—next;步骤202-2 :初始化各个核转换目的代码的执行前后序列在将代码块转换成目的代码,目的代码的执行过程中,先执行一段公共的前序代码,然后跳转到代码转换上下文中的目的代码保存数据结构上,从而开始执行目的代码,实现代码转换,最终执行共有的后序代码。所以需要准备好每个核的前后续代码,其初始化方法为tcg_prologue_init_multi,完成前序代码、跳转到目的代码及后序代码的连接。步骤202-3 :初始化各个核转换的中间代码操作码及操作数缓存
在代码转换过程中首先将源代码块逐条转换为多条中间代码序列,由方法gen_intermediate_code_internal_multi完成,在生成的中间代码需要按照操作码及操作数分开准备,他们分别为 gen_opc_buf_multi 和 gen_opparam_ptr_multi。步骤202-4 :初始化各个核的动态转换加速资源用相应的资源来加速代码转换的hash表结构,通过缓存特定的二进制代码块,利用程序的局部性来加速代码转换过程,这样的转换资源也应该针对每个核特定设计,设计的数据结构为 tb_phys_hash_multi。步骤203 :通过线程间通信完成动态代码转换多线程初始化该步骤主要在利用步骤202的准备好的多个转换资源,通过线程间通信,完成整个CPU模拟中动态代码转换并行化的基本运行条件。系统起初有一个主线程运行,当完成CPU核的初始化时,主线程会为每个CPU核创建一个线程。主线程创建每个CPU线程后要保留每个线程的线程号用于后续的通信,该线程需要CPU线程初始化后才能开始后续工作,所以主线程创建CPU线程后会被挂起,等待创建的CPU线程准备就绪并返回线程号后再被唤醒继续运行,使用CPU信号Cpu_COnd和每个CPU核的全局锁global_mutex_multi来同步主线程和CPU代码转换线程。CPU代码线程被创建后并不能立刻开始执行代码转换,因为系统还未完全初始化。此处,我们设计一个系统就绪标识systenuready表示系统是否初始化完毕,并结合系统就绪信号量syStem_COnd以及前面提到的CPU核全局锁来进行线程间通信。CPU代码转换线程进行相应初始化后会被挂起,等待系统就绪信号量systenucond并不断检测系统就绪标识system_ready的状态。主线程完成后续的初始化工作后设置系统就绪标识system_ready为完成并广播系统就绪信号量systenucond,此时之前准备就绪的CPU代码转换线程会被唤醒并开始执行代码转换,之前的初始化主现成变为整个动态代码转换中的IO线程及控制进程,总体管理在动态代码转换并行化过程中的同步性。步骤204 :各个动态代码转换线程开始并行工作在之前准备好的多线程代码转换线程环境和动态代码转换进程初始化的基础上,对各个核中的需要模拟执行的指令进行并行的动态代码转换,通过线程间通讯IPI信号完成核间通讯的模拟,同时将数据反映到CPU核的CoreIPIState结构中,利用信号来完成核间中断处理,代码转换利用前面的环境进行正确的并行动态代码转换。本发明可以有效地避免原本对龙芯多核CPU模拟中各个核轮询执行以及在核间通讯模拟过程的不必要等待,充分提高对龙芯多核CPU的模拟效率,从而为虚拟化、上层软件调试提供高效的支持。以上实施例仅用以说明而非限制本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当中。
权利要求
1.一种针对龙芯多核CPU模拟的动态代码转换的多线程化方法,其特征在于包括 步骤A :对需要模拟的龙芯多核CPU进行初始化; 步骤B :为各个待模拟的CPU核准备相应的动态代码转换环境; 步骤C :通过线程间通信完成各动态代码转换线程初始化; 步骤D :使各个动态代码转换线程开始并行工作。
2.根据权利要求1所述的针对龙芯多核CPU模拟的动态代码转换的多线程化方法,其特征在于所述步骤A包括 对需要模拟的龙芯CPU进行特定的分析, 确定每个CPU中要进行模拟的核数,同时给对应的核进行特定标识,以便之后动态代码转换并行化, 然后为待进行模拟的CPU初始化好相应的模拟寄存器、模拟内存,并且在CPU启动的首个加载地址上寄存器中放好启动所需的特定初始值,为启动CPU做好准备。
3.根据权利要求1所述的针对龙芯多核CPU模拟的动态代码转换的多线程化方法,其特征在于 动态代码转换过程包括 将源代码变为中间代码, 将中间代码转换为目标代码, 且,所述步骤B包括为所述中间代码和目标代码分别准备配套的资源。
4.根据权利要求1所述的针对龙芯多核CPU模拟的动态代码转换的多线程化方法,其特征在于所述步骤C包括 设置多个代码转换线程相互之间及与IO线程之间的信号通讯机制和锁变量,从而保证多个代码核能够在同时就绪的情况下同时开始工作,从而使线程间通讯能够保证多个动态代码转换线程的一致性。
5.根据权利要求1所述的针对龙芯多核CPU模拟的动态代码转换的多线程化方法,,其特征在于所述步骤D包括 在已准备好的多线程代码转换线程环境和动态代码转换进程初始化的基础上,对各个核中的需要模拟执行的指令进行并行的动态代码转换, 在转换过程中保持线程间的同步性,从而保证并行工作的正确性,以及 利用线程间通讯完成核间通讯的模拟。
6.根据权利要求1所述的针对龙芯多核CPU模拟的动态代码转换的多线程化方法,其特征在于所述步骤B包括 初始化各个核的动态代码转换上下文(步骤202-1); 初始化各个核转换目的代码的执行前后序列(步骤202-2); 初始化各个核转换的中间代码操作码及操作数缓存(步骤202-3); 初始化各个核的动态转换加速资源(步骤202-4)。
7.根据权利要求6所述的针对龙芯多核CPU模拟的动态代码转换的多线程化方法,其特征在于 所述初始化各个核的动态代码转换上下文的步骤(步骤202-1)的步骤包括准备代码转换上下文TCGContext, 代码转换上下文具体包括在代码转换过程中核所对应的序号、转换过程中用到的中间变量和全局变量计数及目标代码保存数据及跳转指针, 其中,在代码转换上下文TCGContext中重要的数据具有诸如如下的结构int cpu—index;uint8_t*code—buf;uint8_t*code—ptr;int nb_globals;int nb_temps;unsigned long氺tb—next; 所述初始化各个核转换目的代码的执行前后序列的步骤(步骤202-2)包括 准备好每个核的前后续代码,其初始化方法为tcg_prologue_init_multi, 完成前序代码、跳转到目的代码及后序代码的连接 在将代码块转换成目的代码执行过程中,先执行一段公共的前序代码, 然后跳转到代码转换上下文中的目的代码保存数据结构上,从而开始执行目的代码,实现代码转换, 最终执行共有的后序代码, 所述初始化各个核转换的中间代码操作码及操作数缓存的步骤(步骤202-3)包括 在代码转换过程中先将源代码块逐条转换为多条中间代码序列,由方法gen_intermediate_code_internal_multi 完成, 按照操作码及操作数分开准备生成的中间代码,分别为gen_opc_buf_multi和gen_opparam_ptr_multi, 所述初始化各个核的动态转换加速资源的步骤(步骤202-4)包括 用相应的资源来加速代码转换的hash表结构, 通过缓存特定的二进制代码块,利用程序的局部性来加速代码转换过程, 其中,转换资源是针对每个核特定设计的,设计的数据结构为tb_phys_hash_multi。
8.根据权利要求1所述的针对龙芯多核CPU模拟的动态代码转换的多线程化方法,其特征在于所述步骤C包括 利用系统的初始主线程,为每个CPU核创建一个子线程,其中所述主线程在创建每个所述子线程后保留每个子线程的线程号用于后续的通信,主线程子需要CPU线程初始化后才能开始后续工作。
在主线程创建所述子线程后,挂起所述主线程, 随后主线程等待创建的子线程准备就绪并返回线程号后再被唤醒继续运行, 使用CPU信号cpu_cond和每个CPU核的全局锁global_mutex_multi来同步所述主线程和CPU代码转换子线程。
9.根据权利要求8所述的针对龙芯多核CPU模拟的动态代码转换的多线程化方法,其特征在于 设置一个系统就绪标识system_ready来表示系统是否初始化完毕, 结合一个系统就绪信号量systenucond以及所述CPU核全局锁来进行线程间通信,在CPU代码转换子线程进行相应初始化后,挂起CPU代码转换子线程,等待系统就绪信号量system_cond并不断检测系统就绪标识system_ready的状态,在主线·程完成后续的初始化工作后,把系统就绪标识systenuready设置为“完成”并广播系统就绪信号量systenucond,从而使之前准备就绪的CPU代码转换线程被唤醒并开始执行代码转换,使之前的初始化主线程变为整个动态代码转换中的IO线程及控制进程,总体管理在动态代码转换并行化过程中的同步性。
全文摘要
本发明为一种针对龙芯多核CPU模拟的动态代码转换的多线程化方法,包括对需要模拟的龙芯多核CPU进行初始化;为各个待模拟的CPU核准备相应的动态代码转换环境;通过线程间通信完成各动态代码转换线程初始化;各个动态代码转换线程开始并行工作。该方法首先通过针对需要模拟的龙芯CPU核数进行探测,准备对应的多线程代码转换相应环境,再依靠多线程之间的通讯机制保证动态代码转换的并行执行,则避免模拟核在需要获得执行机会以及核间通讯过程中的不必要等待,提高对龙芯多核CPU的模拟效率。本发明的方法在计算机虚拟化技术领域内具有广泛地实用价值和应用前景。
文档编号G06F9/54GK103049305SQ20121027566
公开日2013年4月17日 申请日期2012年8月3日 优先权日2012年8月3日
发明者肖利民, 唐浩夫, 阮利, 王慧祥, 徐鹏 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1