J'ai donc récemment découvert qu'il y avait 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! Quel ennui.
Il s'avère que HLT
c'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 HLT
le processeur s'arrête ... jusqu'à la prochaine interruption. Cool, essayons donc de désactiver les interruptions. CLI
sonne 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?
CLI
ne 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 duCLI+HLT
CPU serait libre de continuer son joyeux cheminRéponses:
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:
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
la source