GP规范的内存管理函数包括:
1、TEE_Result TEE_CheckMemoryAccessRights(uint32_t accessFlags, void* buffer, size_t size);
该函数实现检查参数buffer和size指定的内存缓冲区,并确定当前TA实例是否具有参数accessFlags中请求的访问权限。如果缓冲区的特征与accessFlags兼容,则该函数返回TEE_SUCCESS。否则,它将返回TEE_ERROR_ACCESS_DENIED。
请注意缓冲区不应该被函数访问,函数应基于缓冲区的地址和内部内存管理信息检查访问权限。
2、void TEE_SetInstanceData([ctx] void* instanceData);
[ctx] void* TEE_GetInstanceData(void);
TEE_SetInstanceData和TEE_SetInstanceData函数提供了操作全局数据的方法。虽然C语言提供了全局变量,但有时使用这些方法更高效。
这两个函数可用于注册和访问实例变量,通常实例变量可用于保存指向TA定义的内存块的指针,该内存块包含实例范围内的可写的全局数据或静态数据。框架不解释该指针的值,而仅仅将其传递给该会话中的函数。
请注意,* instanceData可以使用指向由TA实例分配的缓冲区的指针或其他任何值(例如整数,句柄等)来设置。当会话关闭时,框架不会自动释放*instanceData;如果需要,TA实例负责释放该内存。
管理会话全局和静态数据的等效会话上下文变量在各个会话中都存在。
3、void* TEE_Malloc(size_t size, uint32_t hint);
该函数为对象分配大小为size字节的空间,返回的指针确保是对齐的,以便可以赋值给任意的C指针。
参数hint,分配器提示符,根据其值来为分配的内存设置一些特殊特性,如初始化为0。hint务必附着在已分配的块上,这样当使用TEE_Realloc重新分配该块时,应继续使用该hint。
如果不能分配空间,应返回NULL指针。
4、void* TEE_Realloc([in] void* buffer, uint32_t newSize);
该函数将缓冲区所指向的内存对象的大小更改为newSize指定的大小。取oldSize和newSize中的较小值,对象中的内容保持不变;超出oldSize的空间包含未指定的内容。
如果新的存储对象需要移动,则将释放对象先前实例化的空间。如果无法分配空间,则原始对象将保持分配状态,并且此函数返回NULL指针。
如果buffer为NULL,TEE_Realloc等效于TEE_Malloc分配指定的字节;如果buffer不是之前TEE_Malloc、TEE_Realloc函数返回的指针,或者内存空间已经被TEE_Free、TEE_Realloc释放,则返回错误。
如果使用TEE_Malloc分配块时最初提供的hint为0,则扩展空间将继续填充零。通常,函数TEE_Realloc应该使用与最初用TEE_Malloc分配的缓冲区完全相同的hint分配新的内存缓冲区
注意,TEE_Malloc或TEE_Realloc返回的但尚未释放或重新分配的任何指针都可以传递给TEE_Realloc。
5、void TEE_Free(void *buffer);
该函数释放缓冲区所指向的空间。如果buffer等于NULL,该函数不做任何处理;如果buffer不是之前TEE_Malloc、TEE_Realloc函数返回的指针,或者内存空间已经被TEE_Free、TEE_Realloc释放,则返回错误。
6、void TEE_MemMove([outbuf(size)] void* dest, [inbuf(size)] void* src, uint32_t size);
该函数从src空间拷贝size个字节到dest空间。
7、int32_t TEE_MemCompare([inbuf(size)] void* buffer1,[inbuf(size)] void* buffer2, uint32_t size);
该函数比较buffer1的前size字节与buffer2的前size个字节是否相同。
8、void TEE_MemFill([outbuf(size)] void* buffer, uint32_t x, uint32_t size);
该函数将buffer的前size个字节填充为x值。