2014年3月13日 星期四

在 Dalvik 裡加上一個 opcode 看看!!!!

作業二的第一步,就是要在現在的 Dalvik 裡加上一個新的 opcode ,
聽起來困難得誇張,其實因為 Dalvik 很有遠見,早就準備好未來會想要新增 opcode 了,
所以其實只是在走別人鋪好的路,算是簡單。
不過簡單歸簡單,沒有這篇教學的話,我也不會做。

首先,要新增 opcode 的定義。
先 cd 到 dalvik/opcode-gen 裡,有個 bytecode.txt ,
看起來好像只是個普通的純文字檔,沒想到就是定義所有 opcode 的地方。
作業的要求是要我們用 unused 的 73 來複製 move 的功能,
就在 bytecode.txt 加上這個 move73 之後,就跑一下裡面 regen-all 這個 shell script 來更新。
讓我不解的是,到底 73 為什麼會是 unused 呢?明明 72 和 74 都有用呀?
這個 73 是什麼神秘的數字呢?

新增完定義之後,就到 dalvik/vm/mterp 裡,要把這個 move73 的實作弄出來。
說是實作,其實也就是把原本的 move 複製一份而已。
要複製 C++ 的部份,還有 ARM 、 MIPS 、 x86 這些 architecture 的組語。
最後再跑一下 rebuild.sh 來 compile 它們。
有點不懂的部份是, rebuild 時要設 TARGET_ARCH=portable 這個變數,
不大懂這個 portable 是什麼意思。

然後到 dalvik/vm/analysis 裡,其實我有點搞不清楚這裡要幹嘛,
反正就也是把程式修改成說 move73 要做的事和 move 是一樣的。

最後一步,回到 project 的 root 來個絕地大 make ,
只是這裡要加一些 argument ,
什麼 WITH_HOST_DALVIK=true 啦,什麼 WITH_JIT=false 啦,
後面還有個附註說可能還要加 -B ,實在不知道這些具體上在幹嘛,不加又會怎麼樣…

在教學的結尾時,要我們看一下 git status 的樣子,
一看發現超怪,一大堆我明明沒動的檔案也都被標成 modified 了,
比方說 libdex/DexOpcodes.cpp ,它自己就把 "unused-73" 改成 "move73" 了,
這樣看起來,它們都是自動生成的檔案,
那就不應該放進 git 的 repo 呀,非常奇怪。

這樣子好像是加好 opcode 了,
但是要怎麼測試呢?明天再說好了。

沒有留言:

張貼留言