Então eu descobri recentemente que há um HLT
opcode para parar a CPU. Legal, vamos ver o que acontece!
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! Que chato.
Acontece que HLT
é uma instrução privilegiada, então vamos tentar outra coisa.
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$
Nada acontece! Chato!
Acontece que HLT
interrompe a CPU ... até a próxima interrupção. Legal, então vamos tentar desabilitar as interrupções. CLI
parece que vai fazer o que quisermos.
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
... e neste ponto, o sistema operacional parou de responder à minha entrada. Não consegui mover o cursor nem digitar nada usando o teclado. Muito congelado.
Exceto que não foi. O relógio no painel da minha GUI continuou funcionando. Inferno, até a música continuou tocando. Era como se meu mouse e meu teclado parassem de funcionar. Eu percebi que meu teclado (USB) não tinha mais energia, nem mesmo meu LED de caps lock funcionava.
Então, o que aconteceu aqui? Por que um par de instruções que eu sinto como deveria "desligar" o sistema só desligam meus dispositivos USB? Por que todo o resto continua funcionando? Como um bônus: O que eu preciso fazer para realmente congelar o sistema?