hanxingruo 发表于 2011-3-9 19:44:09

弱问:skyeye中dbct的一些问题

读1.3.2的源码时遇到一些问题,还望板上高手指点。。。。

1 skyeye的动态二进制翻译,只在arm体系结构下实现了么?(arch\arm\dbct目录下)
其他的体系结构如果要使用动态翻译是不是要自己编写相关的微操作指令?实现tb等数据结构?

2 看teawater大侠对 dbct 解释的文章里,有点不明白
(1)关于tb条目所占空间,和微指令存放空间的分配问题。文章说有两种分配方式,动态和固定分配。当 两个宏变量TB_TBT_SIZE == 0 TB_TBP_SIZE ==0 时,在被模拟的内存结构mem_state_t->tbt / mem_state_t->tbp 分配空间;否则用动态分配方式。
不太明白为什么要用两种不同的方式?

(2)ARMul_Emulate32_dbct 函数执行时R15(即pc)的指向问题

//teawater change for debug function 2005.07.09---------------------------------
ARMword
ARMul_Emulate32_dbct (ARMul_State * state)
{
        static int init = 0;
        static FILE *fd;

/*文档解释:给R15寄存器(PC)增加一个指令长度INSN_SIZE,这是因为ARM的多级流水线PC寄存器对应用是非透明的。 而在这个函数外面的函数都将R15当作当前PC值,所以在开始执行前先对R15寄存器进行设置。
*/
/*
我 对 pc + INSN_SIZE 不太理解
因为流水线机制,ARMul_Emulate32_dbct 在执行pc处指令,而他的调用者看到的pc指向了下一条指令?
pc + 的指令条数应该跟流水线层数有关吧?
如果是三级流水:E(执行) D(译码) F(取指)

指令1                            E       D      F
指令2                  E      D      F
指令3         E       D      F
ARMul_Emulate32_dbct 的调用者看到的为什么不是 pc + 3 * INSN_SIZE 呢?

*/

        state->Reg += INSN_SIZE;
        do {
                state->trap = 0;
                gen_func =
                        (void *) tb_find (state, state->Reg - INSN_SIZE);
                if (!gen_func) {
                        state->trap = TRAP_INSN_ABORT;
                        goto check;
//AJ2D--------------------------------------------------------------------------
                }

                save_st = (uint32_t) st;
                save_T0 = T0;
                save_T1 = T1;
                save_T2 = T2;
                tmp_st = (uint32_t) state;
                wmb ();
                st = (ARMul_State *) tmp_st;
                gen_func ();
                st = (ARMul_State *) save_st;
                T0 = save_T0;
                T1 = save_T1;
                T2 = save_T2;
//teawater add for xscale(arm v5) 2005.09.01------------------------------------
              check:
//AJ2D--------------------------------------------------------------------------
                switch (state->trap) {
                case TRAP_RESET:
                        {
                                //TEA_OUT(printf("TRAP_RESET\n"));
                                ARMul_Abort (state, ARMul_ResetV);
                                state->Reg += INSN_SIZE;
                        }
                        break;
                case TRAP_UNPREDICTABLE:
                        {
                                ARMul_Debug (state, 0, 0);
                        }
                        break;
                /* 省略各种case TRAP处理*/
                }

              next:
                if (state->Emulate == ONCE) {
                        state->Emulate = STOP;
                        break;
                }
                else if (state->Emulate != RUN) {
                        break;
                }
        }
        while (!stop_simulator);

      out:
        state->Reg -= INSN_SIZE;
      /*这里给pc-INSN_SIZE ,返回的是刚刚执行过的指令位置?*/
        return (state->Reg);
}

[ 本帖最后由 hanxingruo 于 2011-3-9 19:45 编辑 ]

ksh 发表于 2011-3-9 20:30:36

以前的arch/arm/dbct的代码已经废弃。
目前我们正在采用dyncom做新的动态编译框架,已经初步实现了arm和powerpc,mips正在开发中。可以到git仓库看dyncom的实现架构。
了解开发进度可以加入到我们的邮件列表如下:
[email protected]

hanxingruo 发表于 2011-3-9 20:46:08

回复 2# ksh 的帖子

o(╯□╰)o~~~~~

那skyeye-1.3.2_rc1 版本已经使用dyncom了么?

还是想知道上面问题的答案~~~~(>_<)~~~~


ps:
新架构dyncom是kang老师设计的么? 跟llvm有啥关系?

[ 本帖最后由 hanxingruo 于 2011-3-9 21:07 编辑 ]

ksh 发表于 2011-3-10 12:54:45

skyeye-1.3.2_rc1 中没有dyncom的代码,在我们最新的仓库中有。dyncom是动态编译系统,使用的llvm的中间语言。基本过程是先把目标指令如arm,. powerpc指令翻译成llvm的中间表示,然后再把中间表示转换成x86指令。目前的最新进展性能是qemu的70%左右,正在进一步优化中。
页: [1]
查看完整版本: 弱问:skyeye中dbct的一些问题