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

16

J'ai donc récemment découvert qu'il y avait un HLTopcode 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! Quel ennui.

Il s'avère que HLTc'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! Ennuyeuse!

Il s'avère que HLTle processeur s'arrête ... jusqu'à la prochaine interruption. Cool, essayons donc de désactiver les interruptions. CLIsonne comme ça fera ce que nous voulons.

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 stade, le système d'exploitation a cessé de répondre à mon entrée. Je ne pouvais pas déplacer le curseur ni taper quoi que ce soit à l'aide de mon clavier. À peu près gelé.

Sauf que ce n'était pas le cas. L'horloge dans le panneau de mon interface graphique continuait de fonctionner. Enfer, 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é, même ma LED de verrouillage des majuscules ne fonctionnerait pas.

Alors, que s'est-il passé ici? Pourquoi une paire d'instructions qui, selon moi, devrait "raccrocher" le système arrête-t-elle uniquement mes périphériques USB? Pourquoi tout le reste continue de fonctionner? En prime: que dois-je faire pour réellement geler le système?

secretpow
la source
3
De quel type de système s'agit-il? CLIne s'applique qu'au processeur sur lequel il fonctionne, donc si vous avez plusieurs processeurs, vous devrez l'exécuter sur chacun d'eux. Tout ce qui ne dépend pas du CLI+HLTCPU serait libre de continuer son joyeux chemin
Eric Renouf
2
Je l'ai testé sur ma machine de bureau normale fonctionnant sur un processeur avec plusieurs cœurs. Je sais que chaque cœur est également un processeur "logique"; c'est de cela dont vous parlez?
secretpow

Réponses:

2

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 se réveiller à tout moment par exemple par une interruption, mais également par ACPI - vous pouvez donc essayer d'arrêter cela également: dans votre BIOS ou comme argument de démarrage:

acpi = off

La raison pour laquelle les périphériques USB ne fonctionnent plus était due aux interruptions désactivées bien que, selon cette discussion, l' USB ne soit pas interrompu par la conception.

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

Phlogi
la source