/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 /kernel
der 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 /kernel
werden:
/arch:SSE
,/arch:SSE2
,/arch:AVX
,/arch:AVX2
und/arch:AVX512
werden auf x86 nicht unterstützt. Wird nur/arch:IA32
mit/kernel
x86 unterstützt./arch:AVX
,/arch:AVX2
und/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
Objnicht-obj /kernel
, MASM obj oder cvtres objMischung 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
Ö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).
Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.
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