/kernel (Create Kernel Mode Binary)
Crée un fichier binaire qui peut être exécuté au noyau windows.
/kernel[-]
Arguments
/kernel
Le code du projet en cours est compilé et lié à l'aide d'un ensemble de règles de langage C++ qui sont spécifiques au code qui s'exécute en mode noyau./kernel-
Le code du projet en cours est compilé et lié sans utiliser les règles de langage C++ qui sont spécifiques au code qui s'exécute en mode noyau.
Notes
Il n'y a aucun équivalent #pragma pour vérifier cette option.
Spécifier l'option d' /kernel indique le compilateur et l'éditeur de liens arbitrer les fonctionnalités de langage sont autorisées en mode noyau et vérifier que vous avez l'alimentation expressive suffisantes pour éviter l'instabilité du runtime qui est unique en mode noyau C++.Cela est accompli en interdisant l'utilisation des fonctionnalités de langage C++ qui sont perturbatrices en mode noyau et en fournissant des avertissements pour les fonctionnalités de langage C++ qui sont potentiellement perturbatrices mais ne peut pas être désactivé.
L'option d' /kernel s'applique aux phases du compilateur et de l'éditeur de liens d'une build et est définie au niveau de le projet.Passez le commutateur d' /kernel pour indiquer au compilateur que le fichier résultant, après avoir joint, doit être chargé dans le noyau windows.Le compilateur limitera l'éventail de fonctionnalités de langage C++ à un sous-ensemble compatible avec le noyau.
Le tableau suivant répertorie les modifications du comportement du compilateur lorsque /kernel est spécifié.
Type de comportement |
comportement d'/kernel |
---|---|
Gestion des exceptions C++ |
Désactivé.Toutes les instances des mots clés d' throw et d' try émettent une erreur du compilateur (à l'exception de la spécification throw()d'exception).Aucune option d' /EH n'est compatible avec /kernel, à l'exception /EH-. |
RTTI |
Désactivé.Toutes les instances des mots clés d' dynamic_cast et d' typeid émettent une erreur du compilateur, à moins qu' dynamic_cast soit utilisé de manière statique. |
new et delete |
Vous devez définir explicitement l'opérateur d' new() ou d' delete() ; le compilateur le runtime ne propose la définition par défaut. |
Les conventions d'appel personnalisées, l'option de génération d' /GS, et toutes les optimisations sont autorisées lorsque vous utilisez l'option pour /kernel .La fonctionnalité inline n'est pas essentiellement affecté par /kernel, avec la même sémantique honorée par le compilateur.Si vous souhaitez vous assurer qu' __forceinline inline le qualificateur est respecté, vous devez vous assurer que cet avertissement C4714 est activé afin que vous savez lorsqu'une fonction d' __forceinline spécifique n'est pas inline.
Lorsque le compilateur est passé le commutateur d' /kernel, il prédéfinit une macro de préprocesseur nommée _KERNEL_MODE et a la valeur 1.Vous pouvez l'utiliser pour la compilation conditionnelle le code selon que l'environnement d'exécution est en mode utilisateur ou le mode noyau.Par exemple, le code suivant spécifie que la classe doit être dans un segment non paginable de mémoire lors de la compilation pour une exécution en mode noyau.
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
};
Certains des combinaisons suivantes de l'architecture cible et l'option d' /arch produisent une erreur lorsqu'ils sont utilisés avec /kernel:
/arch:{SSE|SSE2|AVX} ne sont pas pris en charge sur x86.Uniquement /arch:IA32 est pris en charge avec /kernel sur x86.
/arch:AVX n'est pas pris en charge avec /kernel sur x64.
La génération avec /kernel passe également /kernel à l'éditeur de liens.Her comment cela affecte le comportement d'éditeur de liens :
Attacher incrémentiel est désactivé.Si vous ajoutez /incremental à la ligne de commande, l'éditeur de liens émet cette erreur irrécupérable :
LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'
L'éditeur de liens examine chaque fichier objet (ou un membre incorporé d'archivage des bibliothèques statiques) pour voir s'il peut avoir été compilé à l'aide de l'option d' /kernel mais n'était pas.Si les instances sont conformes à ce critère, de l'éditeur de liens toujours les liens avec succès mais peut émettre un avertissement, comme indiqué dans le tableau suivant.
obj d'/kernel
obj d'/kernel-, obj MASM, ou cvtresed
Combinaison d' /kernel et des objs d' /kernel-
lien /kernel
Oui
Oui
Oui avec avertissement LNK4257
link
Oui
Oui
Oui
LNK4257 linking object not compiled with /KERNEL ; image may not run
L'option d' /kernel et l'option d' /driver fonctionnent indépendamment et aucune d'affecte l'autre.
Pour définir option du compilateur /kernel dans Visual Studio
Ouvrez la boîte de dialogue Pages de propriété du projet.Pour plus d'informations, consultez Comment : ouvrir les pages de propriétés d'un projet.
Sélectionnez le dossier C/C++ .
Sélectionnez la page de propriétés Ligne de commande .
Dans la zone Options supplémentaires, ajoutez /kernel ou /kernel-.