關鍵詞: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))