TEE侧多核并发(一)

多核处理器分类

从架构上区分

  • 同构多核架构:系统中的处理器在架构上是相同的
  • 异构多核架构:系统中的处理器在架构上是不同的

从运行模式上分

  • AMP(非对称多处理)。AMP是指,多个核相对独立的运行不同的任务,每个核之间相互隔离,可以运行不同的操作系统或裸机程序。但是两个核心之间的通信与资源共享需要有一套优秀的处理机制。虽然多个核心可以运行不同的系统,但是需要有一个主要的核心来控制整个系统以及其他的核心。

  • SMP(对称多处理)。SMP是指多个核心运行一个操作系统,该操作系统同等的管理多个内核,这种运行模式就是简单提高运行性能。

  • BMP(受约束多处理)。BMP运行模式与 SMP类似,同样也是一个OS管理所有的核心,但开发者可以指定将某个任务仅在某个指定内核上执行 。

TEE侧的多核并发背景

在ARM TrustZone框架下,系统级的安全是通过将片上系统(system on chips,SoC)的软硬件资源划分到两个世界中获得的。这两个世界即正常世界 (normal world)和安全世界(secure world)(也可以叫安全域和非安全域),这两个世界分别对应富有执行环境(rich execution environment ,REE)和可信执行环境(trusted execution environment,TEE)。REE和TEE运行于同一台物理设备上,分别运行一套操作系统。REE运行安全性要求低的客户端应用(client application ,CA);TEE则运行需要保障其安全性的可信应用(trusted application,TA),为授权的可信应用TA提供安全的执行环境。CA和TA之间通过ARM TrustZone提供的通信机制进行通信,就如同客户端和服务器一般。

ARM TrustZone早期是按照TEE只能运行在一个核(通常称之为0号核)上 设计的。但是,生物识别技术对性能要求较高且处理逻辑比较复杂,对TEE提出了很高的计算能力的要求。从用户体验的角度,单核方案可能导致不可接受的人脸解锁速度或人脸支付速度。

为解决这个问题,OP-TEE(open portable trusted execution environment)现有技术提供了一种简单的多核实现方案。如图所示,它允许多个CA并行地向多个TA发起安全访问。具体的,每个CA可通过调用REE侧的TEE客户端库(TEE client lib)访问TEE驱动, 然后TEE驱动会发送安全监视调用(Secure Monitor Call ,SMC)指令;每个核都可以进入监视器模式,而且每个核的状态都是独立的;之后每个核进入安全模式,即TEE,然后TEE从一 个线程池中寻找与CA对应的线程完成TEE内的任务。但是,一方面,TEE中的核数直接受限于 REE侧调用TA的线程的数目,在核不够用的场景下,TEE无法主动创建线程;另一方面,这个方案中并行的多个TA仅通过一个简单的线程池实现,没有提供统一的调度和负载均衡机 制,多个TA的并行运行会对整个系统的性能和功耗造成影响。

文献一:华为专利(2018年)

思想概括

TEE侧部署有线程创建模块、通知模块、以及TEE调度模块,其中,线程创建模块用于在TA的调用下创建子线程,子线程用以实现所述多个子功能中的一个子功能;通知模块用于触发所述REE生成影子线程,影子线程的运行促使运行影子线程的核进入TEE;TEE调度模块用于将子线程调度到核上运行。

个人理解:将TA与一个CA绑定,始终保证CA-TA调度组中包含的任务在同一个核上运行,利用REE的调度,在TEE侧实现拉核和负载均衡。

详细过程

人脸识别CA通过提供的SMC指令向TEE侧的人脸识别TA301发送调用请求。我认为可以这样理解该过程:通过提供的SMC指令,运行人脸识别CA的核进入到TEE侧(安全模式),并开始在安全模式下运行人脸识别TA以实现人脸识别TA的功能。

人脸识别TA301接收到该调用请求之后,本申请提出的创建1个子线程T1。具体的,人脸识别TA301通过线程创建模块302(例如libthread)中的pthread_create接口创建这个子线程T1。

线程创建模块302在创建完子线程T1后调用通知模块303产生一个软中断,该软中断被发送到REE侧的通知处理模块304。

TEE调度模块305为这个子线程T1创建对应的任务控制数据结构,即线程控制块(thread control block ,TCB)。每个子线程的TCB都包含运行状态、调度策略、TCB名称等。新创建的子线程,其运行状态会被设置到一个特定的运行状态,例如state=000,表示等待新的核进来执行它。TCB中包含一个ca字段,该ca字段为“ 第一线程标识”的一种实现。该ca字段的值可以默认为0。

通知处理模块304收到该软中断之后会生成一个线程S1,该线程S1的进程标识(process identification,PID)=S1,该线程S1通过发送SMC指令进入TEE侧。容易理解的是,这里所谓“ 线程进入TEE侧”,也就是“ 运行该线程的核进入TEE侧”。具体的,影子线程发送的SMC指令中可以包含一个参数,该参数用于指示该影子线程是第一次进入TEE侧。或者影子线程仅在第一次发送SMC指令时包含一个参数,其它时候不包含该参数,这样接收者也可以
通过判断存在或不存在该参数来确定影子线程是否是第一次进入TEE侧。

影子线程S1进入TEE侧之后,也就是说运行影子线程S1的核进入TEE侧之后,TEE调度模块305在全局状态数组中该核的位置记录该影子线程S1的PID。

运行影子线程S1的核为标号为1的核(下文简称为核1),那么TEE调度模块305就在ctx_map_t[1]的ca字段处记录影子线程S1的PID,即ca=S1,表明此次进入TEE的(虚拟)CA为影子线程S1。

TEE调度模块305确定影子线程S1首次进入TEE侧时,就会去找处于特定运行状态即state=000的子线程T1,将该子线程T1调度到影子线程的当前核即核1上运行。

进一步的,TEE调度模块305将ctx_map_t[1]的ca字段的值(即S1)赋值到子线程T1对应的TCB的ca字段中。这样,影子线程S1和子线程T1分别作为CA和TA的一个CA-TA组就建立完成了。

影子线程S1和普通CA一样,在运行的过程中可能被中断并退回到REE侧,在REE侧可能会被调度到其它核上,此时为了保证子线程T1仍然和影子线程S1在同一个核上运行,当影子线程(即核1)退回到REE侧后,TEE调度模块305将ctx_map_t[1]的ca字段清除,当影子线程S1重新进入TEE侧时,TEE调度模块305将全局状态数组中对应的位置的ca字段设置为S1,TEE调度模块305查找目标子线程,将该目标子线程调度到当前核上运行,该目标子线程需要满足如下条件:其TCB中的ca字段与全局状态数组中当前核对应的ca字段相同。

优势

此方法实现之后形成的多个CA-TA调度组,且以一个CA-TA调度组为一个调度单元,被REE侧的CFS调度器来做统一的调度,该调度可以是由负载均衡需求触发的

当一个服务进程处理完一个TA的消息后收到另一个TA的消息时,服务进程又会随着新消息更新ca值,而被带到另一个CA-TA组。如图所示,权限管理服务602可以从人脸识别CA-TA调度组切换到指纹识别CA-TA调度组。

实现了CA-TA调度组的统一迁移,始终保证CA-TA调度组中包含的任务在同一个核上运行。

posted @ 2022-06-22 14:40  Pan_Y  阅读(1156)  评论(0)    收藏  举报