qmeu的編譯過程

2021-04-28 11:04:50 字數 1693 閱讀 3608

在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)

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)

有了這些基本的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 例子,

op = (insn >> 11) & 3;

rd = (insn >> 8) & 0x7;

if (op == 0) else

switch (op)

if (op != 1)

gen_movl_reg_t0(s, rd);

底下是擷取 objdump op.o 的部份,dyngen 會把retq 以上的部份copy 出來,再經過一些patch 就產生相對應的code 啦,上面粗體的gen_***_***的function 就會把相對應的找出來,轉換就完成啦

00000000000001e7

: 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

講起來好像很簡單,那是因為假裝略過 control flow 的東東,有興趣的人自已看吧,講寫的東東其實是第二篇,先騙騙錢。

編譯的過程

編譯的概念 編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。編譯的完整過程 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...