使用Qemu运行ARMv8的OP-TEE

类似的文章看到

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的系统。


上图了

使用Qemu运行ARMv8的OP-TEE_第1张图片

下一步,可以自己去加一个TA和CA。
参见 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 


        
        
        
        
        
        
        
                
                
        
        
        
        
        
        
        
        
        
        
        



你可能感兴趣的:(OPTEE)