KeMemoryBarrier-Funktion (wdm.h)
Die KeMemoryBarrier Routine erstellt an seiner Position im Code eine Barriere , über die der Compiler und der Prozessor keine Vorgänge verschieben können.
Syntax
void KeMemoryBarrier();
Rückgabewert
Nichts
Bemerkungen
Die KeMemoryBarrier Routine fügt eine Speicherbarriere in Ihren Code ein. Diese Barriere garantiert, dass jeder Vorgang, der im Quellcode vor dem Aufruf von KeMemoryBarrier angezeigt wird, vor jedem Vorgang abgeschlossen wird, der nach dem Aufruf angezeigt wird.
Die Implementierung der KeMemoryBarrier Routine hängt von der Prozessorarchitektur ab. Beispielsweise definiert die Wdm.h-Headerdatei für einen x86-Prozessor KeMemoryBarrier die folgende Inlinefunktion:
FORCEINLINE
VOID
KeMemoryBarrier (
VOID
)
{
LONG Barrier;
__asm {
xchg Barrier, eax
}
}
In dieser Definition enthalten die geschweiften Klammern, die dem __asm Schlüsselwort folgen, Inlineassemblycode. Der Compileroptimierer kann eine Anweisung nicht von einer Position vor dem Inlineassemblycode an eine Position nach dem Inlineassemblycode verschieben und umgekehrt. Darüber hinaus enthält die xchg- Anweisung implizit das präfix Lock, wodurch die Prozessorhardware gezwungen wird, die Speichervorgänge für alle Anweisungen auszuführen, die der xchg--Anweisung vorausgehen, bevor Speichervorgänge für Anweisungen initiiert werden, die den xchg Anweisung folgen.
KeMemoryBarrier verhindert, dass sowohl der Compiler als auch der Prozessor Vorgänge über die Barriere verschieben. Rufen Sie KeMemoryBarrierWithoutFence-auf, um zu verhindern, dass nur der Compiler Vorgänge verschiebt.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Desktop |
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL- | Beliebige Ebene |