/kernel (vytvoření binárního režimu jádra)
Vytvoří binární soubor, který lze spustit v jádru Windows. Kód v aktuálním projektu se zkompiluje a propojil pomocí zjednodušené sady funkcí jazyka C++, které jsou specifické pro kód, který běží v režimu jádra.
Syntaxe
/kernel
Poznámky
Zadáním /kernel
možnosti kompilátoru a linkeru určíte, které jazykové funkce jsou v režimu jádra přípustné, a ujistěte se, že máte dostatek expresního výkonu, abyste zabránili nestabilitě za běhu, která je jedinečná pro režim jádra C++. To se provádí zakázáním používání jazykových funkcí jazyka C++, které jsou rušivé v režimu jádra. Kompilátor generuje upozornění pro funkce jazyka C++, které mohou být rušivé, ale nedají se zakázat.
Tato /kernel
možnost se vztahuje na fáze kompilátoru i linkeru sestavení a je nastavena na úrovni projektu. /kernel
Předejte přepínač, který označuje kompilátoru, že výsledný binární soubor po propojení by měl být načten do jádra Systému Windows. Kompilátor zužuje spektrum funkcí jazyka C++ na podmnožinu, která je kompatibilní s jádrem.
Následující tabulka uvádí změny chování kompilátoru při /kernel
zadání.
Typ chování | /kernel chování |
---|---|
Zpracování výjimek jazyka C++ | Deaktivováno. Všechny instance a throw try klíčová slova generují chybu kompilátoru (s výjimkou specifikace throw() výjimky). Žádné /EH možnosti nejsou kompatibilní s /kernel výjimkou /EH- . |
RTTI | Deaktivováno. Všechny instance dynamic_cast a typeid klíčová slova generují chybu kompilátoru, pokud dynamic_cast se nepoužívá staticky. |
new a delete |
Musíte explicitně definovat new() operátor nebo delete() operátor. Kompilátor a modul runtime nezadá výchozí definici. |
Vlastní konvence volání, /GS
možnost sestavení a všechny optimalizace jsou povoleny při použití /kernel
této možnosti. Inlining není z velké části ovlivněn /kernel
, se stejnou sémantikou ctěnou kompilátorem. Pokud se chcete ujistit, že __forceinline
je splněný inlinovací kvalifikátor, musíte se ujistit, že je povolené upozornění C4714 , abyste věděli, kdy __forceinline
konkrétní funkce není vložená.
Neexistuje žádný #pragma
ekvivalent k řízení této možnosti.
Když kompilátor předá /kernel
přepínač, předdefinuje předdefinované makro preprocesoru s názvem _KERNEL_MODE
a má hodnotu 1. Toto makro můžete použít k podmíněné kompilaci kódu na základě toho, jestli je spouštěcí prostředí v uživatelském režimu nebo v režimu jádra. Například následující kód určuje, že MyNonPagedClass
třída by měla být v nestránitelném segmentu paměti při kompilaci pro spuštění režimu jádra.
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
// ...
};
Některé z následujících kombinací cílové architektury a možnosti /arch
generují chybu při jejich použití /kernel
:
/arch:SSE
, ,/arch:SSE2
/arch:AVX
,/arch:AVX2
a/arch:AVX512
nejsou podporovány na platformě x86. V x86 se podporuje/kernel
pouze/arch:IA32
./arch:AVX
,/arch:AVX2
a/arch:AVX512
nejsou podporovány v/kernel
platformě x64.
Budova s /kernel
také projde /kernel
linkerem. Tady je postup, jak tato možnost ovlivňuje chování linkeru:
Přírůstkové propojení je zakázané. Pokud přidáte
/incremental
do příkazového řádku, linker vygeneruje tuto závažnou chybu:Závažná chyba LNK1295: /INCREMENTAL není kompatibilní se specifikací /KERNEL; propojení bez /PŘÍRŮSTKOVÉ
Linker zkontroluje každý soubor objektu (nebo jakýkoli zahrnutý člen archivu ze statických knihoven) a zjistí, jestli mohl být zkompilován pomocí
/kernel
možnosti, ale nebyl. Pokud některé instance splňují toto kritérium, linker stále úspěšně propojí, ale může vydat upozornění, jak je znázorněno v následující tabulce.Příkaz /kernel
Obj/kernel
bez obj, MASM obj nebo cvtres objMix of /kernel
and non-objs/kernel
link /kernel
Ano Yes Ano s upozorněním LNK4257 link
Ano Ano Yes LNK4257 propojení objektu, který není kompilován pomocí /KERNEL; Image se nemusí spustit
Možnost /kernel
a /driver
možnost fungují nezávisle. Nemají na sebe žádný vliv.
Nastavení možnosti kompilátoru /kernel v sadě Visual Studio
Otevřete dialogové okno Stránky vlastností projektu. Další informace naleznete v tématu Nastavení kompilátoru jazyka C++ a vlastností sestavení v sadě Visual Studio.
Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.
Do pole Další možnosti přidejte
/kernel
. Změny uložíte kliknutím na OK nebo Použít .
Viz také
Parametry kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC