欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

4. OP-TEE+qemu的编译--bios.bin镜像的编译

程序员文章站 2022-07-13 16:12:05
...

    历经一年多时间的系统整理合补充,《手机安全和可信应用开发指南:TrustZone与OP-TEE技术详解 》一书得以出版,书中详细介绍了TEE以及系统安全中的所有内容,全书按照从硬件到软件,从用户空间到内核空间的顺序对TEE技术详细阐述,读者可从用户空间到TEE内核一步一步了解系统安全的所有内容,同时书中也提供了相关的示例代码,读者可根据自身实际需求开发TA。目前该书已在天猫、京东、当当同步上线,链接如下(麻烦书友购书时能给予评论,多谢多谢)

京东购买地址

当当购买地址

天猫购买地址

非常感谢在此期间大家的支持以及各位友人的支持和帮助!!!。

若觉得书中内容有错误的地方,欢迎大家指出,私信或者在博文中留言联系方式亦可发邮件至:aaa@qq.com,多谢各位了!!!!我会第一时间处理

  

bios.bin镜像是启动的时候会被使用到的主要image,在编译目标run-only中,最终借助qemu-system-arm命令来启动OP-TEE和linux kern,以及挂载rootfs,在运行该命令时,其中有一个参数为"-bios",该参数就是告诉qemu使用其后所带的bios.bin来启动。

  bios.bin中会包含linux kernel image, OP-TEE OS的image以及rootfs。该镜像文件是在bios-qemu的目标中被编译出来的,该编译目标如下,定义在build/Makefile文件中:

4. OP-TEE+qemu的编译--bios.bin镜像的编译

  当该目标依赖的update_rootfs和optee-os编译完成之后,会调用定义在qemu,mk文件中的bios-qemu-common函数来执行bios.bin镜像文件的编译和生成,该函数的定义如下:

 

################################################################################
# QEMU
################################################################################
define bios-qemu-common
	+$(MAKE) -C $(BIOS_QEMU_PATH) \
		CROSS_COMPILE=$(CROSS_COMPILE_NS_USER) \
		O=$(ROOT)/out/bios-qemu \
		BIOS_NSEC_BLOB=$(LINUX_PATH)/arch/arm/boot/zImage \
		BIOS_NSEC_ROOTFS=$(GEN_ROOTFS_PATH)/filesystem.cpio.gz \
		BIOS_SECURE_BLOB=$(OPTEE_OS_BIN) \
		PLATFORM_FLAVOR=virt
endef

  执行该函数时会编译有变量BIOS_QEMU_PATH定义的目录,该函数执行的时候会执行makeBIOS_QEMU_PATH定义的目录,并带入相关的编译参数,参数说明如下:

 

CROSS_COMPILE:编译时使用的编译参数,包括编译器,cflag等

O:编译结果的输出目录

BIO_NSEC_BLOB:定义该变量,指定linux kernel image的名称和路径

BIOS_NSEC_ROOTFS:定义该变量,指定生成的rootfs存在的目录和cpio格式文件名

BIOS_SECURE_BLOB:定义该变量,指定OP-TEE OS镜像文件名

PLATFORM_FLAVOR:定义该变量,设定平台变量

  在使用qemu+OP-TEE方式运行时,BIOS_QEMU_PATH的值为bios_qemu_tz_arm。也即是在此情况下是去编译bios_qemu_tz_arm目录,进入该目录,找到Makefile文件,并找到对应的all目标,然后进行编译。

通过在Makefile中include各种.mk文件,完全展开之后,真正的all目标实体被定义在bios_qemu_tz_arm/bios/link.mk文件中,具体内容如下:

4. OP-TEE+qemu的编译--bios.bin镜像的编译

bios_qemu_tz_arm目录中makefile的all目标的整体依赖关系如下:

4. OP-TEE+qemu的编译--bios.bin镜像的编译
从上图的目标依赖关系可以看到, 在make指令中设定的几个变量都被使用到了,编译的时候,linux kernel image, OP-TEE os image, rootfs都会被转换成.o文件,然后再和其他的.o文件(main.o, entry.o等)一起连接成bios.bin文件。

linux kernel image将会被放在bios.bin中名称为nsec_blob的section中

OP-TEE os image将会被放在bios.bin中名称为secure_blob的section中

rootfs image将会被放在bios.bin中名称为nsec_rootfs的section中

上述将image转换成.o文件的动作是通过OBJCOPY带--rename-section参数来实现的,具体的内容可以link.mk文件中找到bios_qemu_tz_arm/bios/entry.s文件存放的就是在启动的时候bios.bin的入口文件