KeMemoryBarrier 関数 (wdm.h)
KeMemoryBarrier ルーチンは、コンパイラとプロセッサが操作を移動できないコード内の位置にバリアを作成します。
構文
void KeMemoryBarrier();
戻り値
なし
解説
KeMemoryBarrier ルーチンは、コードにメモリ バリアを挿入します。 このバリアにより、 KeMemoryBarrier の呼び出しの前にソース コードに表示されるすべての操作が、呼び出し後に表示される操作の前に完了することが保証されます。
KeMemoryBarrier ルーチンの実装は、プロセッサ アーキテクチャによって異なります。 たとえば、x86 プロセッサの場合、Wdm.h ヘッダー ファイルは KeMemoryBarrier を次のインライン関数として定義します。
FORCEINLINE
VOID
KeMemoryBarrier (
VOID
)
{
LONG Barrier;
__asm {
xchg Barrier, eax
}
}
この定義では、__asmに続く中かっこキーワード (keyword)インライン アセンブリ コードが含まれています。 コンパイラ オプティマイザーは、インライン アセンブリ コードの前の位置からインライン アセンブリ コードの後の位置に命令を移動することはできません。その逆も可能です。 さらに、xchg 命令には暗黙的にロック プレフィックスが含まれています。これにより、xchg 命令に従う命令のメモリ操作を開始する前に、xchg 命令の前にあるすべての命令のメモリ操作がプロセッサ ハードウェアに強制的に完了されます。
KeMemoryBarrier は、コンパイラとプロセッサの両方がバリアを越えて操作を移動できないようにします。 コンパイラのみが操作を移動できないようにするには、 KeMemoryBarrierWithoutFence を呼び出します。
要件
要件 | 値 |
---|---|
対象プラットフォーム | デスクトップ |
Header | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
IRQL | 任意のレベル |