• 基于Ubuntu20.04运行OP-TEE_3.17.0_QEMU_V8的环境搭建


    最近在开始研究ARM TrustZone安全相关的东西。在QEMU上运行ArmV8-A OP-TEE是个非常好的工程熟悉这块内容。下面教大家如何搭建这套工程环境。

    安装Ubuntu

    先安装一下Virtualbox+Ubuntu20.04,可以参考[How TO]-图解virtualbox下安装ubuntu20.04虚拟机

    安装Ubuntu基础工具

    sudo apt-get install samba smbclient git make expect vim net-tools python3-pip python2.7 binfmt-support qemu qemu-user-static openssl

    注意安装python2.7后,需要创建一个软链接。

    1. cd /usr/bin/
    2. sudo ln -sf python2.7 python

    安装http服务

    1. sudo apt-get install apache2
    2. sudo /etc/init.d/apache2 restart

    安装repo

    1. git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
    2. cd git-repo/
    3. cp repo ~/bin/
    4. chmod a+x ~/bin/repo

    配置github SSH Key

    1. ssh-keygen -t rsa -C "weitao.zhu@aliyun.com"
    2. cat ~/.ssh/id_rsa.pub

    选择github账号的settings -> SSH and GPG keys -> New SSH key。将id_rsa.pub中内容拷贝到Key中,点击 Add SSH key。

     

    配置git

    1. git config --global user.email "weitao.zhu@aliyun.com"
    2. git config --global user.name "Weston.Zhu"

    安装OP-TEE

    1. 安装编译OP-TEE的工具

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

    2. 更新对应QEMU V8的optee代码

    1. $ repo init -u git@github.com:OP-TEE/manifest.git -m qemu_v8.xml --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -b 3.17.0
    2. Downloading Repo source from https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
    3. remote: Enumerating objects: 7372, done.
    4. remote: Counting objects: 100% (7372/7372), done.
    5. remote: Compressing objects: 100% (3935/3935), done.
    6. remote: Total 7372 (delta 4764), reused 5577 (delta 3363)
    7. Receiving objects: 100% (7372/7372), 3.28 MiB | 4.17 MiB/s, done.
    8. Resolving deltas: 100% (4764/4764), done.
    9. Downloading manifest from git@github.com:OP-TEE/manifest.git
    10. remote: Enumerating objects: 1411, done.
    11. remote: Counting objects: 100% (241/241), done.
    12. remote: Compressing objects: 100% (80/80), done.
    13. remote: Total 1411 (delta 184), reused 177 (delta 161), pack-reused 1170
    14. Your identity is: Weston.Zhu <weitao.zhu@aliyun.com>
    15. If you want to change this, please re-run 'repo init' with --config-name
    16. repo has been initialized in /home/weston/workspace/optee-3.17/
    17. If this is not the directory in which you want to initialize repo, please run:
    18.   rm -r /home/weston/workspace/optee-3.17//.repo
    19. and try again.

    3. 用repo拖取代码

    由于repo拉取ATF v2.6与edk2比较慢,改成手动拉取。先将 ./.repo/manifests/目录中的qemu_v8.xml的文件修改如下:

    1. --- a/qemu_v8.xml
    2. +++ b/qemu_v8.xml
    3. @@ -20,10 +20,10 @@
    4.         <!-- Misc gits -->
    5.         <project path="buildroot"           name="buildroot/buildroot.git"               revision="refs/tags/2021.11" clone-depth="1" />
    6. -       <project path="edk2"                 name="tianocore/edk2.git"                   revision="refs/tags/edk2-stable202202" sync-s="true" />
    7. +       <!-- project path="edk2"                 name="tianocore/edk2.git"                   revision="refs/tags/edk2-stable202202" sync-s="true" />-->
    8.         <project path="mbedtls"             name="Mbed-TLS/mbedtls.git"                   revision="refs/tags/mbedtls-2.26.0" clone-depth="1" />
    9.         <project path="optee_rust"           name="apache/incubator-teaclave-trustzone-sdk.git"           revision="3272b38b013395e3376a38af6315633239d26c1c" />
    10.         <project path="qemu"                 name="qemu/qemu.git"                         revision="refs/tags/v7.0.0" clone-depth="1" />
    11. -       <project path="trusted-firmware-a"   name="TF-A/trusted-firmware-a.git"           revision="refs/tags/v2.6" clone-depth="1" remote="tfo" />
    12. +       <!-- project path="trusted-firmware-a"   name="TF-A/trusted-firmware-a.git"           revision="refs/tags/v2.6" clone-depth="1" remote="tfo" />-->
    13.         <project path="u-boot"               name="u-boot.git"                           revision="refs/tags/v2021.04" remote="u-boot" clone-depth="1" />
    14. </manifest>

    用repo自动拉取ATF v2.6与edk2之外其他的代码

    $ repo sync -j8

    手动拉取ATF v2.6代码

    git clone  --branch v2.6 https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git

    手动拉取edk2代码

    1. git clone  --branch edk2-stable202105 git://github.com/tianocore/edk2.git
    2. cd edk2/
    3. git submodule sync
    4. git submodule update --init

    4. 下载arm gcc交叉编译工具

    1. cd build
    2. make -f toolchain.mk toolchains

    或者直接用wget下载gnu-a gcc交叉编译工具 gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xzgcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz 并拷贝到toolchains目录下。

    1. mkdir toolchains
    2. cd toolchains
    3. wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz
    4. wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
    5. mkdir aarch32
    6. mkdir aarch64
    7. tar xf gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz -C aarch32 --strip-components=1
    8. tar xf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz -C aarch64 --strip-components=1
    9. cd aarch32/bin
    10. for f in $(ls);do ln -s $f ${f//-none};done;
    11. cd -
    12. cd aarch64/bin
    13. for f in $(ls);do ln -s $f ${f//-none};done;
    14. cd -

    5. 编译

    修改EDK2替换成U-Boot启动

    1. diff --git a/qemu_v8.mk b/qemu_v8.mk
    2. index c98e460..72860b2 100644
    3. --- a/qemu_v8.mk
    4. +++ b/qemu_v8.mk
    5. @@ -11,7 +11,7 @@ COMPILE_S_KERNEL ?= 64
    6. ################################################################################
    7. # If you change this, you MUST run `make arm-tf-clean` first before rebuilding
    8. ################################################################################
    9. -TF_A_TRUSTED_BOARD_BOOT ?= n
    10. +TF_A_TRUSTED_BOARD_BOOT ?= y
    11. BR2_ROOTFS_OVERLAY = $(ROOT)/build/br-ext/board/qemu/overlay
    12. BR2_ROOTFS_POST_BUILD_SCRIPT = $(ROOT)/build/br-ext/board/qemu/post-build.sh
    13. @@ -35,7 +35,7 @@ include common.mk
    14. DEBUG ?= 1
    15. # Option to use U-Boot in the boot flow instead of EDK2
    16. -UBOOT ?= n
    17. +UBOOT ?= y
    18. # Option to build with GICV3 enabled
    19. GICV3 ?= y
    20. @@ -146,7 +146,7 @@ TF_A_EXPORTS ?= \
    21. TF_A_DEBUG ?= $(DEBUG)
    22. ifeq ($(TF_A_DEBUG),0)
    23. -TF_A_LOGLVL ?= 30
    24. +TF_A_LOGLVL ?= 40
    25. TF_A_OUT = $(TF_A_PATH)/build/qemu/release
    26. else
    27. TF_A_LOGLVL ?= 50
    28. @@ -423,9 +423,9 @@ QEMU_VIRT   = true
    29. QEMU_XEN       ?= -drive if=none,file=$(XEN_EXT4),format=raw,id=hd1 \
    30.                   -device virtio-blk-device,drive=hd1
    31. else
    32. -QEMU_CPU       ?= max,sve=off
    33. -QEMU_SMP       ?= 2
    34. -QEMU_MEM       ?= 1057
    35. +QEMU_CPU       ?= cortex-a53
    36. +QEMU_SMP       ?= 4
    37. +QEMU_MEM       ?= 2048
    38. QEMU_VIRT     = false
    39. endif

    开始编译

    make -f qemu_v8.mk all -j8

    6. 运行

    make -f qemu_v8.mk run-only

    敲完命令运行后,记得继续按c然后按回车健。

    接下来会弹出两个窗口,一个是CA(Linux)窗口,一个是TA(OP-TEE)窗口。

     

     

  • 相关阅读:
    『力扣刷题本』:轮转数组
    qt+opengl 三维坐标系(三)
    react 项目搭建步骤
    在CentOS中开启mysql服务
    全连接网络参数Xavier初始化
    从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(十)sentinel篇(2): sentinel 流控规则及使用详解
    智能合约中授权与转账的分离可行性分析
    ant.design 的 Pro Component 的 ProTable 清除表单内容的方法
    Datart 扩装下载功能之PDF和图片下载
    Linux:2. gcc、gdb、yum
  • 原文地址:https://blog.csdn.net/zhuwade/article/details/125513873