Sdílet prostřednictvím


/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 throwtry 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:AVX512 nejsou podporovány na platformě x86. V x86 se podporuje /kernel pouze/arch:IA32.

  • /arch:AVX, /arch:AVX2a /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 obj Mix of /kernel and non-objs/kernel
    link /kernel Ano Ano Ano s upozorněním LNK4257
    link Ano Ano Ano

    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

  1. 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.

  2. Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.

  3. 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