EN JA
MEMGUARD(9)
MEMGUARD(9) FreeBSD Kernel Developer's Manual MEMGUARD(9)

名称

MemGuardデバッグ目的のためのメモリアロケータ

書式

options DEBUG_MEMGUARD

解説

MemGuard は、tamper-after-free (変更した後で解放する) シナリオを検出することを助けるように設計された簡単で小さい置換メモリアロケータです。これらの問題は、競合条件がより一般的であるマルチスレッド化されたカーネルでますます共通であり得ることです。

MemGuard は、単一の malloc タイプのための malloc(), realloc() と free() に取って代わることできます。また、 MemGuard は、単一の uma ゾーンのために uma_zalloc(), uma_zalloc_arg() と uma_free() に取って代わることできます。また、 MemGuard は、 PAGE_SIZE より大きなすべての割り付けを保護することができ、すべての割り付けのランダムな断片を保護することができます。また、メモリの消耗を制限して保護される指定されたサイズより小さい割り付けを防ぐためのノブがあります。

使用例

メモリタイプのために MemGuard を使用するために、 /boot/loader.conf にエントリに次のいずれかを追加します:

vm.memguard.desc=<memory_type>

または、実行時に vm.memguard.desc sysctl(8) 変数を設定します:

sysctl vm.memguard.desc=<memory_type>

ここで、 memory_type は、モニタするメモリタイプの短い記述、または uma(9) ゾーンの名前のいずれかを指定できます。 vm.memguard.desc が設定された後に、行われた memory_type からの割り付けだけが、潜在的に保護されます。 vm.memguard.desc が実行時に変更されるなら、いったん sysctl(8) が設定されると、新しい memory_type の割り付けだけが潜在的に保護されます。既存の保護された割り付けは、まだ、どのような種類の割り付けが取って代わられたによって、 free(9) または uma_zfree(9) のいずれかによって適切に解放されます。

malloc(9) タイプの短い記述を決定するために、 vmstat(8) -m 出力の最初のカラムからそれを取るか、またはカーネルのソースに、それを見つけることができます。それは、 MALLOC_DEFINE(9) マクロの 2 番目の引数です。 uma(9) ゾーンの名前を決定するために、 vmstat(8) -z 出力の最初のカラムからそれを取るか、カーネルのソースに、それを見つけることができます。それは、 uma_zcreate(9) 関数の最初の引数です。

vm.memguard.divisor ブート時調整変数は、どのくらい MemGuard が消費できるか、システムの物理的なメモリを見積もるために使用されます。デフォルトは、10 であるので、最大 cnt.v_page_count/10 ページを使用することができます。 MemGuard は、物理的なメモリサイズの 2 倍に制限される、仮想アドレス空間の vm_kmem_max / vm.memguard.divisor バイトを予約します。物理的な制限は、 vm.memguard.phys_limit として報告され、 MemGuard のために予約された仮想空間は、 vm.memguard.mapsize として報告されます。

MemGuard は、 vm.memguard.minsize バイトより小さいどんな割り付けのためにもページの推進を行いません。デフォルトは、潜在的にすべての割り付けを保護できることを意味する、0 です。 MemGuard は、100000 / vm.memguard.frequency の割り付けのすべての平均的な頻度がある十分大きいランダムな割り付けを保護できます。デフォルトは、割り付けがランダムに保護されることを意味する、0 です。

MemGuard は、 vm.memguard.options に 1 ビット設定しているなら、オーバフローとアンダフローを検出するために各割り付けの周りにオプションで、マップされない保護ページを追加することができます、このオプションは、デフォルトで有効にされます。 MemGuard は、 vm.memguard.options に 2 ビット設定しているなら、オプションで、 PAGE_SIZE 以上のすべての割り付けを保護します。このオプションは、デフォルトでオフにされます。デフォルトで、 MemGuard は、偽の positive を作成することができるので、 UMA_ZONE_NOFREE フラグセットで初期化された uma(9) ゾーンを保護しません。訳注: positive の意味不明。しかしながら、 vm.memguard.options 調整変数のビット 3 を設定することによって、この安全対策をオフに切り替えることができます。

歴史

MemGuard は、 FreeBSD 6.0 ではじめて登場しました。

作者

MemGuard は、最初に Bosko Milekic <bmilekic@FreeBSD.org>によって書かれました。このマニュアルページは、最初に Christian Brueffer <brueffer@FreeBSD.org>によって書かれました。実装と文書の両方は、 Matthew Fleming <mdf@FreeBSD.org>と Gleb Smirnoff <glebius@FreeBSD.org>によって追加されました。

バグ

例えば、 uma_find_refcnt() のように、 uma_zalloc() と uma_free() を別にして追加のインタフェースを利用する、 uma(9) から割り付けられることをそれら自体が実際に期待する割り付けを保護することはできません。 mbuf(9) だけを書くに当たって、クラスタゾーンは、その種類の割り付けに属します。それらを保護する試みは、カーネルパニックを導きます。
October 21, 2011 FreeBSD