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 chemin