wolfTips: 静的メモリー割り当てを使いこなす

静的メモリー割り当てを wolfSSL で使用する。

wolfSSL を静的メモリー割り当てと共に使用することが出来ます。ただし、使用メモリー量が大きくなるので使用には気をつけなければならない面もあります。搭載メモリー量に比較的余裕のある環境での選択肢として使用できます。今回はその仕組みを紹介します。

 

まず、wolfSSL で静的メモリー割り当てを有効にし、ビルドを行います。ビルドは以下のオプションをconfigure に指定します。

$./configure –enable-staticmemory

静的メモリー割り当ては、USE_FAST_MATHマクロの定義が必要で、WOLFSSL_SMAL_STACK定義が未定義あることが必要となります。64 ビットの環境では、configureの実行でこれらが自動的に設定されます。64ビット以外の環境では、–enable-fastmath を指定します。ヘッダーファイルを使用する場合は、

#define WOLFSSL_STATIC_MEMORY

を指定します。

 

静的メモリー割り当ての仕組みはWOLFSSL_CTX構造体に静的バッファを割り当て、WOLFSSL_CTX構造体から派生・生成される各構造体にヒープヒントを渡し、各構造体でヒープヒントからメモリー割り当てを行うことで実現しています。次の図で矢印はヒープを、四角枠は構造体を示しています。

静的メモリー割り当てを有効にしたWOLFSSL_CTX構造体を生成するために、下記のAPIを使用します。

wolfSSL_CTX_load_static_memory()

動的メモリーの使用を避けるために、wolfSSL_CTX_load_static_memory()は、ctxをNULLで渡し、静的メソッド関数(_exで終わる)を使用して静的バッファメモリーのみを使用し WOLFSSL_CTX構造体を生成します。

 

静的メモリー割り当てを使用した例は、wolfSSL に含まれるデフォルトのクライアント/サーバー、及びCryptテストを参照することができます。

 

下記はクライアントの例になります。ファイルの先頭で静的メモリーバッファを確保し、WOLFSSL_CTX構造体の生成に、wolfSSL_CTX_load_static_memory() を利用していることがわかります。

#ifdef WOLFSSL_STATIC_MEMORY

#if (defined(HAVE_ECC) && !defined(ALT_ECC_SIZE)) \
|| defined(SESSION_CERTS)
/* big enough to handle most cases including session certs */
byte memory[320000];
#else
byte memory[80000];
#endif
byte memoryIO[34500]; /* max for IO buffer (TLS packet can be 16k) */
WOLFSSL_MEM_CONN_STATS ssl_stats;
#ifdef DEBUG_WOLFSSL
WOLFSSL_MEM_STATS mem_stats;
#endif

#endif

#ifdef WOLFSSL_STATIC_MEMORY

if (wolfSSL_CTX_load_static_memory(&ctx, method, memory, sizeof(memory),
0, 1) != WOLFSSL_SUCCESS) {
err_sys(“unable to load static memory”);
}

 

if (wolfSSL_CTX_load_static_memory(&ctx, NULL, memoryIO, sizeof(memoryIO),
WOLFMEM_IO_POOL_FIXED | WOLFMEM_TRACK_STATS, 1) != WOLFSSL_SUCCESS) {
err_sys(“unable to load static memory”);
}

#else

ctx = wolfSSL_CTX_new(method(NULL));

#endif

静的メモリー割り当てのさらに詳しい内容については、静的バッファ割り当てドキュメントページ(英語)をご覧ください。いくつかの、特にOpenSSL互換レイヤのAPIは静的メモリーバッファの利用をサポートしていないものもありリストが掲載されています。併せて参照ください。

 

今回は静的メモリー割り当ての仕組みについて紹介しました。静的メモリーバッファを冒頭で用意するという特性上、動的メモリー割り当てと比較し多くのメモリーを消費する可能性があります。使用に際してはその特性を理解しお使い下さい。静的メモリー割り当ての使用に際し、ご質問等ありましたら、お気軽にsupport@wolfssl.com までお知らせください。