Partager via


/kernel (Créer un fichier binaire pour le mode noyau)

Crée un binaire qui peut être exécuté dans le noyau Windows. Le code du projet actuel est compilé et lié à l’aide d’un ensemble simplifié de fonctionnalités de langage C++ spécifiques au code qui s’exécute en mode noyau.

Syntaxe

/kernel

Notes

La spécification de l’option /kernel indique au compilateur et à l’éditeur de liens d’arbitrer les fonctionnalités de langage autorisées en mode noyau et de vous assurer que vous disposez d’une puissance expressive suffisante pour éviter l’instabilité du runtime qui est unique au mode noyau C++. C’est fait en interdisant l’utilisation des fonctionnalités de langage C++ qui sont perturbatrices en mode noyau. Le compilateur génère des avertissements pour les fonctionnalités du langage C++ potentiellement perturbatrices, mais qui ne peuvent pas être désactivées.

L’option /kernel s’applique aux phases du compilateur et de l’éditeur de liens d’une build et est définie au niveau du projet. Transmettez le /kernel commutateur pour indiquer au compilateur que le binaire résultant, après la liaison, doit être chargé dans le noyau Windows. Le compilateur réduit le spectre des fonctionnalités du langage C++ à un sous-ensemble compatible avec le noyau.

Le tableau suivant répertorie les modifications apportées au comportement du compilateur quand /kernel elle est spécifiée.

Type de comportement Comportement de /kernel
Gestion des exceptions C++ Désactivé. Toutes les instances des throw mots clés et try émettent une erreur de compilateur (à l’exception de la spécification throw()d’exception). Aucune option n’est /EH compatible avec /kernel, à l’exception de /EH-.
RTTI Désactivé. Toutes les instances des dynamic_cast mots clés et typeid des mots clés émettent une erreur du compilateur, sauf si dynamic_cast elles sont utilisées statiquement.
new et delete Vous devez définir explicitement l’opérateur ou delete() l’opérateurnew(). Le compilateur et le runtime ne fournissent pas de définition par défaut.

Les conventions d’appel personnalisées, l’option /GS de génération et toutes les optimisations sont autorisées lorsque vous utilisez l’option /kernel . L’incorporation n’est en grande partie pas affectée par /kernel, avec la même sémantique respectée par le compilateur. Si vous souhaitez vous assurer que le __forceinline qualificateur d’incorporation est respecté, vous devez vous assurer que l’avertissement C4714 est activé afin que vous sachiez quand une fonction particulière __forceinline n’est pas insérée.

Il n’y a pas #pragma d’équivalent pour contrôler cette option.

Lorsque le compilateur est passé le /kernel commutateur, il prédéfinit une macro de préprocesseur nommée _KERNEL_MODE et a la valeur 1. Vous pouvez utiliser cette macro pour compiler du code de manière conditionnelle selon que l’environnement d’exécution est en mode utilisateur ou en mode noyau. Par exemple, le code suivant spécifie que la MyNonPagedClass classe doit se trouver dans un segment de mémoire non paginable lorsqu’elle est compilée pour l’exécution du mode noyau.

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

class NONPAGESECTION MyNonPagedClass
{
   // ...
};

Certaines des combinaisons suivantes de l’architecture cible et de l’option /arch produisent une erreur lorsqu’elles sont utilisées avec /kernel:

  • /arch:SSE, , /arch:SSE2/arch:AVX, /arch:AVX2et /arch:AVX512 ne sont pas pris en charge sur x86. Seule /arch:IA32 la prise en charge est prise en charge /kernel sur x86.

  • /arch:AVX, /arch:AVX2et /arch:AVX512 ne sont pas pris en charge avec /kernel x64.

La construction avec /kernel également passe /kernel à l’éditeur de liens. Voici comment l’option affecte le comportement de l’éditeur de liens :

  • La liaison incrémentielle est désactivée. Si vous ajoutez /incremental à la ligne de commande, l’éditeur de liens émet cette erreur irrécupérable :

    erreur irrécupérable LNK1295 : '/INCREMENTAL' non compatible avec la spécification '/KERNEL' ; lien sans « /INCRÉMENTIEL »

  • L’éditeur de liens inspecte chaque fichier objet (ou tout membre d’archive inclus à partir de bibliothèques statiques) pour voir s’il a pu être compilé à l’aide de l’option /kernel , mais ce n’était pas le cas. Si des instances répondent à ce critère, l’éditeur de liens continue de lier correctement, mais peut émettre un avertissement, comme indiqué dans le tableau suivant.

    Commande /kernel Obj non-obj/kernel , MASM obj ou cvtres obj Mélange d’objs /kernel et non-objs/kernel
    link /kernel Oui Oui Oui avec LNK4257 d’avertissement
    link Oui Oui Oui

    LNK4257'objet de liaison non compilé avec /KERNEL ; l’image peut ne pas s’exécuter

L’option /kernel et l’option /driver fonctionnent indépendamment. Ils n’ont aucun effet les uns sur les autres.

Pour définir l’option du compilateur /kernel dans Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriétés du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.

  2. Sélectionnez la page de propriétés Propriétés de configuration>C/C++>Ligne de commande.

  3. Dans la zone Options supplémentaires, ajoutez /kernel. Choisissez OK ou Appliquer pour enregistrer vos modifications.

Voir aussi

Options du compilateur MSVC
Syntaxe de la ligne de commande du compilateur MSVC