Udostępnij za pośrednictwem


/kernel (Utwórz plik binarny trybu jądra)

Tworzy plik binarny, który można wykonać w jądrze systemu Windows. Kod w bieżącym projekcie jest kompilowany i połączony przy użyciu uproszczonego zestawu funkcji języka C++, które są specyficzne dla kodu uruchamianego w trybie jądra.

Składnia

/kernel

Uwagi

Określenie /kernel opcji nakazuje kompilatorowi i konsolidatorowi arbitrowanie, które funkcje języka są dopuszczalne w trybie jądra, oraz aby upewnić się, że masz wystarczającą moc ekspresową, aby uniknąć niestabilności środowiska uruchomieniowego, która jest unikatowa dla trybu jądra C++. Dzieje się tak, zabraniając używania funkcji języka C++, które zakłócają działanie w trybie jądra. Kompilator generuje ostrzeżenia dotyczące funkcji języka C++, które są potencjalnie destrukcyjne, ale nie można ich wyłączyć.

Opcja /kernel ma zastosowanie zarówno do faz kompilatora, jak i konsolidatora kompilacji i jest ustawiana na poziomie projektu. /kernel Przekaż przełącznik, aby wskazać kompilatorowi, że wynikowy plik binarny po połączeniu powinien zostać załadowany do jądra systemu Windows. Kompilator zawęzi spektrum funkcji języka C++ do podzestawu zgodnego z jądrem.

W poniższej tabeli wymieniono zmiany zachowania kompilatora po /kernel określeniu.

Typ zachowania /kernel zachowanie
Obsługa wyjątków w języku C++ Wyłączone. Wszystkie wystąpienia throw słów kluczowych i try emitują błąd kompilatora (z wyjątkiem specyfikacji throw()wyjątku ). Żadne opcje nie /EH są zgodne z elementem /kernel, z wyjątkiem ./EH-
RTTI Wyłączone. Wszystkie wystąpienia dynamic_cast słów kluczowych i typeid emitują błąd kompilatora, chyba że dynamic_cast jest używany statycznie.
new i delete Musisz jawnie zdefiniować new() operator or delete() . Kompilator i środowisko uruchomieniowe nie udostępniają definicji domyślnej.

Niestandardowe konwencje wywoływania, /GS opcja kompilacji i wszystkie optymalizacje są dozwolone podczas korzystania z /kernel opcji. Inlining nie ma wpływu /kernelna element , z tą samą semantyczną honorowaną przez kompilator. Jeśli chcesz upewnić się, że __forceinline kwalifikator podkreślenia jest honorowany, upewnij się, że ostrzeżenie C4714 jest włączone, aby wiedzieć, kiedy określona __forceinline funkcja nie jest wciśnięta.

Nie ma #pragma odpowiednika kontroli nad tą opcją.

Po przekazaniu przełącznika /kernel kompilator wstępnie zdefiniowany jest makro preprocesora o nazwie _KERNEL_MODE i ma wartość 1. Tego makra można użyć do warunkowego skompilowania kodu na podstawie tego, czy środowisko wykonawcze jest w trybie użytkownika, czy w trybie jądra. Na przykład poniższy kod określa, że MyNonPagedClass klasa powinna znajdować się w segmencie pamięci niestronicowalnej podczas kompilowania na potrzeby wykonywania trybu jądra.

#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif

class NONPAGESECTION MyNonPagedClass
{
   // ...
};

Niektóre z następujących kombinacji architektury docelowej i /arch opcja generuje błąd, gdy są one używane z /kernel:

  • /arch:SSE, , /arch:SSE2, /arch:AVX2/arch:AVXi /arch:AVX512 nie są obsługiwane w systemie x86. Tylko /arch:IA32 w systemie x86 jest obsługiwany /kernel program .

  • /arch:AVX, /arch:AVX2i /arch:AVX512 nie są obsługiwane w /kernel systemie x64.

Budynek z /kernel również przechodzi /kernel do konsolidatora. Poniżej przedstawiono sposób, w jaki opcja wpływa na zachowanie konsolidatora:

  • Łączenie przyrostowe jest wyłączone. Jeśli dodasz /incremental do wiersza polecenia, konsolidator emituje ten błąd krytyczny:

    błąd krytyczny LNK1295: "/INCREMENTAL" nie jest zgodny ze specyfikacją "/JĄDRA"; link bez ciągu "/INCREMENTAL"

  • Konsolidator sprawdza każdy plik obiektu (lub dowolny dołączony element członkowski archiwum z bibliotek statycznych), aby sprawdzić, czy można było go skompilować przy użyciu /kernel opcji , ale nie. Jeśli jakiekolwiek wystąpienia spełniają to kryterium, konsolidator nadal pomyślnie łączy się, ale może wydać ostrzeżenie, jak pokazano w poniższej tabeli.

    Polecenie /kernel Obj non-/kernel obj, MASM obj lub cvtres obj Mieszanka /kernel i nie-objs/kernel
    link /kernel Tak Tak Tak z ostrzeżeniem LNK4257
    link Tak Tak Tak

    LNK4257 nie skompilowany obiekt z /KERNEL; obraz może nie zostać uruchomiony

Opcja /kernel i /driver opcja działają niezależnie. Nie mają wpływu na siebie nawzajem.

Aby ustawić opcję kompilatora /jądra w programie Visual Studio

  1. Otwórz okno dialogowe Strony właściwości dla projektu. Aby uzyskać więcej informacji, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilacji w programie Visual Studio).

  2. Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.

  3. W polu Dodatkowe opcje dodaj polecenie /kernel. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.

Zobacz też

Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC