Condividi tramite


/kernel (Create Kernel Mode Binary)

Creazione di un file binario che può essere eseguito nel kernel di Windows.

/kernel[-]

Argomenti

  • /kernel
    Il codice nel progetto corrente viene compilato e collegato mediante un set di regole del linguaggio C++ specifiche codice che verrà eseguito in modalità kernel.

  • /kernel-
    Il codice nel progetto corrente viene compilato e collegato senza utilizzare le regole del linguaggio C++ specifiche codice che verrà eseguito in modalità kernel.

Note

Nessun equivalente di #pragma per verificare questa opzione.

Specificare l'opzione di /kernel indica al compilatore e il linker di arbitrare le funzionalità del linguaggio sono consentite in modalità kernel e assicurarsi che si abbia potenza espressiva sufficiente evitare di instabilità runtime univoche in modalità kernel C++.Questa operazione viene eseguita proibendo l'utilizzo delle funzionalità del linguaggio C++ che siano distruttive in modalità kernel e fornendo gli avvisi per le funzionalità del linguaggio C++ che sono potenzialmente dannose ma non può essere disabilitata.

L'opzione di /kernel si applica sia alle fasi del linker che il compilatore di compilazione e viene impostata a livello di progetto.Passare l'opzione di /kernel per indicare al compilatore che il file risultante, dopo essere collegatosi, deve essere caricato nel kernel di Windows.Il compilatore restringerà la gamma di funzionalità di linguaggio C++ a un sottoinsieme compatibile con il kernel.

Nella tabella seguente sono elencate le modifiche nel comportamento del compilatore quando /kernel è specificato.

Tipo di comportamento

comportamento di/kernel

Gestione delle eccezioni C++

Disabilitato.Tutte le istanze delle parole chiave di try e di throw generano un errore del compilatore (fatta eccezione per la specifica throw()di eccezione).Non esistono opzioni di /EH compatibili con /kernel, fatta eccezione per /EH-.

RTTI

Disabilitato.Tutte le istanze delle parole chiave di typeid e di dynamic_cast generano un errore del compilatore, a meno che dynamic_cast venga utilizzato in modo statico.

new e delete.

È necessario definire in modo esplicito l'operatore di delete() o di new() ; né il compilatore né il runtime genera una definizione predefinita.

Le convenzioni di chiamata personalizzate, l'opzione di compilazione di /GS e tutte le ottimizzazioni sono consentite quando si utilizza l'opzione di /kernel.L'incorporamento in gran parte non è interessato da /kernel, con la semantica rispettata dal compilatore.Se si desidera assicurarsi che __forceinline che l'incorporamento il qualificatore venga accettato, è necessario assicurarsi che avviso L'errore C4714 sia abilitato in modo che si conosca quando una funzione di __forceinline di particolare non viene resa inline.

Quando il compilatore viene passato all'opzione di /kernel, predefinisce una macro del preprocessore denominata _KERNEL_MODE e ha il valore 1.È possibile utilizzare questa opzione per compilare il codice in modo condizionale in base all'ambiente di esecuzione in modalità utente o in modalità kernel.Ad esempio, il codice seguente specifica che la classe deve trovarsi in un segmento non divisibile nelle pagine di memoria 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
{

};

Alcuni le seguenti combinazioni di architettura di destinazione e dell'opzione di /arch generano un errore quando vengono utilizzati con /kernel:

  • /arch:{SSE|SSE2|AVX} non è supportato su x86.Solo /arch:IA32 è supportato con /kernel su x86.

  • /arch:AVX non è supportato con /kernel su x64.

La compilazione con /kernel passa inoltre /kernel al linker.Her come ciò influisce sul comportamento del linker:

  • Collegamento incrementale è disabilitato.Se si aggiunge /incremental la riga di comando, il linker genera l'errore irreversibile:

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

  • Il linker controlla ogni file oggetto (o il membro incluso archiviano le librerie statiche) per verificare se può essere compilato utilizzando l'opzione di /kernel ma non è.Se le istanze soddisfano questi criteri, del linker collegamenti di nuovo correttamente ma possono pubblicare un avviso, come illustrato nella tabella seguente.

    obj di/kernel

    obj di/kernel-, obj di MASM, o cvtresed

    Combinazione di /kernel e di objs di /kernel-

    collegamento /kernel

    Sì con avviso LNK4257

    link

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

L'opzione di /kernel e l'opzione di /driver funzionano in modo indipendente e nessuno dei due influisce sull'altro.

Per impostare l'opzione del compilatore di /kernel in Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto.Per ulteriori informazioni, vedere Procedura: aprire le pagine delle proprietà dei progetti.

  2. Selezionare la cartella C/C++.

  3. Selezionare la pagina delle proprietà Riga di comando.

  4. Nella casella Opzioni aggiuntive, aggiungere /kernel o /kernel-.

Vedere anche

Riferimenti

Opzioni del compilatore

Impostazione delle opzioni del compilatore