
EspressifデバイスでwolfSSLを使用する際、ヒープ操作にPSRAM(Pseudo-static RAM, 疑似SRAM)を使えるようになりました。
この改善により、暗号処理のためにより広いメモリ容量を使用できるようになるだけでなく、ESP32やその他のEspressifベースのプラットフォーム上でより安定的・スケーラブルなTLS通信の基盤を築けるようになります。
なぜ、より安定すると言えるのでしょうか
一部のESP32チップタイプでは、コンパクトなRAMが採用されています。この上で大規模なアプリケーションを動作させていると、暗号化通信のために使用できるメモリ領域がほとんど残らない場合があります。そうすると、ヒープ破損やスタックオーバーフローが発生し、望ましくない安定性の問題を引き起こしてしまいます。
PSRAMを使用することでメモリ空間に余裕をもたせ、これらの問題を回避できるようになります。
どのような変更が加えられたのでしょうか
最近のGitHub Pull Request #8987にて、wolfSSLの動的メモリ割り当てルーチンが拡張PSRAMリージョンを活用できるようにする一連の機能強化を導入しています。
これは、外部PSRAMをサポートするESP32-WROVER、ESP32-C3、ESP32-S3などのプラットフォームで特に有用です。
アップデートの主な内容は次のとおりです。
カスタムアロケータの統合
wolfSSLは、デフォルトのFreeRTOS pvPortMalloc()またはrealloc()呼び出しにフォールバックする前に、wolfSSL_GetAllocators()を使用してアプリケーション定義のメモリアロケータをチェックできるようになりました。
例えば、これらの#define文をwolfSSL user_settings.hファイルに追加します。
#define XMALLOC_USER
#define XFREE MY_FREE
#define XMALLOC MY_MALLOC
次に、アプリケーションでカスタムFREEとMALLOCを実装します。
void MY_FREE(void *p, void* heap, int type)
{
free(p);
}
void* MY_MALLOC(size_t sz, void* heap, int type)
{
return malloc(sz);
}
このメカニズムにより、アプリがPSRAMにマップするヒープアロケータを定義する場合(例: heap_caps_malloc(..., MALLOC_CAP_SPIRAM)経由)、wolfSSLはそれを使用します。
XREALLOC / XMALLOC / XFREEラッパーの更新
カスタムメモリマクロ(XMALLOC、XFREE、XREALLOC)が、esp_sdk_mem_lib.cの新しいPSRAM対応バージョンにリダイレクトするよう更新しました。デバッグバージョンも追加しています。
#define XMALLOC(s, h, type) \
wc_pvPortMalloc((s)) // PSRAM対応アロケータを使用
デバッグしやすいメモリトレース
メモリ使用量をデバッグする開発者のために、詳細な割り当てログを追加しました。DEBUG_WOLFSSLまたはDEBUG_WOLFSSL_MALLOCを定義することで有効化できます。これにより、メモリが限られているシステムでリーク、誤割り当て、断片化を捕捉しやすくなります。
ESP_LOGE("malloc", "Failed Allocating memory of size: %d bytes", size);
PSRAM統合の利点
制約の厳しい組み込みシステムでは、TLSセッションの実行、証明書の解析、大きなバッファの処理時に、メモリ制限に直面することがよくあります。
wolfSSLでPSRAM使用を有効にすることには、以下のメリットがあります。
- より大きなTLSバッファ
ヒープ枯渇なしに、より大きなI/Oバッファとより長い証明書チェーンを許容できるようになります。 - より強力なセキュリティ
余剰メモリが少ない環境においても、TLS 1.3などの機能を有効にしやすくなります。 - スケーラビリティ
メモリ制約のあるMCU上で、より多くの同時接続やセッションを処理できるようになります。 - デバッグサポート
オプションのデバッグビルドで、ファイル/行/関数情報を使用しながら、割り当てと再割り当ての失敗を追跡できるようになります。
有効化する方法
ESP-IDF上でwolfSSLを使用し、プロジェクトでPSRAMが構成されている場合、この統合は自動的に行われます。
最大限に活用するには、次の手順に従ってください。
menuconfigを介して、ビルドでPSRAMを有効にします。
Component config – ESP32-specific – Support for external – SPI-connected RAM
オプションで、PSRAMをターゲットとするheap_caps_malloc()を使用してカスタムアロケータを実装します。
void* my_malloc(size_t sz) {
return heap_caps_malloc(sz, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
}
アロケータを登録します。
wolfSSL_SetAllocators(my_malloc, my_free, my_realloc);
注意: CONFIG_LWIP_MAX_SOCKETSを超えるソケットを開くべきではありません。
例:
#ifndef NO_WOLFSSL_MEMORY
static void *custom_malloc(size_t size) {
void* this_custom_malloc;
this_custom_malloc = heap_caps_malloc(size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
return this_custom_malloc;
}
static void* custom_realloc(void* ptr, size_t size) {
void* this_custom_realloc;
this_custom_realloc = heap_caps_realloc(ptr, size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
return this_custom_realloc;
}
static void custom_free(void *ptr) {
heap_caps_free(ptr);
}
#endif
次に、アプリケーション内部でwolfSSL_SetAllocatorsを使用します。
#if defined(NO_WOLFSSL_MEMORY)
ESP_LOGE(TAG, "Cannot use wolfSSL_SetAllocators with NO_WOLFSSL_MEMORY");
#else
wolfSSL_SetAllocators((wolfSSL_Malloc_cb)custom_malloc,
(wolfSSL_Free_cb)custom_free,
(wolfSSL_Realloc_cb)custom_realloc);
#endif
esp_err_t error = heap_caps_register_failed_alloc_callback(heap_caps_alloc_failed_hook);
if (error == ESP_OK) {
ESP_LOGE(TAG, "Success: heap_caps_register_failed_alloc_callback");
}
else {
ESP_LOGE(TAG, "FAILED: heap_caps_register_failed_alloc_callback");
}
テスト済みプラットフォーム
この変更は、以下を含むEspressif ESP-IDFプラットフォーム上で適切に動作するように調整しています。
- ESP32-WROVER
- ESP32-S3
- ESP32-C3(PSRAM付き)
- 外部SPI RAMを搭載した任意のモジュール
謝辞
この機能を提案し、サンプルコードを提供、そしてテストを支援してくださったFidelさんに感謝します。
ESP32上で50個の同時FreeRTOSタスクを実行し、それぞれでwolfSSLの耐量子アルゴリズムで通信することに成功されました。素晴らしいです!
Ing. Fidel Alejandro Rodríguez Corbo, Phd
Smart Electronics Research Group
School of Engineering and Science
Tecnologico de Monterrey,
Av. Eugenio Garza Sada 2501 Sur
Col. Tecnológico, C.P. 64849
Monterrey, Nuevo León, México
最後に
このパッチにより、制約のある環境においてさらに快適にwolfSSLを使用できるようになりました。PSRAMサポートにより、開発者は限られた内部RAMから暗号化操作をオフロードでき、安定性とパフォーマンスの両方を向上させることができます。
さらなる詳細については、Espressif向けのREADMEファイルをご覧ください。
ご質問がございましたら、ぜひ info@wolfssl.jp までお問い合わせください。
原文:https://www.wolfssl.com/utilizing-psram-for-wolfssl-heap-operations-for-the-espressif-esp32
