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?
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 duCLI+HLTCPU serait libre de continuer son joyeux chemin