/kernel (criar binário do modo kernel)
Cria um binário que pode ser executado no kernel do windows.
/kernel[-]
Arguments
/kernel
O código no projeto atual é compilado e vinculado usando um conjunto de regras de linguagem C++ que são específicas do código que será executada em modo de kernel./kernel-
O código no projeto atual é compilado e vinculado sem usar as regras de linguagem C++ que são específicas do código que será executada em modo de kernel.
Comentários
Não há equivalente de #pragma para controlar esta opção.
Especificar a opção de /kernel informa o compilador e o vinculador para arbitrar quais recursos de idioma são permitidos no modo kernel e certificar-se de que você tem a capacidade suficiente eloquente evitar a instabilidade de tempo de execução que é exclusivo para o modo de kernel C++. Isso é feito proibindo o uso dos recursos de linguagem C++ que são disruptivos no modo kernel e fornecendo avisos para os recursos de linguagem C++ que são potencialmente disruptivos mas não pode ser desabilitado.
A opção de /kernel se aplica às fases do compilador e do vinculador de uma construção e é definida no nível de projeto. Passar a opção de /kernel para indicar ao compilador que o binário resultante, depois de ser vinculado, deve ser carregado no kernel do windows. O compilador refinará o espectro de recursos de linguagem C++ a um subconjunto que seja compatível com o kernel.
A tabela a seguir lista as alterações no comportamento do compilador /kernel quando é especificado.
Tipo de comportamento |
comportamento de/kernel |
---|---|
Manipulação de exceção C++ |
Desabilitado. Todas as instâncias de palavras-chave throw e de try se o gerará um erro do compilador (exceto para a especificação throw()de exceção). Nenhuma opção de /EH é compatível com /kernel, com exceção de /EH-. |
RTTI |
Desabilitado. Todas as instâncias de palavras-chave dynamic_cast e de typeid se o gerará um erro do compilador, a menos que seja usado dynamic_cast estaticamente. |
new e delete |
Você deve definir explicitamente o operador de new() ou de delete() ; nem o compilador ou o tempo de execução fornecerão uma definição padrão. |
As convenções personalizados de chamada, opção de compilação de /GS , e todas as otimizações são permitidas quando você usa a opção de /kernel . Inlining não é afetado pela maior parte por /kernel, com a mesma semântica atendida pelo compilador. Se você quiser garantir que __forceinline que inlining o qualificador é cumprido, você deve ter certeza de que C4714 de aviso está habilitado para que você saiba como quando uma função de __forceinline de detalhes não será embutida.
Quando o compilador é passado a opção de /kernel , predefine uma macro de pré-processador chamado _KERNEL_MODE e possui o valor 1. Você pode usar isso para compilar o código condicional com base no ambiente de execução está no modo de usuário ou o modo de kernel. Por exemplo, o código a seguir especifica que a classe deve estar em um segmento não paginável da memória quando é criada para a execução do modo kernel.
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
};
Alguns as seguintes combinações de arquitetura de destino e a opção de /arch gerencia um erro quando usadas com /kernel:
/arch:{SSE|SSE2|AVX} não tem suporte em x86. Somente /arch:IA32 tem suporte com /kernel em x86.
/arch:AVX não tem suporte com /kernel em x64.
Compile com /kernel também passa /kernel ao vinculador. Her como isso afeta o comportamento do vinculador:
Vincular incremental é desabilitado. Se você adicionar /incremental à linha de comando, emite o vinculador esse erro fatal:
LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'
O vinculador inspecione cada arquivo de objeto (ou qualquer membro incluído de arquivo morto das bibliotecas estáticas) para ver se pode ter sido criado com a opção de /kernel mas não fosse. Se alguma instância atende esse critério, do vinculador links com êxito mas ainda podem emitir um aviso, conforme mostrado na seguinte tabela.
obj de/kernel
obj de/kernel- , obj de MASM, ou cvtresed
Mistura de /kernel e de objs de /kernel-
link /kernel
Sim
Sim
Sim com aviso de LNK4257
link
Sim
Sim
Sim
LNK4257 linking object not compiled with /KERNEL ; image may not run
A opção de /kernel e a opção de /driver opera independentemente e afeta nenhuma das outras.
Para definir a opção do compilador do /kernel no Visual Studio
Abra a caixa de diálogo Páginas de Propriedade para o projeto. Para obter mais informações, consulte Como abrir páginas de propriedade do projeto.
Selecione a pasta C/C++.
Selecione a página de propriedades Linha de Comando .
Na caixa de Opções Adicionais , adicione /kernel ou /kernel-.