本文作者:大伟
使用Docker部署TF-M开发环境(适用Windows/Mac/Linux)
Trusted Firmware M 是Arm开源的PSA(平台安全架构)参考实现.
TF-M的基础编译环境是基于Linux下的(Keil Pack除外)。在部署TF-M开发环境的过程中,非Linux用户(如Windows和Mac)面临着非常大的挑战。
如果你不喜欢按照官方的user guide在Windows下安装Cygwin环境,那么本文讲介绍基于Docker容器的TF-M开发环境快速部署。
容器同样适用于Mac或者Linux下。
什么是容器,Docker,与虚拟机什么区别
本文的重点并非介绍容器及虚拟化技术,相关的详细资料大家可以从网上搜索。
这里做一些简要的介绍便于大家快速理解容器:
容器(Container)技术相比虚拟机(Virtual Machine),其占用的系统空间更小,启动更快,更灵活。
容器
虚拟机
Docker是一个开发和发布基于容器技术的应用程序的开源平台。借助Docker,我们可以方便的分享容器镜像(Container Image)。本文介绍的镜像都保存在Docker Hub上。(更多Docker的资料参考什么是Docker)
在Windows下安装Docker
请参考Docker的官方文档安装最新的Docker Desktop。
安装程序下载链接(无需注册)
运行TF-M开发环境的Container
安装好Docker以后,运行TF-M开发环境非常简单。
打开Windows的命令行或者PowerShell,运行(第一次)docker run --name <name> --interactive --tty davidwang2015/tfm-env:TF-Mv1.0-RC3
其中name参数可以给运行的容器起一个名字,以便后续再次启动该容器。
这里运行的容器镜像保存在Docker Hub上的davidwang2015/tfm-env,使用tag:TF-Mv1.0-RC3。这个tag的镜像是基于Ubuntu 18.04,安装了所有TF-M编译所需要的环境,工具链和依赖软件。默认安装了GNU和Arm Compiler(需手动配置License)工具链。
TF-M的版本是基于TF-M tag:TF-Mv1.0-RC3。所有的源代码都在/tfm
目录下。
运行该命令后,会以交互(interactive)的方式启动容器,并且当前Windows命令行会变成Container的命令行。即,如同打开了Ubuntu 18.04的命令行界面。这时可以进入/tfm
目录去编译TF-M,如同在Linux主机下一样。
如果需要退出开发环境,可以在容器命令行下输入exit
。
下次,如果想再启动该容器,再Windows命令行下输入:docker start -i <name>
这里<name>应当与上面第一次运行容器时使用的<name>相同。
注意:请参考Docker的帮助文档来管理容器暂存的内容,以免在容器中的修改丢失
在容器中编译TF-M
如上节介绍,该容器镜像自带TF-M的源文件(tag:TF-Mv1.0-RC3)和依赖库文件。
按照TF-M的user guide编译项目,比如:
cd /tfm/trusted-firmware-m;
mkdir build; cd build
cmake -G"Unix Makefiles" -DPROJ_CONFIG=`readlink -f ../configs/ConfigRegression.cmake` -DTARGET_PLATFORM=AN521 -DCOMPILER=GNUARM ../
cmake --build ./ -- install -j8
怎么把编译生成的文件拷贝到Windows主机(主机与容器文件共享)
在开发过程中,我们需要主机与容器共享文件
- 使用主机(Windows)上的IDE或者文本编辑器来浏览修改源码
- 将编译好的文件拷贝到主机,用于后续处理及发布
对于第一种需求,请参考这篇文章 - 容器内的TF-M进阶-Windows下共享文件夹
对于第二种需求,只是简单的从容器拷贝文件到主机(比如把TF-M编译好的install目录拷贝到主机c:\temp下),可以使用命令docker cp <name>:/tfm/trusted-firmware-m/build/install c:\temp\
使用和上面运行docker时相同的容器name。
可以使用同样的命令从主机拷贝文件到容器,只需要在docker cp
命令中交换源地址和目标地址
Docker镜像的维护
目前的Docker镜像是基于Ubuntu官方18.04上,安装TF-M依赖文件而生成的。
Docker镜像维护在Docker Hub上 - 链接
目前镜像的tag与TF-M的tag保持一致,即镜像tag:TF-Mv1.0-RC3搭建的环境是可以编译TF-M tag:TF-Mv1.0-RC3的。
后续会针对每一个TF-M的tag或者某些重要的版本(因为TF-M的tag比较少)来制作Docker镜像。Docker镜像的制作脚本会托管在Github用来自动生成Docker镜像。
开发者使用最近的一个Docker镜像开发即可,在进入TF-M文件夹后,手动git pull最新的代码或者checkout自己想要的某个版本。
【本文仅代表个人观点和立场,与所属公司无关。文中材料全部来自网上公开信息。】
【Disclaimer: This article represents personal views and perspectives only, and has nothing to do with the company the authors belong to. All the information in this article are from the public available materials on the Internet.】