KeMemoryBarrier-Funktion (wdm.h)
Die KeMemoryBarrier-Routine erzeugt an ihrer Position im Code eine Barriere, über die der Compiler und der Prozessor keine Vorgänge verschieben können.
Syntax
void KeMemoryBarrier();
Rückgabewert
Keine
Bemerkungen
Die KeMemoryBarrier-Routine fügt eine Speicherbarriere in Ihren Code ein. Diese Barriere garantiert, dass jeder Vorgang, der vor dem Aufruf von KeMemoryBarrier im Quellcode 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 als die folgende Inlinefunktion:
FORCEINLINE
VOID
KeMemoryBarrier (
VOID
)
{
LONG Barrier;
__asm {
xchg Barrier, eax
}
}
In dieser Definition enthalten die Klammern, die dem __asm folgen, Schlüsselwort (keyword) Inlineassemblycode. Der Compileroptimierer kann eine Anweisung nicht von einer Position vor dem Inlineassemblycode in eine Position nach dem Inlineassemblycode verschieben und umgekehrt. Darüber hinaus enthält die xchg-Anweisung implizit das Sperrpräfix , das die Prozessorhardware zwingt, die Speichervorgänge für alle Anweisungen abzuschließen, die der xchg-Anweisung vorangehen, bevor sie Speichervorgänge für Anweisungen initiiert, die der xchg-Anweisung folgen.
KeMemoryBarrier verhindert, dass sowohl der Compiler als auch der Prozessor Vorgänge über die Barriere verschieben. Um zu verhindern, dass nur der Compiler Vorgänge verschiebt, rufen Sie KeMemoryBarrierWithoutFence auf.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Desktop |
Header | wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Beliebige Ebene |