/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 cvtresCombinaçã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
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