Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 /kernelvý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:AVX2a/arch:AVX512nejsou podporovány na platformě x86. V x86 se podporuje/kernelpouze/arch:IA32./arch:AVX,/arch:AVX2a/arch:AVX512nejsou podporovány v/kernelplatformě 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
/incrementaldo 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í
/kernelmož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 /kernelObj/kernelbez obj, MASM obj nebo cvtres objMix of /kerneland non-objs/kernellink /kernelAno Yes Ano s upozorněním LNK4257 linkAno 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