Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Cria um binário que pode ser executado no kernel do Windows. O código no projeto atual é compilado e vinculado usando um conjunto simplificado de recursos da linguagem C++ que são específicos do código que é executado no modo kernel.
Sintaxe
/kernel
Comentários
A especificaçaõ da opção /kernel informa ao compilador e ao vinculador para arbitrar quais recursos de linguagem serão permitidos no modo kernel e para garantir que você tenha energia expressiva suficiente para evitar a instabilidade de runtime exclusiva do modo kernel do C++. Isso é feito por meio da proiiçao do uso de recursos da linguagem C++ que são interruptivos no modo kernel. O compilador produz avisos para recursos da linguagem C++ que são potencialmente disruptivos, mas não podem ser desabilitados.
A opção /kernel se aplica às fases do compilador e do vinculador de um build e é definida no nível do projeto. Passe a opção /kernel para indicar ao compilador que o binário resultante, após a vinculação, deve ser carregado no kernel do Windows. O compilador restringirá o espectro de recursos da linguagem C++ a um subconjunto compatível com o kernel.
A tabela a seguir lista as alterações no comportamento do compilador quando /kernel é especificada.
| Tipo de comportamento | Comportamento /kernel |
|---|---|
| Tratamento de exceções C++ | Desabilitada. Todas as instâncias das palavras-chave throw e try emitem um erro do compilador (exceto a especificação de exceção throw()). Nenhuma opção /EH é compatível com /kernel, exceto a /EH-. |
| RTTI | Desabilitada. Todas as instâncias das palavras-chave dynamic_cast e typeid emitem um erro do compilador, a menos que dynamic_cast seja usado estaticamente. |
new e delete |
Você deve definir explicitamente o operador new() ou delete(). O compilador e o runtime não fornecem uma definição padrão. |
Convenções de chamada personalizadas, a opção de build /GS e todas as otimizações são permitidas quando você usa a opção /kernel. A incorporação não é afetada em grande parte por /kernel, com a mesma semântica respeitada pelo compilador. Se você quiser ter certeza de que o qualificador de incorporação __forceinline será respeitado, verifique se o aviso C4714 está habilitado para que você saiba quando uma função específica __forceinline não foi embutida.
Não há #pragma equivalente para controlar essa opção.
Quando é passada a opção /kernel ao compilador, ele predefine uma macro de pré-processador chamada _KERNEL_MODE que tem o valor 1. Você pode usar essa macro para compilar condicionalmente o código dependendo do ambiente de execução, que pode estar no modo de usuário ou no modo kernel. Por exemplo, o código a seguir especifica que a classe MyNonPagedClass deve estar em um segmento de memória não paginável quando ela é compilada para execução no modo kernel.
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
// ...
};
Algumas das seguintes combinações de arquitetura de destino e a opção /arch produzem um erro quando são usadas com /kernel:
/arch:SSE,/arch:SSE2,/arch:AVX,/arch:AVX2e/arch:AVX512não têm suporte no x86. Somente/arch:IA32tem suporte com o/kernelno x86./arch:AVX,/arch:AVX2e/arch:AVX512não têm suporte com o/kernelno x64.
Compilar com /kernel também passa /kernel para o vinculador. Veja como a opção afeta o comportamento do vinculador:
A vinculação incremental está desabilitada. Se você adicionar
/incrementalà linha de comando, o vinculador emitirá este erro fatal:erro fatal LNK1295: "/INCREMENTAL" não compatível com a especificação "/KERNEL"; link sem "/INCREMENTAL"
O vinculador inspeciona cada arquivo de objeto (ou qualquer membro de arquivo incluído das bibliotecas estáticas) para ver se ele poderia ter sido compilado usando a opção
/kernel, mas não foi. Se qualquer instância atender a esse critério, o vinculador ainda vincularia com êxito, mas poderia emitir um aviso, conforme mostrado na tabela a seguir.Comando objeto /kernelobjeto não /kernel, objeto MASM ou objeto cvtresCombinação de objetos /kernele não/kernellink /kernelSim Sim Sim com o aviso LNK4257 linkSim Sim Sim Objeto de vinculação LNK4257 não compilado com /KERNEL; a imagem pode não ser executada
A opção /kernel e a opção /driver operam de maneira independente. Eles não têm efeito entre si.
Para definir essa opção do compilador no Visual Studio
Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter mais informações, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.
Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.
Na caixa Opções adicionais, adicione
/kernel. Escolha OK ou Aplicar para salvar as alterações.
Confira também
Opções do compilador MSVC
Sintaxe da linha de comando do compilador MSVC