AR# 53694

PetaLinux - 64 バイト未満のメモリを割り当てた場合にメモリ リークが発生する

説明

PetaLinux versions 3.1、12.09 および 12.12 で、64 バイト未満のメモリを割り当てた場合にメモリ リークが発生します。

ソリューション

背景:
メモリは正しく割り当てられますが、それに続く malloc から返されたメモリへのポインターに対する free(p) で fastbin リストにメモリが追加されず、その後の 64 バイト未満の malloc でこのメモリを使用できず、新しいメモリが割り当てられます。
64 バイト以上のメモリの割り当ておよび解放では問題は発生しません。
回避策 :
この問題は MicroBlaze ツール チェーンで発生し、次の PetaLinux リリースで修正される予定です。
この問題を回避するには、malloc 呼び出しの前に次を呼び出して、小さいメモリに対する fastbins の使用をディスエーブルにします。
mallopt( M_MXFAST, 0 );
別の方法として、ユーザーは M_MMAP_THRESHOLD を 0 まで下げることが可能で、これによりすべてのメモリ割り当てに mmap syscall を使用するように malloc を調整します (一般に >= ~128K バイトよりも大きいメモリの割り当てにのみ使用)。mallopt によってしきい値を 0 バイトに設定して fastbin の使用を回避します。

mallopt( M_MMAP_THRESHOLD, 0 );

または環境変数をエクスポートします。

export MALLOC_MMAP_THRESHOLD_=0

(最後に '_' が続く)
すべてのメモリ割り当てに mmap を用いると、brk を使用するよりもカーネルにとって不経済なタスクとなり、割り当てが解除されている空間を将来的な割り当てに再利用できなくなります。ただし、この方法にはアプリケーション プログラムを変更せず、単に環境変数を設定することでイネーブルにできるという利点があります。
AR# 53694
日付 01/21/2013
ステータス アクティブ
種類 一般
ツール 詳細 概略