Share via


/kernel (Create Kernel Mode Binary)

Stellt eine Binärdatei erstellt, die im Windows-Kernel ausgeführt werden kann.

/kernel[-]

Argumente

  • /kernel
    Der Code im aktuellen Projekt wird kompiliert und verknüpft mithilfe eines Satzes C++-Sprachregeln, die spezifisch sind, die zu codieren, wird im Kernelmodus.

  • /kernel-
    Der Code im aktuellen Projekt wird kompiliert und verknüpft, ohne die C++-Sprachregeln zu verwenden, die spezifisch sind, die zu codieren, wird im Kernelmodus.

Hinweise

Es gibt keine #pragma Entsprechung, um diese Option zu steuern.

Die Option /kernel angibt, weist den Compiler und Linker mit, um zu übergeben, welche Sprachfunktionen im Kernelmodus und Überprüfen zulässig sind ob die Sie genügend Ausdruckskraft haben, Ablaufinstabilität zu vermeiden, die zum Kernelmodus C++ eindeutig ist.Dies ist, indem Sie die Verwendung von C++ verhindert, erreicht, die im Kernelmodus störend sind und das Warnungen für C++ bereitstellen, die möglicherweise störend sind, jedoch, kann nicht deaktiviert werden.

Die /kernel Option gilt die Compiler- und Linkerphasen eines Build zu und ist auf Projektebene festgelegt.Führen Sie den /kernel Schalter, um dem Compiler anzugeben, den die sich ergebende Binärdatei, nachdem verknüpft ist, in den Windows-Kernel geladen werden soll.Der Compiler schränkt das Spektrum von C++ für eine Teilmenge von ein, die mit dem Kernel kompatibel ist.

In der folgenden Tabelle sind Änderungen im Compilerverhalten auf, wenn /kernel angegeben wird.

Verhaltens-Typ

/kernel Verhalten

C++-Ausnahmebehandlung

Deaktiviert.Alle Instanzen der throw und try Schlüsselwörter geben einen Compilerfehler ausgelöst (außer der Ausnahmespezifikation throw()).Keine /EH Optionen sind mit /kernel, außer /EH- kompatibel.

RTTI

Deaktiviert.Alle Instanzen der dynamic_cast und typeid Schlüsselwörter geben einen Compilerfehler ausgelöst, es sei denn, dynamic_cast statisch verwendet wird.

new und delete

Sie müssen den new() oder delete()-Operator explizit definieren; weder stellen der Compiler noch die Laufzeit eine Standarddefinition.

Benutzerdefinierte Aufrufkonventionen, die /GS Buildoption und alle Optimierungen sind zulässig, wenn Sie die Option /kernel verwenden.Inlining wird größtenteils nicht von /kernel beeinflusst, wenn dieselbe Semantik durch den Compiler berücksichtigt ist.Wenn Sie sicherstellen möchten, dass der __forceinline Inliningqualifizierer berücksichtigt wird, ob müssen Sie die Warnung von C4714 überprüfen, aktiviert ist, damit Sie wissen, wann eine bestimmte __forceinline-Funktion nicht inline ist.

Wenn dem Compiler der /kernel Schalter übergeben wird, wird er ein Präprozessormakro vor, das _KERNEL_MODE benannt und den Wert 1 hat.Sie können dieses verwenden, um Code auf Grundlage bedingt zu kompilieren, ob die Ausführungsumgebung im Benutzermodus oder Kernelmodus im ist.Im folgenden Code werden beispielsweise an, dass die - Klasse in einem residenten Arbeitsspeichersegment sein muss, wenn sie für Kernelmodusausführung 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 der /arch Option erzeugen einen Fehler, wenn sie mit /kernel verwendet werden:

  • /arch:{SSE|SSE2|AVX} werden nicht auf x86 unterstützt.Nur /arch:IA32 wird mit /kernel auf x86 unterstützt.

  • /arch:AVX wird nicht mit /kernel auf x64 unterstützt.

Erstellen mit /kernel führt auch /kernel an den Linker.Hers, wie dieses Linkerverhalten beeinflusst:

  • Inkrementelles Verknüpfen ist deaktiviert.Wenn Sie /incremental der Befehlszeile hinzufügen, generiert der Linker diesen schwer wiegender Fehler aus:

    LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'

  • Der Linker untersucht jede Objektdatei (oder einen enthaltenden Archivmember von statischen Bibliotheken) um festzustellen, ob er kompiliert werden kann, indem die /kernel Option verwendet wurde, war jedoch nicht.Wenn eine können Instanzen dieses Kriterium erfüllen, die Links des Linkers noch erfolgreich jedoch eine Warnung, wie in der folgenden Tabelle gezeigt.

    /kernel obj

    /kernel- obj, MASM-obj oder cvtresed

    Mischung von /kernel und von /kernel- objs

    link /kernel

    Ja

    Ja

    Ja mit dem Warnung von LNK4257

    link

    Ja

    Ja

    Ja

    LNK4257 linking object not compiled with /KERNEL ; image may not run

Die /kernel Option und die Option /driver funktionieren unabhängig und auch nicht beeinflusst der andere.

Um die Compileroption /kernel- in Visual Studio fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten für das Projekt.Weitere Informationen finden Sie unter Gewusst wie: Öffnen von Projekteigenschaftenseiten.

  2. Wählen Sie den C/C++ Ordner aus.

  3. Wählen Sie die Eigenschaftenseite Befehlszeile aus.

  4. Im Feld Zusätzliche Optionen fügen Sie /kernel oder /kernel- hinzu.

Siehe auch

Referenz

Compileroptionen

Festlegen von Compileroptionen