Udostępnij za pośrednictwem


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

Tworzy plik binarny, który może być wykonany w jądrze systemu Windows.

/kernel[-]

Argumenty

  • /kernel
    Kod w bieżącym projekcie jest skompilowany i połączone przy użyciu zestawu reguł języka C++, które są specyficzne dla kodu, który zostanie uruchomiony w trybie jądra.

  • /kernel-
    Kod w bieżącym projekcie zostanie skompilowany i połączony bez użycia reguły języka C++, które są specyficzne dla kodu, który zostanie uruchomiony w trybie jądra.

Uwagi

Nie ma odpowiednika #pragma do kontrolowania tej opcji.

Określanie /kernel opcja informuje kompilator i linker arbitrażu są dopuszczalne w trybie jądra, które funkcje języka i upewnić się, że czy masz wystarczające ekspresji, aby uniknąć niestabilności runtime, który jest unikatowy w języku C++ w trybie jądra.Można to osiągnąć poprzez zabronienie stosowania funkcji języka C++, które są nieodpowiednie w trybie jądra oraz dostarczając ostrzeżenia dla funkcji języka C++, które są potencjalnie uciążliwy, ale nie można go wyłączyć.

/kernel Opcja dotyczy zarówno kompilatora i linker fazy kompilacji i jest ustawiona na poziomie projektu.Przekazać /kernel przełącznika, aby wskazać kompilator, że powstały plik binarny, po połączeniu, powinny być załadowane do jądra systemu Windows.Kompilator będzie wąskie spektrum funkcje języka C++ do podzbioru, który jest zgodny z jądra.

W poniższej tabeli przedstawiono zmiany w zachowaniu kompilator po /kernel jest określony.

Typ zachowania

/kernelZachowanie

Obsługa wyjątków w języku C++

Wyłączone.Wszystkie wystąpienia throw i try słowa kluczowe emitują błąd kompilatora (z wyjątkiem specyfikacji wyjątek throw()).Nie /EH opcje są zgodne z /kernel, z wyjątkiem /EH-.

ROBOCZĄ

Wyłączone.Wszystkie wystąpienia dynamic_cast i typeid słowa kluczowe emitują błąd kompilatora, chyba że dynamic_cast jest używany statycznie.

new i delete

Należy jawnie zdefiniować new() lub delete() operatora; Kompilator ani runtime nie poda domyślną definicją.

Niestandardowe konwencje, wywoływania /GS opcji kompilacji i wszystkie optymalizacje są dozwolone podczas korzystania /kernel opcji.Inline dużej mierze nie występuje w /kernel, z tą samą semantyką honorowane przez kompilator.Jeśli chcesz mieć pewność, że __forceinline honorowane inline kwalifikator, należy się upewnić, że ostrzeżenie C4714 jest włączony, tak aby było wiadomo, kiedy określonego __forceinline funkcja nie jest inlined.

Kiedy kompilator jest przekazywana /kernel przełącznika, to powoduje wstępne definiowanie preprocesora makro o nazwie _KERNEL_MODE i ma wartość 1.Umożliwia to warunkowo skompilować kod, zależnie od tego, czy środowisko wykonawcze jest w trybie jądra lub trybu użytkownika.Na przykład poniższy kod określa, że klasa powinna być w segmencie pamięci niestronicowanej, gdy jest kompilowany do wykonania trybu jądra.

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

class NONPAGESECTION MyNonPagedClass
{

};

Niektóre następujące kombinacje docelowej architektury i /arch opcji wygenerować błąd, gdy są one używane przez /kernel:

  • **/arch:{SSE|SSE2|AVX}**nie są obsługiwane na x 86.Tylko /arch:IA32 jest obsługiwany z /kernel na x 86.

  • /arch:AVXnie jest obsługiwany w /kernel x 64.

Budowanie z /kernel również przechodzi /kernel do linker.Jej jest jak to wpływa na zachowanie linker:

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

    LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'

  • Program łączący sprawdza każdy plik obiektu (lub któregokolwiek członka uwzględniane archiwum z bibliotek statycznych), aby zobaczyć, czy może on zostały skompilowane przy użyciu /kernel opcji ale nie zostało.Jeśli wszystkie wystąpienia spełnia to kryterium, linker nadal pomyślnie łączy, ale może być ostrzeżenie, jak pokazano w poniższej tabeli.

    /kernelobj

    /kernel-obj, MASM obj lub cvtresed

    Mix of /kernel and /kernel- objs

    łącze /kernel

    Tak

    Tak

    Tak z ostrzeżenie LNK4257

    łącze

    Tak

    Tak

    Tak

    LNK4257 linking object not compiled with /KERNEL ; image may not run

/kernel Opcji i /driver opcja działa niezależnie i nie wpływa na inne.

Aby ustawić opcję kompilatora /kernel w programie Visual Studio

  1. Otwórz okno dialogowe Strony właściwości dla projektu.Aby uzyskać dodatkowe informacje, zobacz Porady: otwieranie stron właściwości projektów.

  2. Wybierz folder C/C++.

  3. Wybierz stronę właściwości Wiersz polecenia.

  4. W dodatkowe opcje pole, dodać /kernel lub /kernel-.

Zobacz też

Informacje

Opcje kompilatora

Ustawianie opcji kompilatora