/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ì
Sì
Sì con avviso LNK4257
link
Sì
Sì
Sì
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
Aprire la finestra di dialogo Pagine delle proprietà del progetto.Per ulteriori informazioni, vedere Procedura: aprire le pagine delle proprietà dei progetti.
Selezionare la cartella C/C++.
Selezionare la pagina delle proprietà Riga di comando.
Nella casella Opzioni aggiuntive, aggiungere /kernel o /kernel-.