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))
原文地址:https://www.cnblogs.com/arnoldlu/p/14245834.html