pourquoi effacer l’indicateur interrput cause une erreur de segmentation en C?

J’apprends quelques notions de base sur Assembly et C. Pour apprendre, je décide d’écrire un programme simple qui désactive les interruptions et lorsque l’utilisateur souhaite saisir quelque chose dans la console, il / elle ne peut pas:

#include  int main(){ int a; printf("enter your number : "); asm ("cli"); scanf("%d", &a); printf("your number is %d\n" , a); return 0; } 

mais quand j’ai compilé cela avec GCC, j’ai eu une erreur de segmentation:

 Segmentation fault (core dumped) 

Et quand je le débogue avec gdb j’ai reçu ce message quand le programme parvient à l’ asm("cli"); ligne:

 Program received signal SIGSEGV, Segmentation fault. main () at cli.c:6 6 asm ("cli"); 

    Cela est dû au fait que vous ne pouvez pas désactiver les interruptions du programme d’espace utilisateur. Toutes les interruptions sont sous le contrôle du kernel. Vous devez le faire depuis l’espace kernel. Avant de le faire, vous devez d’abord apprendre les composants internes du kernel. Il est très important de jouer avec les interruptions. Cela nécessite davantage de connaissances sur le kernel, à ma connaissance.

    Vous devez écrire un module de kernel capable d’interagir avec l’espace utilisateur via l’interface / dev / (ou un autre). Le code d’espace utilisateur doit demander au module de kernel de désactiver les interruptions.

    cli est une instruction privilégiée. Il déclenche une #GP(0) “Si la CPL est supérieure (a moins de privilèges) que l’IOPL du programme ou de la procédure en cours” . C’est ce #GP qui a amené Linux à fournir un SIGSEGV à votre processus.

    Sous Linux, vous pouvez effectuer un appel système iopl(3) pour augmenter votre niveau de confidentialité IO afin qu’il corresponde à votre CPL en anneau 3, puis désactiver les interruptions provenant de l’espace utilisateur. ( Mais ne faites pas cela, il n’est pas pris en charge AFAIK . Le cas d’utilisation prévu pour iopl est d’utiliser out instructions d’ out et de out de l’espace utilisateur avec des numéros de port élevés, et non de cli / sti . tous les deux.)

    Vous allez probablement faire planter votre système si vous ne réactivez pas les interruptions immédiatement, ou peut-être même si vous le faites. Ou du moins bousiller ce processeur sur un système multicœur. En gros, ne faites cela que si vous êtes prêt à appuyer sur le bouton de réinitialisation, c’est-à-dire arrêter X11, enregistrer vos fichiers et exécuter la sync . Remontez également vos systèmes de fichiers en lecture seule.

    Ou essayez-le sur une machine virtuelle ou un simulateur comme BOCHS, qui vous permettra de vous familiariser avec un débogueur même lorsque les interruptions sont désactivées. Ou essayez-le en étant démarré depuis une clé USB.

    Notez que la désactivation des interruptions désactive uniquement les interruptions externes . Les interruptions générées par les logiciels, telles que int $0x80 sont toujours sockets, mais rendre les appels système avec les interruptions désactivées est probablement une idée encore pire. (Cela pourrait fonctionner, cependant. Le kernel enregistre / restaure EFLAGS, ainsi il ne retournera probablement pas dans l’espace utilisateur avec les interruptions réactivées. Néanmoins, laisser les interruptions désactivées pendant longtemps est une mauvaise chose pour la latence des interruptions.)


    Si vous voulez jouer avec la désactivation des interruptions en tant que débutant, vous devriez probablement le faire à partir d’un programme de secteur de démarrage jouet qui utilise des appels BIOS pour les E / S. Ou bien, cherchez dans le code source du kernel Linux des endroits où il désactive / active les interruptions si vous êtes curieux de savoir pourquoi cela pourrait le faire.

    OMI, “normal” asm dans l’espace utilisateur est très intéressant. Avec les compteurs de performance, vous pouvez voir les détails de la manière dont la CPU décode et exécute les instructions. Voir les liens dans le wiki des balises x86 pour obtenir des manuels, des guides et des informations sur le réglage des performances.