18 votes

Que se passe-t-il réellement lorsque je lance "cli ; hlt" sur mon système Linux ?

Donc j'ai récemment découvert qu'il y a un HLT opcode pour arrêter le CPU. Cool, voyons ce qui se passe !

user@box:~$ cat > test.c
int main(void)
{
    __asm__("HLT");
    return 0;
}
user@box:~$ gcc -o test test.c
user@box:~$ ./test
Segmentation fault (core dumped)
user@box:~$

Duh ! C'est ennuyeux.

Il s'avère que HLT est une instruction privilégiée, alors essayons autre chose.

user@box:~$ mkdir test; cd test
user@box:~/test$ cat > test.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

int init_module(void)
{
    __asm__("hlt");
    return 0;
}

void cleanup_module(void)
{
}
user@box:~/test$ echo obj-m += test.o > Makefile
user@box:~/test$ make -C /lib/modules/$(uname -r)/build modules M=$(pwd)
[...]
user@box:~/test$ sudo insmod test.ko
user@box:~/test$

Rien ne se passe ! C'est ennuyeux !

Il s'avère que, HLT arrête le CPU... jusqu'à la prochaine interruption. Cool, donc essayons de désactiver les interruptions. CLI On dirait que ça va faire ce qu'on veut.

user@box:~/test$ sudo rmmod test
user@box:~/test$ sed -i 's/hlt/cli; hlt/' test.c
user@box:~/test$ make -C /lib/modules/$(uname -r)/build modules M=$(pwd)
[...]
user@box:~/test$ sudo insmod test.ko

...et à ce moment, le système d'exploitation a cessé de répondre à mes entrées. Je ne pouvais plus déplacer le curseur, ni taper quoi que ce soit avec mon clavier. Pratiquement gelé.

Sauf que ça ne l'était pas. L'horloge dans le panneau de mon interface graphique a continué à fonctionner. Bon sang, même la musique continuait à jouer. C'était comme si seulement ma souris et mon clavier avaient cessé de fonctionner. J'ai réalisé que mon clavier (USB) n'était plus alimenté, et que même le voyant de verrouillage des majuscules ne fonctionnait plus.

Alors, que s'est-il passé ici ? Pourquoi une paire d'instructions qui, à mon avis, devraient "suspendre" le système, ne fait que fermer mes périphériques USB ? Pourquoi tout le reste continue-t-il à fonctionner ? En prime : que dois-je faire pour que le système se fige réellement ?

3voto

Phlogi Points 191

L'arrêt du processeur n'arrête pas complètement le processeur. Il est généralement exécuté par le système d'exploitation lorsqu'il n'y a plus de travail à faire. Le CPU entre alors dans un état IDLE à partir duquel il peut être réveillé à tout moment, par exemple par une interruption, mais aussi par l'ACPI - vous pouvez donc essayer d'arrêter cela aussi : Dans votre BIOS ou comme argument de démarrage :

acpi=off

La raison pour laquelle les périphériques USB ne fonctionnaient plus était due à la désactivation des interruptions bien que selon cette discussion L'USB n'est pas commandé par des interruptions par conception.

Pour référence : https://en.wikipedia.org/wiki/X86_instruction_listings

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X