8.OP-TEE+qemu的启动过程分析--启动linux kernel

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

京东购买地址

当当购买地址

天猫购买地址

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

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

 

在bios_qemu_tz_arm/bios/entry.s文件中,当执行完OP-TEE OS的启动之后,会调用main_init_ns函数来完成linux kernel的启动,该函数的主要内容和相关注释如下:

 

void main_init_ns(void)
{
	call_kernel(kernel_entry, dtb_addr, rootfs_start, rootfs_end);
}

该函数将直接调用call_kernel函数来启动Linux kernel,调用时传入的参数解释如下:

 

kernel_entry:linux kernel在RAM中的entry地址,该值在main_init_sec函数中通过调用copy_ns_images函数来进行赋值

dtb_addr:device tree存放的位置,该值在main_init_sec函数中通过调用copy_ns_images函数来进行赋值

rootfs_start: 拷贝到RAM中的rootfs的其实地址,该值在main_init_sec函数中被赋值

rootfs_end: 拷贝到RAM中的rootfs的末端地址,该值在main_init_sec函数中被赋值

而call_kernel函数同样定义在bios_qemu_tz_arm/bios/main.c文件中,该函数的主要内容和相关注释如下:

 

typedef void (*kernel_ep_func)(uint32_t a0, uint32_t a1, uint32_t a2);
static void call_kernel(uint32_t entry, uint32_t dtb,
		uint32_t initrd, uint32_t initrd_end)
{
/* 定义指向linux kernel入口地址的函数指针,并将函数指针的地址指向带入的参数entry的位置 */
	kernel_ep_func ep = (kernel_ep_func)entry;  
	void *fdt = (void *)dtb;    //定义device tree的地址,并赋值
	const char cmdline[] = COMMAND_LINE; //定义存放commond line的变量,并进行赋值
	int r;
	const uint32_t a0 = 0;
	/*MACH_VEXPRESS see linux/arch/arm/tools/mach-types*/
	const uint32_t a1 = 2272;

/* 获取device tree的信息 */
	r = fdt_open_into(fdt, fdt, DTB_MAX_SIZE);
	CHECK(r < 0);

/* 设置device tree中的相关节点的中,initrd的起始地址,initrd的末端地址,bootargs */
	setprop_cell(fdt, "/chosen", "linux,initrd-start", initrd);
	setprop_cell(fdt, "/chosen", "linux,initrd-end", initrd_end);
	setprop_string(fdt, "/chosen", "bootargs", cmdline);
	r = fdt_pack(fdt);
	CHECK(r < 0);

/* 打印相关信息 */
	msg("kernel command line: \"%s\"\n", cmdline);
	msg("Entering kernel at 0x%x with r0=0x%x r1=0x%x r2=0x%x\n",
		(uintptr_t)ep, a0, a1, dtb);
/* 带入device tree信息和其他相关参数,调用linux kernel的入口函数,进而执行linux kernel的启动 */
	ep(a0, a1, dtb);
}

函数最后会调用ep(a0, a1,dtb)进入linux kernel的启动。启动linux kernel的log和界面如下:

 

8.OP-TEE+qemu的启动过程分析--启动linux kernel_第1张图片

 

你可能感兴趣的:(OP-TEE,ARM,TrustZone技术)