在qmeu中,將qmeu 本身所執行的平台稱為 host,模擬的平台稱target,而將target code 轉為 host code 的過程稱為code generation。但因為qemu 是在動態執行中將target code 轉為 host code,所以多加了乙個dynammic來形容。而整個過程在qemu 中稱為 dyngen。
之後target 必需定義一些簡單的operation function,此operation function 被定義在每個 target-machine/op.c ,底下是target-arm 的例是,每個平台大同小異
,這些operation 很簡單,定義如何在pesudo register 之間搬資料,做一些簡單的動作。
void opproto op_movl_t0_t1(void)有了這些基本的operation後,在build qemu時會將的會將op.c 編譯成 op.o,再從op.o 將每個operation 所對應的host code抽出來,產生op.h opc.h,target-machine/translate.c 利用產生出來的個這兩個header file將每個target instruction 對應到數個operation function。就像底下的arm 例子,void opproto op_movl_t1_im(void)
void opproto op_addl_t1_im(void)
void opproto op_addl_t1_t2(void)
void opproto op_subl_t1_t2(void)
op = (insn >> 11) & 3;底下是擷取 objdump op.o 的部份,dyngen 會把retq 以上的部份copy 出來,再經過一些patch 就產生相對應的code 啦,上面粗體的gen_***_***的function 就會把相對應的找出來,轉換就完成啦rd = (insn >> 8) & 0x7;
if (op == 0) else
switch (op)
if (op != 1)
gen_movl_reg_t0(s, rd);
00000000000001e7講起來好像很簡單,那是因為假裝略過 control flow 的東東,有興趣的人自已看吧,講寫的東東其實是第二篇,先騙騙錢。: 1e7: 45 01 ec add %r13d,%r12d
1ea: c3 retq
00000000000001eb
: 1eb: 45 29 ec sub %r13d,%r12d
1ee: c3 retq
00000000000001ef
: 1ef: 45 01 e7 add %r12d,%r15d
1f2: c3 retq
編譯的過程
編譯的概念 編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。編譯的完整過程 c源程式 預編譯處理 c 編譯 優化程式 s asm 匯程式設計序 obj o a ko 鏈...
編譯原理 編譯的過程
預處理 prepressing 展開巨集定義 處理 define,include 刪除注釋,新增行號和檔名標識。生成.i 預處理檔案 編譯 compilation 詞法分析 語法分析 語義分析 優化。預處理 編譯用ccl完成。生成.s 彙編 檔案 彙編 assembly 把彙編 轉成機器可執行的指令...
編譯 Ares Galaxy 的過程
首先就是回到俺以前的delphi7上,要不是2006所帶的重構工具和ide實在太誘人,俺還是覺得delphi7的介面友好,大概是習慣的緣故吧。下面開始漫漫的安裝控制項的歷程。開始編譯,上來就報少了什麼屬性。webbrower,這不是delphi自帶的控制項嘛。先cancel再說,編譯少shdocvw...