Share via


/kernel (Crear binario en modo kernel)

Crea un binario que se puede ejecutar en el kernel de Windows. El código del proyecto actual se compila y vincula mediante un conjunto simplificado de características del lenguaje C++ que son específicas del código que se ejecuta en el modo kernel.

Sintaxis

/kernel

Comentarios

Al especificar la opción /kernel le indica al compilador y al enlazador que arbitre qué características del lenguaje están permitidas en el modo kernel y que se aseguren de que tiene suficiente poder expresivo para evitar la inestabilidad en tiempo de ejecución que es única en el modo kernel de C++. Esto se hace al prohibir el uso de características del lenguaje C++ que provocan interrupciones en el modo kernel. El compilador produce advertencias para las características del lenguaje C++ que pueden resultar perjudiciales, pero que no se pueden deshabilitar.

La opción /kernel se aplica tanto a las fase del compilador como a la del enlazador de una compilación y se establece a nivel de proyecto. Pase el modificador /kernel para indicar al compilador que el binario resultante, después de la vinculación, debe cargarse en el kernel de Windows. El compilador restringirá el espectro de características del lenguaje C++ a un subconjunto que sea compatible con el kernel.

En la tabla siguiente se enumeran los cambios en el comportamiento del compilador cuando se especifica /kernel.

Tipo de comportamiento Comportamiento de /kernel
Control de excepciones de C++ Deshabilitado. Todas las instancias de las throw y las palabras clave try emiten un error del compilador (excepto la especificación de excepción throw()). No hay opciones /EHcompatibles con /kernel, excepto para /EH-.
RTTI Deshabilitado. Todas las instancias de las dynamic_cast y las palabras clave typeid emiten un error del compilador, a menos que dynamic_cast se use estáticamente.
new y delete Debe definir explícitamente el new() operador o delete(). El compilador y el entorno de ejecución no proporcionan una definición predeterminada.

En las convenciones de llamada personalizadas, la /GS opción de compilación y todas las optimizaciones se permiten cuando se usa la opción /kernel. La inserción no se ve afectada en gran medida por /kernel, con la misma semántica respetada por el compilador. Si desea asegurarse de que se respeta el calificador de inserción __forceinline, debe asegurarse de que la advertencia C4714 está habilitada para que sepa cuándo una función determinada __forceinline no está insertada.

No hay equivalente #pragma para controlar esta opción.

Cuando al compilador se le pasa el modificador /kernel, predefine una macro de preprocesador denominada _KERNEL_MODE y que tiene valor 1. Puede usar esta macro para compilar de manera condicional el código en función de si el entorno de ejecución está en modo usuario o en modo kernel. Por ejemplo, el código siguiente especifica que la clase MyNonPagedClass debe estar en un segmento de memoria no paginable cuando se compila para la ejecución del modo kernel.

#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif

class NONPAGESECTION MyNonPagedClass
{
   // ...
};

Algunas de las siguientes combinaciones de arquitectura de destino y la opción /arch producen un error cuando se usan con /kernel:

  • /arch:SSE, /arch:SSE2, /arch:AVX, /arch:AVX2 y /arch:AVX512 no se admiten en x86. Solo /arch:IA32 se admite con /kernel en x86.

  • /arch:AVX, /arch:AVX2y /arch:AVX512 no se admiten con /kernel en x64.

La compilación con /kernel también pasa /kernel al enlazador. Aquí se muestra cómo la opción afecta al comportamiento del enlazador:

  • La vinculación incremental está deshabilitada. Si agrega /incremental a la línea de comandos, el enlazador emite este error irrecuperable:

    Error irrecuperable LNK1295: '/INCREMENTAL' no compatible con la especificación '/KERNEL'; vínculo sin '/INCREMENTAL'

  • El enlazador inspecciona cada archivo objeto (o cualquier miembro incluido del archivo de las bibliotecas estáticas) para ver si podría haberse compilado mediante la opción /kernel, pero no lo hizo. Si alguna instancia cumple este criterio, el enlazador sigue funcionando correctamente, pero podría emitir una advertencia, como se muestra en la siguiente tabla.

    Get-Help /kernel obj non-/kernel obj, MASM obj o cvtres obj Combinación de/kernel y no/kernel objs
    link /kernel Sí, con advertencia LNK4257
    link

    Objeto de vinculación LNK4257 no compilado con /KERNEL; es posible que la imagen no se ejecute

La opción /kernel y /driver funcionan de forma independiente. No tienen efecto el uno sobre el otro.

Para establecer la opción del compilador /kernel en Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.

  3. En el cuadro Opciones adicionales, agregue /kernel. Haga clic en Aceptar o en Aplicar para guardar los cambios.

Consulte también

Opciones del compilador de MSVC
Sintaxis de la línea de comandos del compilador MSVC