Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:AVX512werden auf x86 nicht unterstützt. Wird nur/arch:IA32mit/kernelx86 unterstützt./arch:AVX,/arch:AVX2und/arch:AVX512werden 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
/kernelOption 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 /kernelObjnicht-obj /kernel, MASM obj oder cvtres objMischung aus /kernelund Nicht-Objs/kernellink /kernelJa Ja Ja mit Warnung LNK4257 linkJa 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