/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 /kernel
na 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:AVX
i/arch:AVX512
nie są obsługiwane w systemie x86. Tylko/arch:IA32
w systemie x86 jest obsługiwany/kernel
program ./arch:AVX
,/arch:AVX2
i/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
Objnon- /kernel
obj, MASM obj lub cvtres objMieszanka /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
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).
Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.
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