类似的文章看到
https://blog.csdn.net/shuaifengyun/article/details/71499619得到很大的启发。一步一步跟着作者去运行OP-TEE,也确实成功了。
但是,因为随着github.com代码的更新,导致我做了一大堆的额外的动作。把代码库各个代码返回到2017年5月底。
这个现在不是重点,重点是我基于原作者,发现了不需要额外的动作,利用最新(2018/06/23)代码库,成功运行了ARMv8的OP-TEE。
特此记录下过程。赠人玫瑰,手有余香。
第一步,准备开发环境并安装开发工具:
使用如下指令安装搭建时需要的工具和库:
$ 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
第二步,下载OP-TEE的源代码
在系统中创建存放OP-TEE的目录,并建立初始化repo,指令操作如下:
$ mkdir opentee.v8 //创建目录
$ cd opentee.v8 //切换到创建的目录
$ repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml --repo-url=git://codeaurora.org/tools/repo.git
$ sed -i “s/.git//g” .repo/manifest.xml //解决repo sync错误的方法,将manifest.xml文件中的所有的.git都删除
//初始化repo,
$repo sync -j22 //开始获取OP-TEE源代码
第三步, 获取 toolchain
$ cd build
$ make -f toolchain.mk toolchains
这一步,会下载工具链。所以需要一直保证网络畅通
第四步,开始编译使用qemu运行OP-TEE的工程
准备好toolchain和source code之后,下一步就是编译工程,具体操作如下:
$ cd build //切换到build目录
$ make -f qemu_v8.mk all //编译工程 (注意到这里不是qemu.mk. 这个是以前的旧文件,是ARMv7的)
第五步, 启动qemu
$cd build //切换到build目录
$make -f qemu_v8.mk run-only //启动qemu v8并运行OP-TEE
第六步, 运行OP-TEE和linux
在qemu界面中输入字母“c”回车之后,就会启动两个terminal,一个是OP-TEE的terminal,端口号是54321,另外一个是linux的terminal。端口号是54320
第七步, 启动运行qemu
1)qemu的console
opentee.v8/build$ make -f qemu_v8.mk run-only
- QEMU is now waiting to start the execution … cd /data/kernel/opentee.v8/build/…/arm-trusted-firmware/build/qemu/release
&&
/data/kernel/opentee.v8/build/…/qemu/aarch64-softmmu/qemu-system-aarch64
-nographic
-serial tcp:localhost:54320 -serial tcp:localhost:54321
-smp 1
-machine virt,secure=on -cpu cortex-a57 -m 1057 -bios /data/kernel/opentee.v8/build/…/arm-trusted-firmware/build/qemu/release/bl1.bin
-s -S -semihosting-config enable,target=native -d unimp
-initrd /data/kernel/opentee.v8/build/…/out-br/images/rootfs.cpio.gz
-kernel /data/kernel/opentee.v8/build/…/linux/arch/arm64/boot/Image -no-acpi
-append ‘console=ttyAMA0,38400 keep_bootcon root=/dev/vda2’ \QEMU 2.12.0 monitor - type ‘help’ for more information (qemu)
2) 端口号54320的打印
listening on port 54320
soc_term: accepted fd 4
soc_term: read fd EOF
soc_term: accepted fd 4
3)端口号54321打印
listening on port 54321
soc_term: accepted fd 4
soc_term: read fd EOF
soc_term: accepted fd 4
在qemu的console里敲c,(小写)让系统继续运行
4)端口号54321的打印 (删除一些不重要的部分)
D/TC:0 add_phys_mem:521 TEE_SHMEM_START type NSEC_SHM 0x42000000 size 0x00200000
D/TC:0 add_phys_mem:521 TA_RAM_START type TA_RAM 0x0e400000 size 0x00c00000
D/TC:0 add_phys_mem:521 VCORE_UNPG_RW_PA type TEE_RAM_RW 0x0e149000 size 0x001b7000
…
D/TC:0 tee_ta_register_ta_store:534 Registering TA store: ‘REE’ (priority 10)
D/TC:0 tee_ta_register_ta_store:534 Registering TA store: ‘Secure Storage TA’ (priority 9)
D/TC:0 mobj_mapped_shm_init:559 Shared memory address range: f000000, 11000000
I/TC: Initialized
D/TC:0 init_primary_helper:917 Primary CPU switching to normal world boot
I/TC: Dynamic shared memory is enabled
5)端口号54320的打印 (删除一些不重要的部分)
listening on port 54320
soc_term: accepted fd 4
soc_term: read fd EOF
soc_term: accepted fd 4
mmap:
VA:0 PA:0x0 size:0x4000 attr:0x2 granularity:0x40000000
…
[ 1.864859] ALSA device list:
[ 1.865094] No soundcards found.
[ 1.867994] uart-pl011 9000000.pl011: no DMA platform data
[ 1.949458] Freeing unused kernel memory: 1088K
Starting logging: OK
Initializing random number generator… [ 2.638346] random: dd: uninitialized urandom read (512 bytes read)
done.
Starting tee-supplicant…
Starting network: OK
Welcome to Buildroot, type root to login
buildroot login:
第八步, 运行hello_world
在端口54320敲用户名root回车
再敲hello_world命令,启动hello_world
在端口54320里的打印
buildroot login: root
hello_world
Invoking TA to increment 42
TA incremented value to 43
在端口54321里的打印:
D/TC:0 core_mmu_entry_to_finer_grained:631 xlat tables used 4 / 5
D/TC:0 tee_ta_init_pseudo_ta_session:274 Lookup pseudo TA 8aaaf200-2450-11e4-abe2-0002a5d5c51b
D/TC:0 load_elf:842 Lookup user TA ELF 8aaaf200-2450-11e4-abe2-0002a5d5c51b (Secure Storage TA)
D/TC:0 load_elf:842 Lookup user TA ELF 8aaaf200-2450-11e4-abe2-0002a5d5c51b (REE)
D/TC:0 load_elf_from_store:810 ELF load address 0x40005000
D/TC:0 tee_ta_init_user_ta_session:1019 Processing relocations in 8aaaf200-2450-11e4-abe2-0002a5d5c51b
D/TA: TA_CreateEntryPoint:39 has been called
D/TA: TA_OpenSessionEntryPoint:68 has been called
I/TA: Hello World!
D/TA: inc_value:105 has been called
I/TA: Got value: 42 from NW
I/TA: Increase value to: 43
D/TC:0 tee_ta_close_session:380 tee_ta_close_session(0xe169c70)
D/TC:0 tee_ta_close_session:399 Destroy session
I/TA: Goodbye!
D/TA: TA_DestroyEntryPoint:50 has been called
D/TC:0 tee_ta_close_session:425 Destroy TA ctx
至此,编译并且完整的运行了qemu v8的系统。
上图了
参见 https://blog.csdn.net/shuaifengyun/article/details/71517567,方法类似。
后记,仍然运行Arm v7以前旧的系统,如何返回到2017.05底的方法
上传一个文件,文件名qemu_v7.log
看文件里头的内容。
https://download.csdn.net/download/dddddttttt/10496488可以下载到
吸取教训,这里记录下目前ArmV8的版本commit id. 避免万一以后github更新导致无法运行
(在下面内容里头搜索revision,就知道commit id了)
/data/kernel/opentee.v8/.repo$ cat manifest.xml
<?xml version=“1.0” encoding=“UTF-8”?>
<manifest>
<remote name=“github” fetch=“https://github.com” />
<default remote=“github” revision=“master” />
<!-- OP-TEE gits -->
<project path=“optee_client” name=“OP-TEE/optee_client” />
<project path=“optee_os” name=“OP-TEE/optee_os” />
<project path=“optee_test” name=“OP-TEE/optee_test” />
<project path=“build” name=“OP-TEE/build”>
<linkfile src=“qemu_v8.mk” dest=“build/Makefile” />
<linkfile src="…/toolchains/aarch64/bin/aarch64-linux-gnu-gdb" dest=“build/gdb” />
</project>
<!-- linaro-swg gits -->
<project path=“linux” name=“linaro-swg/linux” revision=“6e954e2f2cbd412f7bc874bb9145f69713194e52” />
<project path=“optee_benchmark” name=“linaro-swg/optee_benchmark”/>
<project path=“optee_examples” name=“linaro-swg/optee_examples” />
<project path=“soc_term” name=“linaro-swg/soc_term” revision=“5493a6e7c264536f5ca63fe7511e5eed991e4f20” />
<!-- Misc gits -->
<project path=“arm-trusted-firmware” name=“ARM-software/arm-trusted-firmware” revision=“refs/tags/v1.5-rc2” clone-depth=“1” />
<project path=“edk2” name=“tianocore/edk2” revision=“1ea08a3dcdd61c7481ec78ad8b8037ee6ca45402” />
<project path=“qemu” name=“qemu/qemu” revision=“refs/tags/v2.12.0” clone-depth=“1” />
<project path=“buildroot” name=“buildroot/buildroot” revision=“62dca337fe72085d98b7603cfcff1279c48ba7d9” />
</manifest>