Así que recientemente descubrí que hay un HLT
código de operación para detener la CPU. ¡Genial, veamos qué pasa!
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! Qué aburrido.
Resulta que HLT
es una instrucción privilegiada, así que intentemos otra cosa.
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$
¡No pasa nada! ¡Aburrido!
Como resultado, HLT
detiene la CPU ... hasta la próxima interrupción. Genial, así que intentemos desactivar las interrupciones. CLI
Parece que hará lo que queramos.
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
... y en este punto, el sistema operativo dejó de responder a mi entrada. No podía mover el cursor ni escribir nada con mi teclado. Bastante congelado.
Excepto que no lo fue. El reloj en el panel de mi GUI seguía funcionando. Demonios, incluso la música seguía sonando. Era como si solo mi mouse y mi teclado hubieran dejado de funcionar. Me di cuenta de que mi teclado (USB) ya no tenía energía, ni siquiera funcionaba mi LED de bloqueo de mayúsculas.
Entonces, ¿qué pasó aquí? ¿Por qué un par de instrucciones que creo que deberían "colgar" el sistema solo apaga mis dispositivos USB? ¿Por qué todo lo demás sigue funcionando? Como beneficio adicional: ¿qué debo hacer para que el sistema se congele?
CLI
solo se aplica a la CPU en la que se está ejecutando, por lo que si tiene varias CPU, debería ejecutarla en cada una. Cualquier cosa que no dependa de laCLI+HLT
CPU sería libre de continuar en su feliz caminoRespuestas:
Detener la CPU no detiene completamente el procesador. Por lo general, el sistema operativo lo ejecuta cuando no hay más trabajo por hacer. Luego, la CPU ingresa en un estado IDLE desde el cual puede despertarse en cualquier momento por ejemplo por una interrupción, pero también por ACPI, por lo que es posible que desee intentar detener eso también: en su BIOS o como un argumento de arranque:
La razón por la que los dispositivos USB ya no funcionan se debe a las interrupciones desactivadas, aunque de acuerdo con esta discusión, el diseño no interrumpe el USB.
Para referencia: https://en.wikipedia.org/wiki/X86_instruction_listings
fuente