Quindi di recente ho capito che esiste un HLT
codice operativo per arrestare la CPU. Bene, vediamo cosa succede!
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! Che noioso.
Si scopre che HLT
è un'istruzione privilegiata, quindi proviamo qualcos'altro.
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$
Non succede nulla! Noioso!
A quanto pare, HLT
arresta la CPU ... fino al prossimo interrupt. Bene, quindi proviamo a disabilitare gli interrupt. CLI
sembra che farà quello che vogliamo.
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
... ea questo punto, il sistema operativo ha smesso di rispondere al mio input. Non riuscivo a spostare il cursore o digitare qualsiasi cosa usando la mia tastiera. Abbastanza congelato.
Solo che non lo era. L'orologio nel pannello della mia GUI continuava a funzionare. Diavolo, anche la musica continuava a suonare. Era come se solo il mio mouse e la mia tastiera avessero smesso di funzionare. Mi sono reso conto che la mia tastiera (USB) non era più alimentata, nemmeno il LED di blocco maiuscole avrebbe funzionato.
Allora, cosa è successo qui? Perché un paio di istruzioni che ritengo dovrebbero "riagganciare" il sistema solo spegnendo i miei dispositivi USB? Perché tutto il resto continua a funzionare? Come bonus: cosa devo fare per bloccare il sistema?
CLI
si applica solo alla CPU su cui è in esecuzione, quindi se hai più CPU dovresti eseguirla su ognuna. Tutto ciò che non si affida allaCLI+HLT
CPU sarebbe libero di continuare a modo suo