Condividi tramite


/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:AVX2e /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 Obj non-/kernel obj, MASM obj o cvtres obj Mix di /kernel e non objs/kernel
    link /kernel Sì con avviso LNK4257
    link

    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

  1. Aprire la finestra di dialogo Pagine delle proprietà per il progetto. Per altre informazioni, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.

  3. 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