/kernel (Binärdatei für den Kernelmodus erstellen)

Erstellt eine Binärdatei, die im Windows-Kernel ausgeführt werden kann. Der Code im aktuellen Projekt wird mithilfe einer vereinfachten Gruppe von C++-Sprachfeatures kompiliert und verknüpft, die spezifisch für Code sind, der im Kernelmodus ausgeführt wird.

Syntax

/kernel

Hinweise

Wenn Sie die /kernel Option angeben, wird der Compiler und der Linker an die Vermittlung der zulässigen Sprachfeatures im Kernelmodus informiert und sicherstellen, dass Sie über ausreichende Ausdruckskraft verfügen, um Laufzeitinstabilität zu vermeiden, die für den Kernelmodus C++ eindeutig ist. Dies geschieht, indem sie die Verwendung von C++-Sprachfeatures verbieten, die im Kernelmodus störend sind. Der Compiler erzeugt Warnungen für C++-Sprachfeatures, die potenziell störend sind, aber nicht deaktiviert werden können.

Die /kernel Option gilt sowohl für die Compiler- als auch die Linkerphasen eines Builds und wird auf Projektebene festgelegt. Übergeben Sie den /kernel Switch, um an den Compiler anzugeben, dass die resultierende Binärdatei nach dem Verknüpfen in den Windows-Kernel geladen werden soll. Der Compiler schränkt das Spektrum der C++-Sprachfeatures auf eine Teilmenge ein, die mit dem Kernel kompatibel ist.

In der folgenden Tabelle sind Änderungen des Compilerverhaltens aufgeführt, wenn /kernel angegeben wird.

Verhaltenstyp Verhalten von /kernel
C++-Ausnahmebehandlung Deaktiviert. Alle Instanzen und throw try Schlüsselwörter geben einen Compilerfehler aus (mit Ausnahmespezifikation throw()). Es sind keine /EH Optionen kompatibel mit /kernel, mit Ausnahme von /EH-.
RTTI Deaktiviert. Alle Instanzen und dynamic_cast typeid Schlüsselwörter geben einen Compilerfehler aus, es sei denn dynamic_cast , sie werden statisch verwendet.
new und delete Sie müssen den Operator delete() oder den new() Operator explizit definieren. Der Compiler und die Laufzeit geben keine Standarddefinition an.

Benutzerdefinierte Aufrufkonventionen, die /GS Buildoption und alle Optimierungen sind zulässig, wenn Sie die /kernel Option verwenden. Inlining wird weitgehend nicht von /kernelder gleichen Semantik beeinflusst, die vom Compiler berücksichtigt wird. Wenn Sie sicherstellen möchten, dass der __forceinline Inliningqualifizierer berücksichtigt wird, müssen Sie sicherstellen, dass die Warnung C4714 aktiviert ist, damit Sie wissen, wann eine bestimmte __forceinline Funktion nicht inlined ist.

Es gibt keine #pragma Entsprechung zum Steuern dieser Option.

Wenn der Compiler den /kernel Switch übergeben wird, wird ein Präprozessormakro vordefiniert, das benannt _KERNEL_MODE ist und den Wert 1 aufweist. Sie können dieses Makro verwenden, um Code bedingt zu kompilieren, basierend darauf, ob sich die Ausführungsumgebung im Benutzermodus oder im Kernelmodus befindet. Der folgende Code gibt z. B. an, dass sich die MyNonPagedClass Klasse in einem nicht aussseitigen Speichersegment befinden soll, wenn sie für die Ausführung des Kernelmodus kompiliert wird.

#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif

class NONPAGESECTION MyNonPagedClass
{
   // ...
};

Einige der folgenden Kombinationen der Zielarchitektur und die /arch Option erzeugen einen Fehler, wenn sie verwendet /kernelwerden:

  • /arch:SSE, /arch:SSE2, /arch:AVX, /arch:AVX2und /arch:AVX512 werden auf x86 nicht unterstützt. Wird nur /arch:IA32 mit /kernel x86 unterstützt.

  • /arch:AVX, /arch:AVX2und /arch:AVX512 werden von x64 nicht unterstützt /kernel .

Gebäude mit /kernel auch übergibt /kernel an den Linker. So wirkt sich die Option auf das Linkerverhalten aus:

  • Die inkrementelle Verknüpfung ist deaktiviert. Wenn Sie der Befehlszeile hinzufügen /incremental , gibt der Linker diesen schwerwiegenden Fehler aus:

    schwerwiegender Fehler LNK1295: "/INKREMENTELL" nicht kompatibel mit der Spezifikation "/KERNEL"; Link ohne '/INKREMENTELL'

  • Der Linker prüft jede Objektdatei (oder ein enthaltenes Archivelement aus statischen Bibliotheken), um festzustellen, ob sie mithilfe der /kernel Option kompiliert werden könnte, aber nicht. Wenn Instanzen dieses Kriterium erfüllen, wird der Linker weiterhin erfolgreich verknüpft, kann jedoch eine Warnung ausgeben, wie in der folgenden Tabelle dargestellt.

    Get-Help /kernel Obj nicht-obj/kernel , MASM obj oder cvtres obj Mischung aus /kernel und Nicht-Objs/kernel
    link /kernel Ja Ja Ja mit Warnung LNK4257
    link Ja Ja Ja

    LNK4257 Verknüpfungsobjekt nicht mit /KERNEL kompiliert; Image kann nicht ausgeführt werden

Die /kernel Option und die /driver Option funktionieren unabhängig. Sie haben keine Auswirkungen auf einander.

So legen Sie die Option "/kernel compiler" in Visual Studio fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten für das Projekt. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.

  3. Fügen Sie im Feld "Zusätzliche Optionen " hinzu /kernel. Wählen Sie OK oder Übernehmen, um die Änderungen zu speichern.

Siehe auch

MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile