TEE系统中的多线程数据传输方法和装置
技术领域
本说明书实施例涉及TEE技术领域,更具体地,涉及TEE系统中的多线程数据传输方法和装置。
背景技术
可信执行环境(TEE-Trusted Execution Environment)是处理器中的安全可信区域,可以保证放入其中的代码和数据的安全性、机密性和完整性。TEE提供一个隔离的执行环境,代码和数据可以在这个可信区域内运行,运行过程中可以保证不被常规操作系统干扰的计算,这样就可以达到保证代码和数据的机密性和完整性。TEE(EAL2+)与常规操作系统相比,提供更高级别的安全性;与SE(EAL5)相比,提供更多的功能,更好的性能。TEE有很多种实现方式,比如Intel的SGX,AMD的SEV,ARM的TrustZone(可信区)等。因为TEE提供的是一个隔离的执行环境,所以非TEE环境与TEE环境的通信一般都是通过特殊的指令调用,比如smc call(TrustZone)或ecall ocall(SGX)。例如,在TEE侧通过调用Ocall函数进行日志打印的情况中,在通过调用Ocall函数引起CPU从TEE侧切换到非TEE侧,恢复寄存器等上下文信息之后,通常需要在非TEE侧等待日志打印完成之后再返回TEE侧,带来一定的性能损耗。
因此,需要一种更有效的在TEE系统中进行数据传输的方案。
发明内容
本说明书实施例旨在提供一种更有效的在TEE系统中进行数据传输的方案,以解决现有技术中的不足。
为实现上述目的,本说明书一个方面提供一种TEE系统中的数据传输方法,所述TEE系统包括TEE侧和非TEE侧,在所述非TEE侧包括共享内存,所述共享内存中包括第一地址、第二地址和连续的多个第三地址,其中,所述第一地址用于存储写偏移地址,所述写偏移地址指示所述多个第三地址中可写入的起始地址,所述第二地址用于存储读偏移地址,所述读偏移地址指示所述多个第三地址中可读取的起始地址,所述第三地址用于存储来自TEE侧的数据,所述TEE侧预设有与所述共享内存对应的TEE侧线程锁,所述方法由TEE侧多个线程中的第一线程执行,包括:
获取第一数据;
获取所述TEE侧线程锁;
以所述第一数据作为输入参数调用预定函数,以切换到非TEE侧;
通过读取第一地址和第二地址,分别获取写偏移地址和读偏移地址;
判断所述第一数据的字节数是否小于等于可写字节数,其中,所述可写字节数基于所述写偏移地址和所述读偏移地址确定,其中,每个地址对应于一个字节;
在所述第一数据的字节数小于等于可写字节数的情况中,将所述第一数据写入从所述写偏移地址开始的第三地址中;
更新所述第一地址中的写偏移地址;
返回TEE侧;以及
释放所述TEE侧线程锁。
在一个实施例中,所述第一数据为以下任一种数据:日志、监控数据、统计数据。
在一个实施例中,所述方法还包括,在所述第一数据的字节数大于可写字节数的情况中,进行等待。
在一个实施例中,所述共享内存中还包括第四地址,用于存储丢弃数据数目,所述方法还包括,在所述第一数据的字节数大于可写字节数的情况中,丢弃所述第一数据,并将第四地址中存储的丢弃数据数目加一。
在一个实施例中,所述丢弃数据数目为原子变量。
在一个实施例中,所述写偏移地址在所述读偏移地址之前,所述可写字节数等于所述读偏移地址减去所述写偏移地址之差。
在一个实施例中,所述写偏移地址在所述读偏移地址之后,所述可写字节数等于第三地址的数目减去不可写字节数之差,其中,所述不可写字节数等于所述写偏移地址减去所述读偏移地址之差。
在一个实施例中,所述写偏移地址与所述读偏移地址相同,所述可写字节数等于全部第三地址的数目。
在一个实施例中,所述TEE系统为SGX系统,其中,所述预定函数为Ocall函数。
在一个实施例中,所述TEE侧线程锁为第一变量,所述第一变量为原子变量,所述第一变量的值指示是否锁定,其中,获取所述TEE侧线程锁包括,确定所述第一变量是否指示锁定,在所述第一变量未指示锁定的情况中,修改所述第一变量的值,以使得所述第一变量指示锁定,从而获取TEE侧线程锁。
本说明书另一方面提供一种TEE系统中的数据传输装置,所述TEE系统包括TEE侧和非TEE侧,在所述非TEE侧包括共享内存,所述共享内存中包括第一地址、第二地址和连续的多个第三地址,其中,所述第一地址用于存储写偏移地址,所述写偏移地址指示所述多个第三地址中可写入的起始地址,所述第二地址用于存储读偏移地址,所述读偏移地址指示所述多个第三地址中可读取的起始地址,所述第三地址用于存储来自TEE侧的数据,所述TEE侧预设有与所述共享内存对应的TEE侧线程锁,所述装置部署于TEE侧多个线程中的第一线程中,包括:
数据获取单元,配置为,获取第一数据;
锁获取单元,配置为,获取所述TEE侧线程锁;
切换单元,配置为,以所述第一数据作为输入参数调用预定函数,以切换到非TEE侧;
地址获取单元,配置为,通过读取第一地址和第二地址,分别获取写偏移地址和读偏移地址;
判断单元,配置为,判断所述第一数据的字节数是否小于等于可写字节数,其中,所述可写字节数基于所述写偏移地址和所述读偏移地址确定,其中,每个地址对应于一个字节;
写入单元,配置为,在所述第一数据的字节数小于等于可写字节数的情况中,将所述第一数据写入从所述写偏移地址开始的第三地址中;
更新单元,配置为,更新所述第一地址中的写偏移地址;
返回单元,配置为,返回TEE侧;以及
锁释放单元,配置为,释放所述TEE侧线程锁。
在一个实施例中,所述装置还包括等待单元,配置为,在所述第一数据的字节数大于可写字节数的情况中,进行等待。
在一个实施例中,所述共享内存中还包括第四地址,用于存储丢弃数据数目,所述装置还包括丢弃单元,配置为,在所述第一数据的字节数大于可写字节数的情况中,丢弃所述第一数据,并将第四地址中存储的丢弃数据数目加一。
在一个实施例中,所述TEE侧线程锁为第一变量,所述第一变量为原子变量,所述第一变量的值指示是否锁定,其中,所述锁获取单元包括,确定子单元,配置为,确定所述第一变量是否指示锁定,以及修改子单元,配置为,在所述第一变量未指示锁定的情况中,修改所述第一变量的值,以使得所述第一变量指示锁定,从而获取TEE侧线程锁。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机上述任一项方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
通过根据本说明书实施例的TEE系统数据传输方案,为TEE环境提供一种高性能的异步数据传输系统,例如异步日志打印系统,减少了TEE系统打印日志的开销,提高了TEE系统的运行速度,同时满足了对日志系统的一些基本要求。另外,通过在TEE侧和非TEE侧设置针对共享内存的线程锁,从而支持双侧多线程工作,进一步提高了TEE系统的运行速度。
附图说明
通过结合附图描述本说明书实施例,可以使得本说明书实施例更加清楚:
图1示出根据本说明书实施例的TEE系统100及其中的数据流向示意图;
图2示出根据本说明书实施例的一种TEE系统中的数据传输方法流程图;
图3示意示出根据本说明书实施例的共享内存中数据结构的示意图;
图4-图8分别示出了通过所述共享内存传输数据过程中的写偏移地址和读偏移地址;
图9示出了根据本说明书另一实施例的共享内存数据结构;
图10示出根据本说明书实施例的一种TEE系统中的数据传输方法流程图;
图11示出根据本说明书实施例的一种TEE系统中的数据传输装置1100。
具体实施方式
下面将结合附图描述本说明书实施例。
图1示出根据本说明书实施例的TEE系统100及其中的数据流向示意图。如图中所示,系统100包括TEE侧11和非TEE侧12。其中,在非TEE侧12预设有专用的缓冲寄存器122作为共享内存,用于缓存从TEE侧传输出的特定数据(例如日志)。另外,在TEE侧11预设有线程锁111,在非TEE侧12预设有线程锁121,其中,分别在每侧的数据结构中设置线程锁111和线程锁121。所述线程锁111和线程锁121都与所述共享内存相对应,用于分别使得相应侧的多个线程相对于所述共享内存是互斥的,即,每侧同时只有一个线程在操作共享内存。在TEE侧11运行有用于向外存储数据的多个线程,其中包括第一线程,该第一线程可获取第一数据(例如,日志数据),该第一线程然后在获取线程锁111之后通过调用例如打印函数(_pringf),而将第一数据存入所述缓冲寄存器122中。具体是,例如,所述TEE系统为SGX系统,则_pringf函数可通过调用Ocall函数切换为非TEE侧线程。在非TEE侧12,第一线程将日志写入缓冲寄存器122,之后,第一线程返回到TEE侧,释放线程锁111。在非TEE侧12运行有用于读取共享内存中数据的多个线程,其中包括第二线程,该第二线程在获取线程锁122之后,通过调用pop函数从缓冲寄存器122中读取存入的数据,例如在一次读取中读取第二数据。该第二线程在读取到第二数据之后,将该第二数据发送给非TEE侧的特定程序(例如日志系统log4cplus)进行数据打印。
在上述示意图中,为了保证第一线程和第二线程同时访问共享内存的数据安全性,设计了特定的数据结构以允许进行上述过程,下文将对此进行详细描述。
图2示出根据本说明书实施例的一种TEE系统中的数据传输方法流程图,所述TEE系统包括TEE侧和非TEE侧,在所述非TEE侧包括共享内存,所述共享内存中包括第一地址、第二地址和连续的多个第三地址,其中,所述第一地址用于存储写偏移地址,所述写偏移地址指示所述多个第三地址中可写入的起始地址,所述第二地址用于存储读偏移地址,所述读偏移地址指示所述多个第三地址中可读取的起始地址,所述第三地址用于存储来自TEE侧的数据,所述TEE侧预设有与所述共享内存对应的TEE侧线程锁,所述方法由TEE侧多个线程中的第一线程执行,包括:
步骤S202,获取第一数据;
步骤S204,获取所述TEE侧线程锁;
步骤S206,以所述第一数据作为输入参数调用预定函数,以切换到非TEE侧;
步骤S208,通过读取第一地址和第二地址,分别获取写偏移地址和读偏移地址;
步骤S210,判断所述第一数据的字节数是否小于等于可写字节数,其中,所述可写字节数基于所述写偏移地址和所述读偏移地址确定,其中,每个地址对应于一个字节;
步骤S212,在所述第一数据的字节数小于等于可写字节数的情况中,将所述第一数据写入从所述写偏移地址开始的第三地址中;
步骤S214,更新所述第一地址中的写偏移地址;
步骤S216,返回TEE侧;以及
步骤S218,释放所述TEE侧线程锁。
图3示意示出根据本说明书实施例的共享内存中数据结构的示意图。如图3中所示,所述共享内存中包括第一地址、第二地址和连续的多个第三地址。图中示意示出10个第三地址,该10个连续的第三地址例如可分别标识为“1,2,…,10”。该内存中的每个地址可写入一个字节,其中,第一地址用于存储写偏移地址,该写偏移地址指示第三地址中可写入的起始地址;第二地址用于存储读偏移地址,该读偏移地址指示第三地址中可读取的起始地址;第三地址用于存储希望从TEE侧传输到非TEE侧的数据。例如,在初始还未从TEE侧向该共享内存存入数据的情况中,第三地址中可写入的起始地址为第1个地址,即地址“1”,因此,第一地址中存储的写偏移地址为“1”。在该情况中,在读取数据时,由于最多只能读到写偏移地址前一个地址,因此此时的第二地址中的读偏移地址也为地址“1”,图中示意示出了读偏移地址(图中以R表示)和写偏移地址(图中以W表示)分别对应的第三地址(即地址“1”)。可以理解,在该共享内存中,只限定了多个第三地址是连续的地址,对于第一地址、第二地址和第三地址的位置关系并没有特别限定,例如,第一地址、第二地址可以分别位于第三地址的两头,或者第一地址、第二地址可位于第三地址之后等等。另外,图3中虽然示意示出该共享内存中包括10个连续第三地址,在实际应用中,可根据待传输数据的具体字节数确定共享内存中包括的第三地址的数目。例如,待传输数据为TEE侧的日志,例如,该日志通常有几十个字节,从而,可将该共享内存设置为包括几百个连续的第三地址。
当TEE侧希望向非TEE侧传输特定数据时,通过运行TEE侧的用于该传输的多个线程中的一个线程(例如第一线程)执行该方法而向共享内存的第三地址中写入数据,该多个线程例如属于用于从TEE侧向非TEE侧传输数据的进程。由于在通过该方法向共享内存中写入数据之后,在非TEE侧将通过另外的线程将该数据传送至目标程序,因此,该方法对数据的传输方式为异步传输方式,因此,该方法适用于对实时性要求不高、传输量较大、且对性能要求较高的数据。从而,所述特定数据例如为日志、监控数据、统计数据等等。
首先,在步骤S202,获取第一数据。
所述第一数据例如为TEE中生成的日志。TEE侧在生成日志之后例如将其存储到TEE侧的预定内存位置。所述第一线程可预设为定期从所述预定内存位置读取日志,从而可定期获取待传输的数据,以定期执行该方法。
在TEE侧包括多个执行该方法的线程的情况中,可将该多个线程设置为轮流从所述内存位置读取日志,从而可加速对日志的读取。
在步骤S204,获取所述TEE侧线程锁。
在一个实施例中,所述TEE侧线程锁为第一变量,所述第一变量为原子变量,所述第一变量的值指示是否锁定,其中,获取所述TEE侧线程锁包括,确定所述第一变量是否指示锁定,在所述第一变量未指示锁定的情况中,修改所述第一变量的值,以使得所述第一变量指示锁定,从而获取TEE侧线程锁。
可以理解,所述线程锁不限于为上述形式,如本领域技术人员已知的,根据不同的语言,可通过不同的方式设置线程锁。例如,可通过调用“Lock()”函数的方式,实现相对于共享内存的多个线程之间的线程互斥等。在此不一一详述。
步骤S206,以所述第一数据作为输入参数调用预定函数,以切换到非TEE侧。
所述TEE系统例如为SGX系统,在该SGX系统中包括围圈(enclave)作为可信执行环境(TEE),在该围圈中,第一线程可通过调用Ocall函数切换到非围圈侧(即非TEE侧)。Ocall函数是SGX系统中提供的一种数据传输方式,围圈侧的线程调用Ocall函数之后,使得cpu切换到非围圈侧。具体是,在以第一数据作为输入参数调用Ocall函数之后,在围圈侧备份围圈侧的寄存器,通过以第一数据作为输入参数从而将该第一数据传输到非TEE侧,然后在非围圈侧恢复非围圈侧的寄存器信息,其中包括,将作为输入参数的第一数据存储到寄存器中。第一线程切换到非TEE侧之后,然后可通过调用其它函数进行后续步骤。
在步骤S208,通过读取第一地址和第二地址,分别获取写偏移地址和读偏移地址。
除了上述图3示出的写偏移地址和读偏移地址分别指示第三地址中的地址“1”的情况之外,图4-图8分别示出了通过所述共享内存传输数据过程中的写偏移地址和读偏移地址。在图4-图8中,每个方框对应于一个地址,方框内部的数据为其中存储一个字节的数据,方框下方的数字为其地址标识,“R”和“W”如上文指示分别对应于读偏移地址和写偏移地址。
在图4中,已经通过该方法从地址1开始向第三地址中顺序写入了四个字节”ab\n\0”,并且在非TEE侧还未对该共享内存进行数据读取,在该情况中,第一地址中存储的写偏移地址(W)指向存储“\0”之后的地址,即,地址5,第二地址中存储的读偏移地址(R)仍指向地址1。
在图5中,已经又通过该方法从地址5开始顺序写入了四个字节”cd\n\0”,并且在非TEE侧仍未对该共享内存进行数据读取,在该情况中,写偏移地址(W)指向存储第二个“\0”之后的地址,即,地址9,读偏移地址(R)仍指向地址1。
在图6中,已经在非TEE侧通过下文将描述的方法从读偏移地址开始进行数据读取,该读取最多只能读到所述写偏移地址之前的一个地址,即该读取过程读取了共享内存中已经写入的八个字节”ab\n\0cd\n\0”。在该情况中,在第一地址中存储的写偏移地址仍指向地址9,在第二地址中存储的读偏移地址指向第二个“\0”之后的地址,即,也是地址9。
在图7中,已经又通过图2所示方法从地址9开始向第三地址中顺序写入”ef\n\0”四个字节。在该情况中,读偏移地址未发生变化,仍为地址9,在写入数据的过程中,当10个地址都写满了之后,由于在读偏移地址之前的数据都是经过读取的数据,从而,从地址1到读偏移地址(在该情况中为地址9)之前的地址(即地址8)的每个地址都是可以写入的,因此从地址10跳到地址1继续进行写入,在写完之后,写偏移地址指向地址3。
在图8中,已经又在非TEE侧进行对该共享内存的读取。具体是,从读偏移地址(地址9)开始一直读取到写偏移地址的前一个地址(地址2),在进行该读取之后,第一地址中的写偏移地址仍指向地址3,第二地址中的读偏移地址也指向地址3。
在步骤S210,判断所述第一数据的字节数是否小于等于可写字节数,其中,所述可写字节数基于所述写偏移地址和所述读偏移地址确定,其中,每个地址对应于一个字节。
本领域技术人员根据写偏移地址和读偏移地址可容易地确定多个第三地址中的可写地址,由于一个地址对应于一个字节,从而可确定可写字节数。
例如,在图3、图6和图8所示的情况中,读偏移地址和写偏移地址指向同一个地址,则可写字节数为全部第三地址的数目,即10个。
在图4、5所示的情况中,写偏移地址在读偏移地址之后,可写字节数是第三地址的数目减去不可写字节数,所述不可写字节数为写偏移地址减去读偏移地址的差。例如,在图4中,写偏移地址为5,读偏移地址为1,从而,不可写字节数为5-1=4,可写字节数为10-4=6,其分别对应于地址5到地址10共六个地址。
在图7所示的情况中,写偏移地址在读偏移地址之前,在该情况中,可写字节数为读偏移地址减去写偏移地址之差。例如,在图7中,写偏移地址为3,读偏移地址为9,从而,可写字节数为9-3=6,其分别对应于地址3到地址8共六个地址。
在步骤S212,在所述第一数据的字节数小于等于可写字节数的情况中,将所述第一数据写入从所述写偏移地址开始的第三地址中。
例如,在所述共享内存中已存储的数据如图4所示的情况中,如上文所述,可写字节数为6个,当将要写入的第一数据为”ef\n\0”4个字节的情况中,由于4<6,因此,可将”ef\n\0”4个字节写入5、6、7、8四个地址中。
在所述共享内存中已存储的数据如图7所示的情况中,如上文所述,可写字节数为6个,当将要写入的第一数据为“ghijkl\n\0”8个字节的情况中,即第一数据的字节数大于可写字节数,从而,将不能向共享内存中写入该数据。在该情况中,该写入线程或者进行等待,直到共享内存中有足够的可写字节数,或者可丢弃该第一数据并返回。图9示出了根据本说明书另一实施例的共享内存数据结构。在该数据结构中,除了包括图3所述的第一地址、第二地址和第三地址之外,还包括第四地址,第四地址中存储丢弃数据数目。在如上文所述丢弃第一数据之后,在第四地址中将该丢弃数据数目加1。在一个实施例中,该丢弃数据数目为原子变量,从而在TEE侧和非TEE侧双线程同时操作的情况下,可保证数据安全性。
在步骤S214,更新所述第一地址中的写偏移地址。
例如,在对图3中的第三地址写入“ab\n\0”之后,将初始的写偏移地址“1”更新为写偏移地址“5”,从而以便于下次写入或读取时对写偏移地址的读取。例如,在对图4所示的第三地址写入时,可读取到最新的写偏移地址“5”,从而进行可写字节数的计算。
在步骤S216,返回TEE侧。
所述第一线程可预设为在进行完步骤S214之后返回TEE侧,从而,第一线程在进行步骤S214之后将自动返回到TEE侧,以进行TEE侧的后续步骤,例如再次重复该方法。
在步骤S218,释放所述TEE侧线程锁。
例如,在所述TEE侧线程锁为上述第一变量的情况中,该第一线程可通过将第一变量的值修改为指示未锁定,从而释放该线程锁。
图10示出根据本说明书实施例的一种TEE系统中的数据传输方法流程图,所述TEE系统包括TEE侧和非TEE侧,在所述非TEE侧包括共享内存,所述共享内存中包括第一地址、第二地址和连续的多个第三地址,其中,所述第一地址用于存储写偏移地址,所述写偏移地址指示所述多个第三地址中可写入的起始地址,所述第二地址用于存储读偏移地址,所述读偏移地址指示所述多个第三地址中可读取的起始地址,所述第三地址用于存储来自TEE侧的数据,所述非TEE侧预设有与所述共享内存对应的非TEE侧线程锁,所述方法由非TEE侧多个线程中的第二线程执行,包括:
步骤S1002,获取所述非TEE侧线程锁;
步骤S1004,通过读取第一地址和第二地址,分别获取写偏移地址和读偏移地址;
步骤S1006,读取所述第三地址中的写入数据中的未读取字节作为第二数据,所述未读取字节基于所述写偏移地址和所述读偏移地址确定,其中,每个地址对应于一个字节;
步骤S1008,更新所述第二地址中的读偏移地址;以及
步骤S1010,释放所述非TEE侧线程锁。
该方法可通过非TEE侧运行的多个线程中的第二线程执行,该多个线程可同样属于上述用于从TEE侧向非TEE侧传输数据的进程。
其中,步骤S1002、步骤S1004和步骤S1010可分别参考上述对步骤S204、步骤S208和步骤S218的描述,在此不再赘述。
在步骤S1006,读取所述第三地址中的写入数据中的未读取字节作为第二数据,所述未读取字节基于所述写偏移地址和所述读偏移地址确定,其中,每个地址对应于一个字节。
本领域技术人员根据写偏移地址和读偏移地址可容易地确定第三地址中的未读取字节。
例如,在图3、图6和图8所示的情况中,读偏移地址和写偏移地址指向同一个地址,则第三地址中不包括未读取字节。
在图4、5所示的情况中,写偏移地址在读偏移地址之后,所述第三地址中的全部未读取字节包括从所述读偏移地址开始到所述写偏移地址的前一个地址中的各个字节。例如,在图4中,写偏移地址为5,读偏移地址为1,从而,全部未读取字节为地址1到4中各个字节。
在图7所示的情况中,写偏移地址在读偏移地址之前,在该情况中,所述全部未读取字节为所述第三地址中除已读取字节之外的字节,所述已读取字节包括从所述写偏移地址开始到所述读偏移地址的前一个地址中的各个字节。例如,在图7中,写偏移地址为3,读偏移地址为9,从而,已读取字节为地址3到地址8中各个地址中的字节,从而,全部未读取字节为地址1-2和地址9-10中的各个字节。可以理解,在该步骤中,不一定读取所述第三地址中的全部未读取字节,而可以仅读取部分未读取字节。例如,可预设为一次仅读取3个字节,从而,在一次读取中可读取全部未读取字节中的前三个字节,剩余的一个未读取字节可留到下一次读取时读取。
在步骤S1008,更新所述第二地址中的读偏移地址。
例如,在从图5所示的第三地址读取八个字节“ab\n\0cd\n\0”之后,将读偏移地址从“1”更新为“9”,从而便于下次写入或读取时对读偏移地址的读取。
在一个实施例中,所述第二数据为日志数据,所述方法还包括,在释放所述非TEE侧线程锁之后,将所述第二数据发送给在非TEE侧的日志打印程序,以用于打印该第二数据。该打印例如包括在显示器上显示,或者存入硬盘中等。
图11示出根据本说明书实施例的一种TEE系统中的数据传输装置1100,所述TEE系统包括TEE侧和非TEE侧,在所述非TEE侧包括共享内存,所述共享内存中包括第一地址、第二地址和连续的多个第三地址,其中,所述第一地址用于存储写偏移地址,所述写偏移地址指示所述多个第三地址中可写入的起始地址,所述第二地址用于存储读偏移地址,所述读偏移地址指示所述多个第三地址中可读取的起始地址,所述第三地址用于存储来自TEE侧的数据,所述TEE侧预设有与所述共享内存对应的TEE侧线程锁,所述装置部署于TEE侧多个线程中的第一线程中,包括:
数据获取单元1101,配置为,获取第一数据;
锁获取单元1102,配置为,获取所述TEE侧线程锁;
切换单元1103,配置为,以所述第一数据作为输入参数调用预定函数,以切换到非TEE侧;
地址获取单元1104,配置为,通过读取第一地址和第二地址,分别获取写偏移地址和读偏移地址;
判断单元1105,配置为,判断所述第一数据的字节数是否小于等于可写字节数,其中,所述可写字节数基于所述写偏移地址和所述读偏移地址确定,其中,每个地址对应于一个字节;
写入单元1106,配置为,在所述第一数据的字节数小于等于可写字节数的情况中,将所述第一数据写入从所述写偏移地址开始的第三地址中;
更新单元1107,配置为,更新所述第一地址中的写偏移地址;
返回单元1108,配置为,返回TEE侧;以及
锁释放单元1109,配置为,释放所述TEE侧线程锁。
在一个实施例中,所述装置还包括等待单元1110,配置为,在所述第一数据的字节数大于可写字节数的情况中,进行等待。
在一个实施例中,所述共享内存中还包括第四地址,用于存储丢弃数据数目,所述装置还包括丢弃单元1111,配置为,在所述第一数据的字节数大于可写字节数的情况中,丢弃所述第一数据,并将第四地址中存储的丢弃数据数目加一。
在一个实施例中,所述TEE侧线程锁为第一变量,所述第一变量为原子变量,所述第一变量的值指示是否锁定,其中,所述锁获取单元1102包括,确定子单元11021,配置为,确定所述第一变量是否指示锁定,以及修改子单元11022,配置为,在所述第一变量未指示锁定的情况中,修改所述第一变量的值,以使得所述第一变量指示锁定,从而获取TEE侧线程锁。
本说明书另一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机上述任一项方法。
本说明书另一方面提供一种计算设备,包括存储器和处理器,其特征在于,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
在本说明书实施例中,因为所述共享内存会被TEE和非TEE环境同时使用,通过对共享内存的数据结构的特殊设计保证线程安全。具体是,在共享内存中包括上述第一地址-第四地址,其中,对于第一地址和第二地址,只会单侧写,另一侧只会读,所以没有同时写的问题。另外,针对一边读另一边在写的情况,因为写的时候是在写完了更新写偏地址,读的时候是在读完了更新读偏移地址,因此不存在偏移地址更新了,但是数据还没处理的情况,所以不会读到未写完的数据,也不会写数据覆盖掉未读的数据。第三地址中存储的数据虽然是双侧读写,但是通过由写偏移地址和读偏移地址控制读写的范围,所以其实是分开的区域,互不干扰。另外,对于第四地址中的丢弃数据数目,虽然也是同时读写,但是通过将其设置为原子变量而保证了数据安全性。
通过上述数据结构的设计,为TEE环境提供一种高性能的异步数据传输系统,例如异步日志打印系统,减少了TEE系统打印日志的开销,提高了TEE系统的运行速度,同时满足了对日志系统的一些基本要求。另外,通过在TEE侧和非TEE侧设置针对共享内存的线程锁,从而支持双侧多线程工作,进一步提高了TEE系统的运行速度。
需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本领域普通技术人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执轨道,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执轨道的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。