因為我的電腦是x64的CPU,是以暫時scf編譯器架構也隻有x64的機器碼生成。
最近學了下qemu虛拟機,安裝了arm64的ubuntu 18.04,準備年後給scf加上arm64的機器碼生成。
ARM是現在使用最多的RISC架構的CPU,在移動裝置中使用很廣泛,但PC機上幾乎沒有使用的。
是以,在PC機上的C代碼編譯成了ARM的機器指令之後,還要傳到ARM的闆子上去跑,這就是交叉編譯。
arm機器碼的調試還是比較麻煩的,因為要在兩個機器碼不通用的機器上來回傳檔案。
然後就有大牛做了一套虛拟機,就是qemu。
法布裡斯-貝拉,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位的。
arm64的hello world的ELF檔案頭
上圖是arm64上的hello world的ELF頭,可以看到Machine這項的名字是AArch64,其他内容跟x64的差不多。
當然ELF檔案裡的機器碼是不一樣的。
arm64的機器碼是這樣的:
arm64的hello world的機器碼
arm的所有型号的CPU都是RISC架構,它的每條指令都是4個位元組。
不像x64,每條指令的長度是不固定的:少的1個位元組,多的很多位元組。
x64的hello world的機器碼
從文法分析的角度來看,arm的指令要比x64的簡單很多。
每4位元組就是1條指令,這32位裡的每一位表示什麼,就按照什麼執行就行了。
但是x64的不可以,不分析完整條指令的文法,就不知道它多少位元組。
x64使用可變的位元組數來編碼指令,一般來說,最終檔案的大小比arm有優勢。
在記憶體和硬碟特别小的上古IT時代,這種編碼方式有節省空間的優勢[捂臉]
現在,intel節省的那點記憶體空間,還不夠給軟體作者添麻煩的。
是以,指令長度不固定的CISC架構,也是個曆史遺留問題。
arm的寄存器和指令沒有互相綁定的問題,例如intel的乘法指令隻能使用EAX和EDX,讓生成機器指令的時候還得現騰出這倆寄存器來。
arm的寄存器和指令沒有耦合度,機器碼生成子產品寫起來比intel的要簡單。
春節之後,把它加上。