Udostępnij za pośrednictwem


/kernel (Create Kernel Mode Binary)

Tworzy plik binarny, który może być wykonywana 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 będzie uruchamiany w trybie jądra.

  • /kernel-
    Kod w bieżącym projekcie jest skompilowany i połączone bez korzystania z reguły języka C++, które są specyficzne dla kodu, który będzie uruchamiany w trybie jądra.

Uwagi

Ma nie #pragma równoważne do kontrolowania tej opcji.

Określanie /kernel opcja informuje kompilator i program łączący rozstrzygają są dopuszczalne w trybie jądra, które funkcje językowe i upewnij się, że czy masz wystarczające ekspresji, aby uniknąć niestabilność runtime który jest unikatowy w trybie jądra C++.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 ma zastosowanie do fazy kompilator i program łączący kompilacji i jest ustawiona na poziomie projektu.Przekazać /kernel przełącznika, aby wskazać kompilator, że powstały plik binarny, po połączeniu, powinien być ładowany w jądrze 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 wymieniono zmiany w zachowaniu kompilatora przy /kernel jest określony.

Typ zachowania

/kernelZachowanie

Obsługę wyjątków 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żywana statycznie.

new i delete

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

Niestandardowa konwencje, wywoływania /GS budować opcji, a wszystkie optymalizacje są dozwolone podczas korzystania /kernel opcji.Dużym stopniu nie podlega Inlining /kernel, z tą samą semantyką honorowane przez kompilator.Aby upewnić się, że __forceinline jest honorowane inline kwalifikator, należy upewnić się tego ostrzeżenia, C4714 jest włączone, tak aby było wiadomo, kiedy dany __forceinline funkcja nie jest inlined.

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

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

class NONPAGESECTION MyNonPagedClass
{

};

Niektóre następujących kombinacji docelowej architektury i /arch opcja wygenerowanie błędu, jeśli są używane z /kernel:

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

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

Budynek z /kernel również przechodzi /kernel do programu łączącego.Jej jest jej wpływu na zachowanie programu łączącego:

  • Łączenie przyrostowe jest wyłączona.Jeśli dodasz /incremental do wiersza polecenia, program łączący emituje to 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 to może zostały skompilowane przy użyciu /kernel opcji ale nie zostało.Jeśli wszystkie wystąpienia spełniają to kryterium, program łączący nadal pomyślnie łączy, ale może być upomnienia, 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 Stron właściwości okno dialogowe dla projektu.Aby uzyskać więcej informacji, zobacz Jak: Otwórz strony właściwości projektu.

  2. Wybierz C/C++ folder.

  3. Wybierz wiersza polecenia strona właściwości.

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

Zobacz też

Informacje

Opcje kompilatora

Ustawianie opcji kompilatora