初探arm與aarch64虛擬化相容心得

2021-10-20 14:41:58 字數 1445 閱讀 9093

armv8主要有三套指令集,依據執行狀態(execution state)的不同可以劃分為:

aarch64   aarch64 狀態只支援一套指令集,叫做a64. 

a64為定長32位的指令集,即每個指令的大小為32bit.

指令集手冊:

aarch32 aarch32 狀態支援兩套指令集:

a32 也是32位定長指令集

t32 可變長指令集,其中支援兩種不同長度的指令一種長度16位一種長度32位,其中16位的指令也稱為thumb code

指令集手冊:

通過對比我們可以發現同乙個指令的格式有較大差異,比如ldr的指令。aarch32是這樣的:

ldr rt, [rn, ±rm ] ;
似乎支援正負號。

而aarch64的指令是這樣的:

ldr , [, (|)}] ; 32-bit
似乎簡潔一些。

armv8的cpu將需要執行的一部分程式指令打包為乙個pe(processing element 簡稱pe翻譯成處理單元好像也可以)並將pe分別劃分為四層,el0~el3,數字越大,安全等級越高,而切換執行狀態(aarch32還是aarch64)只能通過切換el或者重置來實現,而切換el後切換的執行狀態則由更高階的el來決定。

要進入的el

決定這個el執行狀態的暫存器

non-secure el1

hcr_el2.rw

secure el1

scr_el3 (當secure el2 啟用的時候是 hcr_el2 )

el2scr_el3.rw

el3重置 el3時候設定的值

比如:

處於aarch32狀態的el0的程式時候如果監測到接下來要執行的指令(比如一些系統呼叫什麼的)是aarch64的,就會主動觸發異常,根據這個異常會切換到高許可權的el1(系統執行的層面),並將接下來需要執行的aarch64指令通過aarch64狀態執行,而這個el1層執行狀態是aarch64是由誰決定的呢?是由e2層的scr_el3.rw暫存器決定的。

並還遵循以下原則:

因此在armv8虛擬化的時候,64-bit 層可以執行 32-bit層的應用, 但反過來不行。

舉個例子乙個 64-bit 系統核心既可以用來執行 64-bit 程式也可以執行 32-bit 程式,而乙個 32-bit os 核心 只能執行 32-bit 程式。

參考:指令集手冊:

aarch64交叉編譯dfu programmer

這裡需要說明一下的是dfu programmer的編譯需要依賴於libusb 1.0庫,需要先交叉編譯usblib 1.0庫。cd root tar xvf libusb 1.0.23 tar.bz2 cd libusb 1.0.23 mkdir build configure host aarch...

aarch64下執行aarch32程式

能否在arm晶元的aarch64模式下執行aarch32的程式呢?f2e4fcbe37df253c60b2ac2de888558e9916dbdb,not stripped 32位arm檔案,有依賴的動態庫,還有乙個直譯器 lib ld 我們稍後再分析 needed libm.so.6 基礎包 ne...

aarch64彙編入門學習 1

藍芽耳機沒電,公司事務較為清閒,再不能看教程的情況下,計畫看下arm64的彙編 可以先寫乙個簡單的helloworld程式試驗一下。如果直接使用c語言,呼叫printf函式,勢必會鏈結c庫,那麼反彙編 將會比較複雜,不利於入門,於是計畫,是否可以直接使用組合語言,來寫個最簡單的程式,輸出hellow...