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 ?