ARMv8-A QEMU運行OP-TEE/ATF環境搭建


關鍵詞:OP-TEE、ATF、xtest、Linux等等。

 

下面記錄通過ARMv8-A QEMU運行OP-TEE、ARM Trusted Firmware、Linux環境搭建過程。

1. 編譯環境准備

sudo apt-get install android-tools-adb android-tools-fastboot autoconf automake bc bison build-essential ccache cscope curl device-tree-compiler \ expect flex ftp-upload gdisk iasl libattr1-dev libcap-dev libfdt-dev libftdi-dev libglib2.0-dev libhidapi-dev libncurses5-dev \ libpixman-1-dev libssl-dev libtool make mtools netcat python-crypto python3-crypto python-pyelftools \ python3-pyelftools python-serial python3-serial rsync unzip uuid-dev xdg-utils xterm xz-utils zlib1g-dev

安裝pycryptodome:

pip install pycryptodome

2. 代碼下載

由於訪問github.com速度非常慢,並且連接不穩定。

所已經github.com相關倉庫,鏡像到gitee.com;並且手動下載toolchains;手動下載linaro-swg/linux.git。 

2.1 鏡像github.com相庫到gitee.com

repo init -u https://gitee.com/arnoldlu/manifest.git -m qemu_v8.xml --repo-url=git://codeaurora.org/tools/repo.git -b 3.6.0
repo sync -j4

修改manifest.xml:

sed -i "s/\.git//g" .repo/manifest.xml

2.2 下載linaro-swg/linux.git

https://hub.fastgit.org/linaro-swg/linux

選擇Download ZIP下載壓縮包。

2.3 創建Makefile軟鏈接

ln -s build/qemu_v8.xml build/Makefile

2.4 下載toolchains

通過下載工具可以加速工具鏈下載:

https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz

修改build/toolchains.mk,執行make toolchains。

diff --git a/toolchain.mk b/toolchain.mk
index 8bc4b16..fc36394 100644
--- a/toolchain.mk
+++ b/toolchain.mk
@@ -21,8 +21,6 @@ SRC_AARCH64_GCC               ?= https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3
 define dltc
        @if [ ! -d "$(1)" ]; then \
                mkdir -p $(1); \
-               echo "Downloading $(3) ..."; \
-               curl -s -L $(2) -o $(TOOLCHAIN_ROOT)/$(3).tar.xz; \
                tar xf $(TOOLCHAIN_ROOT)/$(3).tar.xz -C $(1) --strip-components=1; \
        fi
 endef

3. 編譯運行

在build目錄下編譯:

make -j8
或者
make -f qemu_v8.mk -j8

在build目錄下運行:

make run-only
make -f qemu_v8.mk run-only

 在shell中輸入“c”,可以看到彈出兩個shell,分別是安全的OP-TEE和非安全的Linux。

 

 在Linux終端中輸入root登錄,然后執行xtest進行OP-TEE測試。

 

4. 其他問題

在某些版本上生成optee鏡像腳本write_header_v1/write_header_v2的init_size參數為float,需要轉化成int:

project optee_os/
diff --git a/scripts/gen_hashed_bin.py b/scripts/gen_hashed_bin.py
index 32350a4..3788983 100755
--- a/scripts/gen_hashed_bin.py
+++ b/scripts/gen_hashed_bin.py
@@ -18,7 +18,7 @@ def write_header_v1(outf, init_size, args, paged_size):
        magic = 0x4554504f # 'OPTE'
        version = 1;
        outf.write(struct.pack('<IBBHIIIII', \
-               magic, version, arch_id[args.arch], args.flags, init_size, \
+               magic, version, arch_id[args.arch], args.flags, int(init_size), \
                args.init_load_addr_hi, args.init_load_addr_lo, \
                args.init_mem_usage, paged_size))
 
@@ -30,7 +30,7 @@ def write_header_v2(outf, init_size, args, paged_size):
                magic, version, arch_id[args.arch], args.flags, nb_images))
        outf.write(struct.pack('<IIII', \
                args.init_load_addr_hi, args.init_load_addr_lo, \
-               image_id['pager'], init_size))
+               image_id['pager'], int(init_size)))
        if nb_images == 2:
                outf.write(struct.pack('<IIII', \
                0xffffffff, 0xffffffff, image_id['paged'], paged_size))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM