Partilhar via


/kernel (criar binário do modo kernel)

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:AVX2 e /arch:AVX512 não têm suporte no x86. Somente /arch:IA32 tem suporte com o /kernel no x86.

  • /arch:AVX, /arch:AVX2 e /arch:AVX512 não têm suporte com o /kernel no 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 /kernel objeto não /kernel, objeto MASM ou objeto cvtres Combinação de objetos /kernel e não /kernel
    link /kernel Sim Sim Sim com o aviso LNK4257
    link Sim 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

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

  2. Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.

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