/kernel (Crea file binario in modalità Kernel)
Crea un file binario che può essere eseguito nel kernel di Windows. Il codice nel progetto corrente viene compilato e collegato usando un set semplificato di funzionalità del linguaggio C++ specifiche del codice eseguito in modalità kernel.
Sintassi
/kernel
Osservazioni:
Se si specifica l'opzione /kernel
, il compilatore e il linker devono eseguire l'analisi delle funzionalità del linguaggio consentite in modalità kernel e assicurarsi di avere una potenza espressiva sufficiente per evitare l'instabilità del runtime univoca per la modalità kernel C++. Questa operazione viene eseguita vietando l'uso delle funzionalità del linguaggio C++ che causano interruzioni in modalità kernel. Il compilatore genera avvisi per le funzionalità del linguaggio C++ potenzialmente problematiche, ma non possono essere disabilitate.
L'opzione /kernel
si applica alle fasi del compilatore e del linker di una compilazione e viene impostata a livello di progetto. Passare l'opzione /kernel
per indicare al compilatore che il file binario risultante, dopo il collegamento, deve essere caricato nel kernel di Windows. Il compilatore restringerà la gamma di funzionalità del linguaggio C++ a un subset compatibile con il kernel.
Nella tabella seguente sono elencate le modifiche apportate al comportamento del compilatore quando /kernel
viene specificato.
Tipo di comportamento | Comportamento /kernel |
---|---|
Gestione delle eccezioni C++ | Disabilitati. Tutte le istanze delle parole chiave throw e try generano un errore di compilazione (ad eccezione della specifica di eccezione throw() ). Nessuna /EH opzione è compatibile con /kernel , ad eccezione di /EH- . |
RTTI | Disabilitati. Tutte le istanze delle parole chiave dynamic_cast e typeid generano un errore del compilatore, a meno che dynamic_cast venga utilizzata in modo statico. |
new e delete |
È necessario definire in modo esplicito l'operatore new() o delete() . Il compilatore e il runtime non forniscono una definizione predefinita. |
Le convenzioni di chiamata personalizzate, l'opzione /GS
di compilazione e tutte le ottimizzazioni sono consentite quando si usa l'opzione /kernel
. L'inlining non è in gran parte influenzato da /kernel
, con la stessa semantica rispettata dal compilatore. Se si vuole assicurarsi che il __forceinline
qualificatore di inlining sia rispettato, è necessario assicurarsi che l'avviso C4714 sia abilitato in modo da sapere quando una determinata __forceinline
funzione non è inlined.
Non esiste un #pragma
equivalente per controllare questa opzione.
Quando il compilatore viene passato all'opzione /kernel
, viene predefinita una macro del preprocessore denominata _KERNEL_MODE
e ha il valore 1. È possibile usare questa macro per compilare in modo condizionale il codice in base al fatto che l'ambiente di esecuzione sia in modalità utente o kernel. Ad esempio, il codice seguente specifica che la MyNonPagedClass
classe deve trovarsi in un segmento di memoria non paging quando viene compilata per l'esecuzione in modalità kernel.
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
// ...
};
Alcune delle combinazioni seguenti di architettura di destinazione e l'opzione /arch
generano un errore quando vengono usate con /kernel
:
/arch:SSE
/arch:AVX
,/arch:SSE2
,/arch:AVX2
, e/arch:AVX512
non sono supportati in x86. È supportato solo/arch:IA32
con/kernel
in x86./arch:AVX
,/arch:AVX2
e/arch:AVX512
non sono supportati con/kernel
in x64.
Compilazione con /kernel
passa /kernel
anche al linker. Ecco come l'opzione influisce sul comportamento del linker:
Il collegamento incrementale è disabilitato. Se si aggiunge
/incremental
alla riga di comando, il linker genera questo errore irreversibile:errore irreversibile LNK1295: '/INCREMENTAL' non compatibile con la specifica '/KERNEL'; collegamento senza '/INCREMENTAL'
Il linker controlla ogni file oggetto (o qualsiasi membro archivio incluso da librerie statiche) per verificare se potrebbe essere stato compilato usando l'opzione
/kernel
ma non lo era. Se le istanze soddisfano questi criteri, il linker collega di nuovo correttamente ma può presentarsi un avviso, come illustrato nella tabella seguente.Comando /kernel
Objnon- /kernel
obj, MASM obj o cvtres objMix di /kernel
e non objs/kernel
link /kernel
Sì Sì Sì con avviso LNK4257 link
Sì Sì Sì LNK4257 oggetto di collegamento non compilato con /KERNEL; l'immagine potrebbe non essere eseguita
L'opzione /kernel
e l'opzione /driver
funzionano in modo indipendente. Non hanno alcun effetto l'uno sull'altro.
Impostare l'opzione /kernel del compilatore in Visual Studio
Aprire la finestra di dialogo Pagine delle proprietà per il progetto. Per altre informazioni, vedere Impostare il compilatore e le proprietà di compilazione.
Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.
Nella casella Opzioni aggiuntive aggiungere
/kernel
. Scegliere OK o Applica per salvare le modifiche.
Vedi anche
Opzioni del compilatore MSVC
Sintassi della riga di comando del compilatore MSVC