原文链接
Alternative ways of allocating memory in Mbed TLS — Mbed TLS documentation
在某些情况下,比如当嵌入式平台上没有操作系统时,堆或calloc()
/free()
并没有真正的可用性。Mbed TLS仍然需要某种形式的动态内存分配来操作SSL堆栈。我们可以假设所有结构的最大尺寸,但这将消耗大量的内存空间。相反,我们选择让Mbed TLS只使用钩子来分配和释放动态内存。
目前您有两种选择:
-
提供你自己的分配和释放函数。
-
使用Mbed TLS中的缓冲分配器(buffer allocator )功能。
要启用内存分配层,请定义MBEDTLS_PLATFORM_C
和MBEDTLS_PLATFORM_MEMORY
在mbedtls_config.h
里。看见如何配置Mbed TLS.
如果不启用layer,libc标准calloc()
和free()
被使用。
内部构件
在内部,只有两个函数指针mbedtls_calloc()
和mbedtls_free()
在Mbed TLS中为每次动态内存分配或取消分配调用。
extern void * (*mbedtls_calloc)( size_t n, size_t size ); extern void (*mbedtls_free)( void *ptr );
这些函数的原型与libc
标准calloc()
和free()
。没有任何进一步的调用,默认libc
这些指针被赋予了名称。
没有libc等价物
如果您的系统没有libc
等效地,您将得到如下编译错误calloc()
或者free()
找不到。
定义MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
在mbedtls_config.h
文件里阻止Mbed TLS了解这些功能。
提供你自己的钩子
如果您的操作系统已经提供了libc
分配器函数,您可以使用以下命令来设置它们:
int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ), void (*free_func)( void * ) );
使用Mbed TLS缓冲分配器
如果希望Mbed TLS分配静态缓冲区内的所有内容,可以通过定义MBEDTLS_MEMORY_BUFFER_ALLOC_C
在……里mbedtls_config.h
文件。
在调用任何其他Mbed TLS函数之前,按如下方式启用缓冲分配器:
unsigned char memory_buf[100000]; mbedtls_memory_buffer_alloc_init( memory_buf, sizeof(memory_buf) );
安全警告
缓冲区分配器是动态内存分配器的一种简单方法。没有实现特殊的堆保护机制。
在别处使用缓冲区分配器
缓冲分配器本身不依赖于Mbed TLS的任何其他部分。因此,您也可以在自己的代码库中使用它。