Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
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:AVX2y/arch:AVX512no se admiten en x86. Solo/arch:IA32se admite con/kernelen x86./arch:AVX,/arch:AVX2y/arch:AVX512no se admiten con/kernelen 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
/incrementala 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.Comando /kernelobjnon- /kernelobj, MASM obj o cvtres objCombinación de /kernely no/kernelobjslink /kernelSí Sí Sí, con advertencia LNK4257 linkSí 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