Trustzone OP-TEE 在QEMU平台上的编译、运行与测试

一.OP-TEE介绍
TEE背后的基本思想就是将和安全服务提取到独立的安全环境中去运行,当主系统有安全相关的操作时,通过发动请求到安全环境获取系统预定义的服务。基于此OP-TEE可以分为三个部分,TEE客户端和用来和安全环境通讯的TEE驱动,这2个部分都运行在主系统(Android/Linux…),运行在安全环境中的TEE OS以及在上面的安全应用,具体参见下图。
Trustzone OP-TEE 在QEMU平台上的编译、运行与测试_第1张图片
引用于ARM中文社区
二.前期准备:
1. 安装相应软件包,命令如下:

$ sudo apt-get install android-tools-fastboot autoconf bison cscope curl \
               flex gdisk libc6:i386 libfdt-dev libglib2.0-dev \
               libpixman-1-dev libstdc++6:i386 libz1:i386 netcat \
               python-crypto python-serial uuid-dev xz-utils zlib1g-dev

笔者使用的UBUNTU14.04版本下,所有软件包成功安装,在UBUNTU14.03版本下,存在两个软件包无法安装,在网上进行搜索,安装相应软件包比较简单,就不再累述解决办法了。这些软件包用于OPTEE_OS的设备启动和OPTEE的编译过程等,如果未能安装,在编译过程中会检查出来,并报错。
2. 下载代码
OP-TEE工程代码通过repo进行下载,需运行如下命令:

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

安装repo,并对repo进行初始化。
初始化完成后,运行命令:

$ mkdir -p $HOME/devel/optee
$ cd $HOME/devel/optee
$ repo init -u https://github.com/OP-TEE/manifest.git -m ${TARGET}.xml [-b ${BRANCH}]
$ repo sync

其中TARGET表示下载的工程类型,有两种选择:default(现在正在开发的版本),default_stable(已经稳定下来的版本)。BRANCH为可选项,现在只有一种选择,即master,若不写,默认为master。
资料显示,存在一部分情况无法使用如上方法进行下载,解决办法如下:

repo init -u https://github.com/OP-TEE/manifest.git -m default.xml --repo-url=git://codeaurora.org/tools/repo.git

注意需替换.repo目录下的manifest.xml的所有.git为空后运行repo sync。
3. 下载交叉编译器
将源码下载下来后,在/optee/build路径下,运行如下命令:

make toolchains

生成toolchains文件夹进行交叉编译器的下载和解压。
若下载时多次出错或无法下载,可以在生成toolchains文件夹下运行如下命令:

wget http://releases.linaro.org/14.08/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux.tar.xz
wget http://releases.linaro.org/14.08/components/toolchain/binaries/gcc-linaro-aarch64-linux-gnu-4.9-2014.08_linux.tar.xz
wget http://releases.linaro.org/14.07/components/toolchain/binaries/gcc-linaro-aarch64-none-elf-4.9-2014.07_linux.tar.xz

然后不要忘记cd到/build路径运行:

$ make toolchains

对下载好的交叉编译器压缩包进行解压和路径设置。
三. 编译和运行
1. 编译过程及错误处理
cd 到/build路径下,运行命令:

$ make all run

若出现如下错误:

Sed Error : sed: -e expression #1, char 51: unknown option to `s'

出错原因是/devel/optee/gen_rootfs路径下的generate-cpio-rootfs.sh配置文件中的第218行的sed命令语法错误,更改方法如下:

-sed -i -e "s/CONFIG_EXTRA_CFLAGS=\"\"/CONFIG_EXTRA_CFLAGS=\"${CFLAGS}\"/g" ${BUILDDIR}/.config
+sed -i -e "s|CONFIG_EXTRA_CFLAGS=\"\"|CONFIG_EXTRA_CFLAGS=\"${CFLAGS}\"|g" ${BUILDDIR}/.config

如果未解决此问题而重新编译,会出现如下错误:

/bin': No such file or directory make: *** [busybox-common] Error 1

解决此问题后,使用make all-clean 命令清理编译文件,进行重新编译
如果在第二部分的软件包存在未安装的情况,则在编译阶段检查并报错。
2. 运行效果
UBUNTU14.04的命令行进入qemu命令行模式,生成两个命令行窗口,分别是Normal World 和 Secure World。效果如下:
Normal World:
Trustzone OP-TEE 在QEMU平台上的编译、运行与测试_第2张图片
Secure World:
Trustzone OP-TEE 在QEMU平台上的编译、运行与测试_第3张图片

在qemu命令行界面下输入C,然后回车,启动rich os(linux os)和optee_os,效果图如下:
rich os:
Trustzone OP-TEE 在QEMU平台上的编译、运行与测试_第4张图片
optee_os:
Trustzone OP-TEE 在QEMU平台上的编译、运行与测试_第5张图片
如果成功显示如上效果,表示已经成功完成编译与启动。
四. 测试
在进行测试之前我们需要安装一个软件包ccach,命令如下:

$ sudo apt-get install ccache

这个软件包主要是用来缓存编译文件,使得下一次编译得以更快编译。
在已经启动的Normal World 命令行内输入如下命令进行测试:

modprobe optee_armtz
sleep 0.1
tee-supplicant&
sleep 0.1
xtest

如果出现驱动optee_armtz未找到,需要切换到lib/modules/xxx/路径下,运行加载驱动的命令,xxx为你下载的linux内核版本,若出现如下情况表示加载成功:

然后运行服务tee-supplicant,效果如下:

最后运行xtest,效果如下:
Normal World:
Trustzone OP-TEE 在QEMU平台上的编译、运行与测试_第6张图片
Secure World:
Trustzone OP-TEE 在QEMU平台上的编译、运行与测试_第7张图片
出现此效果表示测试成功。
五. 后记
如上OP-TEE已经成功的在QEMU平台上编译、运行和测试了,笔者将会继续推进,将OP-TEE运行在FVP模拟器以及使用DS-5对TRUSTZONE进行自定义的SECURE APPLICATION的开发。

你可能感兴趣的:(Trustzone)