天天看點

安裝了qemu虛拟機,我準備給scf加上arm64的機器碼生成

作者:底層技術棧

因為我的電腦是x64的CPU,是以暫時scf編譯器架構也隻有x64的機器碼生成。

最近學了下qemu虛拟機,安裝了arm64的ubuntu 18.04,準備年後給scf加上arm64的機器碼生成。

ARM是現在使用最多的RISC架構的CPU,在移動裝置中使用很廣泛,但PC機上幾乎沒有使用的。

是以,在PC機上的C代碼編譯成了ARM的機器指令之後,還要傳到ARM的闆子上去跑,這就是交叉編譯。

arm機器碼的調試還是比較麻煩的,因為要在兩個機器碼不通用的機器上來回傳檔案。

然後就有大牛做了一套虛拟機,就是qemu。

安裝了qemu虛拟機,我準備給scf加上arm64的機器碼生成

法布裡斯-貝拉,ffmpeg和qemu之父

qemu的作者叫法布裡斯-貝拉,是法國的一個程式員,他同時也是音視訊架構ffmpeg的作者。

ffmpeg應該都不陌生,撐起了整個多媒體行業!

現在看到的各種直播、短視訊、美顔的背後,都離不開ffmpeg。

就跟Linux之父同時還做了代碼管理工具git一樣,ffmpeg之父也做了虛拟機qemu。

qemu的出現,為底層技術的開發者們提供了巨大的友善!

不用找硬體了,也不用在兩台機器上來回傳代碼了,直接安裝個虛拟機就行了[呲牙]

隻要下載下傳個arm64版的ubuntu 18.04,我就可以在x64的電腦上編寫arm64的機器碼生成子產品了。

arm64的學名叫aarch64,就是arm的arch64的縮寫。

arch,在底層的軟硬體裡一般都是指的機器平台。

它(64位的arm)與C語言的接口ABI就是arm-v8。

32位的arm與C語言的接口ABI是arm-v7,這個版本的前幾年使用率非常高,現在應該沒多少arm-v7的機器了。

在我看來,即使在移動嵌入式領域,32位CPU的時代也過去了。

在scf編譯器架構裡,我準備不支援任何架構的32位機器碼了,隻支援64位的。

安裝了qemu虛拟機,我準備給scf加上arm64的機器碼生成

arm64的hello world的ELF檔案頭

上圖是arm64上的hello world的ELF頭,可以看到Machine這項的名字是AArch64,其他内容跟x64的差不多。

當然ELF檔案裡的機器碼是不一樣的。

arm64的機器碼是這樣的:

安裝了qemu虛拟機,我準備給scf加上arm64的機器碼生成

arm64的hello world的機器碼

arm的所有型号的CPU都是RISC架構,它的每條指令都是4個位元組。

不像x64,每條指令的長度是不固定的:少的1個位元組,多的很多位元組。

安裝了qemu虛拟機,我準備給scf加上arm64的機器碼生成

x64的hello world的機器碼

從文法分析的角度來看,arm的指令要比x64的簡單很多。

每4位元組就是1條指令,這32位裡的每一位表示什麼,就按照什麼執行就行了。

但是x64的不可以,不分析完整條指令的文法,就不知道它多少位元組。

x64使用可變的位元組數來編碼指令,一般來說,最終檔案的大小比arm有優勢。

在記憶體和硬碟特别小的上古IT時代,這種編碼方式有節省空間的優勢[捂臉]

現在,intel節省的那點記憶體空間,還不夠給軟體作者添麻煩的。

是以,指令長度不固定的CISC架構,也是個曆史遺留問題。

arm的寄存器和指令沒有互相綁定的問題,例如intel的乘法指令隻能使用EAX和EDX,讓生成機器指令的時候還得現騰出這倆寄存器來。

arm的寄存器和指令沒有耦合度,機器碼生成子產品寫起來比intel的要簡單。

春節之後,把它加上。

繼續閱讀