本文作者:Ken Liu
TF-M快速上手-构建和运行
在之前的文章中,我们大概介绍了一下TF-M诞生的背景和它的主要结构,在进行实现细节的探寻之前
,让我们直接从实际的运行入手,看一下TF-M运行起来是什么样子。
环境搭建
根据TF-M源代码中的'Software Requirements'文档,可以得知构建TF-M所需要的组件。在这篇
文章里我们用git bash + gnuarm为例子看一下如何构建TF-M。之所以选这样的一个组合,一是
因为这些工具都是开源容易获取,二是轻量级,在windows下也能操作而不需要装linux.
首先需要安装的软件组件:
- git for windows (包括git bash的安装)
- gnuarm compiler (注意一定要装文档中支持的版本,目前是6.3,7.3和8.3。https://developer.arm.com/too...
- cmake (可以下载安装包或者使用pip安装)
- make (git bash下能工作的版本可以在这里找到:https://sourceforge.net/proje...
- python3 (装新一点吧,3.6以上比较推荐)
- pycryptodome (加解密组件,另一个组件pycrypto在windows下不能工作)
- pyasn1
- pyyaml
- jinja2
所有的python组件都可以使用pip来安装。
获取代码
获取代码之前请确认你的环境中git-lfs支持已经添加,在git bash中输入'git-lfs'可以知道是否
支持。如果没有支持请安装一下,因为CMSIS_5最新版需要使用git-lfs来抓取库文件。
新建一个目录用来放置获取的代码,运行以下命令来获取代码:
cd <folder_created>
git clone https://git.trustedfirmware.org/trusted-firmware-m.git
git clone https://github.com/ARMmbed/mbedtls.git -b mbedtls-2.7.9
git clone https://github.com/ARMmbed/mbed-crypto.git -b mbedcrypto-1.1.0
git clone https://github.com/ARM-software/CMSIS_5.git -b 5.5.0
构建
当所有的代码都获取成功以后,在trusted-firmware-m目录下新建一个目录用来放置构建的中间
文件和结果,这里我们创建一个'build'目录,并且以AN521为目标平台来构建一个目标镜像:
mkdir build
cd build
cmake -G"Unix Makefiles" -DPROJ_CONFIG=`readlink -f ../configs/ConfigRegressionIPC.cmake` -DTARGET_PLATFORM=AN521 -DBL2=False -DCOMPILER=GNUARM ../
cmake --build ./ -- install
构建完成以后,结果会出现在build下。在我们这次的构建中,由于没有引入BL2,secure
irmware的文件存放于build/unit_test/下,NS的镜像存放于build/app下。最终这些文件会也会
被拷贝一份到install目录里。
提示:
如果错过了git-lfs的检查而拉取了CMSIS_5的代码,可能会在编译过程中出现以下错误:
Fatal error: L6007U: Could not recognize the format of file CMSIS_5/CMSIS/RTOS2/RTX/Library/ARM/RTX_V8MMN.lib.
遇到这种情况首先确认安装了带有git-lfs的git版本,然后可以通过以下命令解决这个问题:
cd CMSIS_5 && git-lfs pull
运行
AN521镜像可以在MPS2的FPGA上运行。如果购买了DS5的套件,则在5.27以后的版本里可以使用软件
模拟硬件执行。当然也可以在Qemu上运行,需要安装Qemu 4.0的版本。这里我们使用Qemu来实验。
首先需要安装Qemu 4.0版本,上官网下载安装即可,开源软件获取比较方便。
运行以下命令来运行镜像:
qemu-system-arm -M mps2-an521 -kernel "unit_test/tfm_s.axf" -device loader,file="install/outputs/fvp/tfm_ns.bin",addr=0x00100000 -serial stdio -display none
运行结果参见附录。
注释:BL2里的得到当前运行程序的核的代码在Qemu中可能会导致异常,所以在这次构建过程中我们
没有引入BL2组件。
总结
在这一章我们通过快速的构建一个可以运行的镜像,了解了TF-M是如何构建和执行的,对TF-M有了
一个直观的认识。在后续的文章中我们会深入介绍TF-M的细节,以及如何与其进行整合。
附录
测试log:
$ qemu-system-arm -M mps2-an521 -kernel "unit_test/tfm_s.axf" -device loader,file="install/outputs/fvp/tfm_ns.bin",addr=0x00100000 -serial stdio -display none
[Sec Thread] Secure image initializing!
TFM level is: 1
[Sec Thread] Jumping to non-secure code...
#### Execute test suites for the Secure area ####
Running Test Suite PSA protected storage S interface tests (TFM_SST_TEST_2XXX)...
> Executing 'TFM_SST_TEST_2001'
Description: 'Set interface'
TEST PASSED!
> Executing 'TFM_SST_TEST_2002'
......
Skip repeating logs
......
*** Non-secure test suites summary ***
Test suite 'PSA protected storage NS interface tests (TFM_SST_TEST_1XXX)' has PASSED
Test suite 'Crypto non-secure interface test (TFM_CRYPTO_TEST_6XXX)' has PASSED
Test suite 'Initial Attestation Service non-secure interface tests(TFM_ATTEST_TEST_2XXX)' has PASSED
Test suite 'QCBOR regression test(TFM_QCBOR_TEST_7XXX)' has PASSED
Test suite 'Invert non-secure interface tests (TFM_INVERT_TEST_1XXX)' has PASSED
Test suite 'Core non-secure positive tests (TFM_CORE_TEST_1XXX)' has PASSED
Test suite 'IPC non-secure interface test (TFM_IPC_TEST_1XXX)' has PASSED
*** End of Non-secure test suites ***