加油,你可以的
另外,qemu 在 interrupt 之後就沒有再 disas code,why?
因為 syscall 的為 TARGET_NR_exit,所以就直接 _exit 了,
後面的 code 就不用 return 了。
首先:需要找出到底有那些 op 是我的 target?
先決定那些頁面要印,
我需要 instruction format 的 頁面,還有
REX prefixes are instruction-prefix bytes used in 64-bit mode. They do the following:
• Specify GPRs and SSE registers.
• Specify 64-bit operand size.
• Specify extended control registers.
要處理的 instructions 有:
83 c4 08 add $0x8,%esp
83 is op code, for ADD
c4 is ModR/M, 11 000 100 (2+3+3)
MOD: 11
Reg: 000
R/M:100
0000 1000
83 ec 08 sub $0x8,%esp
e8 c8 ff ff ff call 8048080
cd 80 int $0x80
5d pop %ebp
55 push %ebp
c3 ret
89 04 24 mov %eax,(%esp)
89 45 f8 mov %eax,-0x8(%ebp)
89 45 fc mov %eax,-0x4(%ebp)
89 cb mov %ecx,%ebx
89 e5 mov %esp,%ebp
8b 45 fc mov -0x4(%ebp),%eax
8b 4d fc mov -0x4(%ebp),%ecx
b8 01 00 00 00 mov $0x1,%eax
c7 45 fc 05 00 00 00 movl $0x5,-0x4(%ebp)
============3/2===============
每一個都要寫一個 disassembler
為什麼會這麼焦慮呢?
冷靜下來,好好的想,念「南無阿彌佗佛」,南無阿彌佗佛 南無阿彌佗佛 南無阿彌佗佛,肚子好餓,translator 寫在一起算了!
重寫 cpu_gen_code!!
tb->tb_jmp_offset : 用來跳到 code cache 的其他地方,
./tcg/i386/tcg-target.c:873
tb->tb_next_offset : 用來跳到 code cache 的其他地方,
./tcg/i386/tcg-target.c:881:
s->tb_next_offset[args[0]] = s->code_ptr - s->code_buf;
這兩個跟我們應該沒關係,我們不會用到。
幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹幹
剛剛看了 tb_next_offset 的用途,並非沒用,
uint16_t tb_next_offset[2]; /* offset of original jump target */
uint16_t tb_jmp_offset[4]; /* offset of jump instruction */
unsigned long tb_next[2]; /* address of jump generated code */
tb_jmp_offset 在 ./exec-all.h:233 會用到,
offset = tb->tb_jmp_offset[n],
這是在 tb_set_jmp_target 中,
tb_set_jmp_target(TranslationBlock *tb, int n, unsigned long addr)
先取出 tb 中 第 n 個 tb_jmp_offset,在該處放置於 addr 相對的位置:
jmp_addr = tb->tc_ptr + offset;
*(uint32_t*)jmp_addr = add - ( T + 4);
而 tb_set_jmp_target是在 tb_add_jmp中呼叫的的,
tb_add_jump(TranslationBlock *tb, int n, TranslationBlock *tb_next)
它先 check tb->jmp_next[n]不為0,若是,則呼叫 tb_set_jmp_target
然後將 tb->jmp_next[n] = tb_next->jmp_first;
然後將 tb_next->jmp_first = (TranslationBlock *)((long)(tb) | (n));
上面有個我不知道的假設,它似乎拿最後面兩個 bit 來用,
可是它怎麼知道 TranslationBlock *tb 指到的位置都沒有用到最後面兩個 bit,
那你要去看那個 pointer 是怎麼來的,tb_alloc,
沒什麼特別,是不是所有的 pointer都是最後兩個bit沒用?
是的,是的,pointer 的最後兩個 bit 都是沒用的,因為
一個 pointer 是4個byte(在 32 位元的機器上)。
在 cpu_exec 中會呼叫 tb_add_jump,
tb_add_jump((TranslationBlock *)(next_tb & ~3), next_tb & 3, tb);
上面function的意思是指:
若 next_tb->jmp_next[n]不為0,n is "next_tb & 3"
則將 tb->tc_ptr 跟 (next_tb->tc_ptr + next_tb->tb_jmp_offset[n])的距離,
放在 next_tb->tc_ptr + next_tb->tb_jmp_offset[n] 所指的位置上。
真的會用到嗎?
會!做實驗了。
從source code document中提到關於 jmp_next:
/* list of TBs jumping to this one. This is a circular list using
the two least significant bits of the pointers to tell what is
the next pointer: 0 = jmp_next[0], 1 = jmp_next[1], 2 =
jmp_first */
what does epilogue do?
restore stack and pop out saved register
回傳值是藏那去?
算了,先不要回傳值好了,
from wikipedia:
http://en.wikipedia.org/wiki/X86_calling_conventions
the returned value is stored in EAX register
來研究一下等會要幹嘛好了,
一、綀
=============3/3=================
一、prologue 跟 epilogue 都可用,
但要將 tb_ret_addr 要能 pass 過 translator。
另一方面,要想,有沒可能自己寫 prologue 跟 epilogue?
是要寫在 translation function 中嗎?不行吧,這樣你怎麼做 linking?
還要跳過 prologue 跟 epilogue。
test program 中有兩個 basic blocks:
55 push %ebp
89 e5 mov %esp,%ebp
83 ec 08 sub $0x8,%esp
c7 45 fc 05 00 00 00 movl $0x5,-0x4(%ebp)
8b 45 fc mov -0x4(%ebp),%eax
89 04 24 mov %eax,(%esp)
e8 c8 ff ff ff call 8048080
55 push %ebp
89 e5 mov %esp,%ebp
83 ec 08 sub $0x8,%esp
8b 45 08 mov 0x8(%ebp),%eax
89 45 fc mov %eax,-0x4(%ebp)
8b 4d fc mov -0x4(%ebp),%ecx
b8 01 00 00 00 mov $0x1,%eax
89 cb mov %ecx,%ebx
cd 80 int $0x80
要處理的 instructions 有
83 c4 08 add $0x8,%esp
83 is op code
08 is immediate value 0x8
c4 is ModR/M, 11+000+100 (2+3+3)
MOD: 11
Reg: 000
R/M:100
83 ec 08 sub $0x8,%esp
e8 c8 ff ff ff call 8048080
cd 80 int $0x80
5d pop %ebp
55 push %ebp
c3 ret
89 04 24 mov %eax,(%esp)
89 45 f8 mov %eax,-0x8(%ebp)
89 45 fc mov %eax,-0x4(%ebp)
89 cb mov %ecx,%ebx
89 e5 mov %esp,%ebp
8b 45 fc mov -0x4(%ebp),%eax
8b 4d fc mov -0x4(%ebp),%ecx
b8 01 00 00 00 mov $0x1,%eax
c7 45 fc 05 00 00 00 movl $0x5,-0x4(%ebp)
in translate-all.c, line 88
CPUX86State 很大,有 28536 byte,一個 page 才 4k=4096 byte,它就佔了7個 page!
==================================
先將 disassembler 弄好。
沒有留言:
張貼留言