|
读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[15] += INSN_SIZE;
do {
state->trap = 0;
gen_func =
(void *) tb_find (state, state->Reg[15] - 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[15] += 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[15] -= INSN_SIZE;
/*这里给pc-INSN_SIZE ,返回的是刚刚执行过的指令位置?*/
return (state->Reg[15]);
}
[ 本帖最后由 hanxingruo 于 2011-3-9 19:45 编辑 ] |
|