/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 /EH compatibles 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:AVX2
y/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
objnon- /kernel
obj, MASM obj o cvtres objCombinación de /kernel
y no/kernel
objslink /kernel
Sí Sí Sí, con advertencia LNK4257 link
Sí Sí Sí 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
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.
Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.
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