Lo que realmente sucede cuando ejecuto "cli; hlt ”en mi sistema Linux?

16

Así que recientemente descubrí que hay un HLTcó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 HLTes 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, HLTdetiene la CPU ... hasta la próxima interrupción. Genial, así que intentemos desactivar las interrupciones. CLIParece 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?

secretpow
fuente
3
¿Qué tipo de sistema es este? CLIsolo 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 la CLI+HLTCPU sería libre de continuar en su feliz camino
Eric Renouf
2
Lo probé en mi máquina de escritorio normal que se ejecuta en una CPU con múltiples núcleos. Sé que cada núcleo es también una CPU "lógica"; ¿A eso te refieres?
secretpow

Respuestas:

2

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:

acpi = off

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

Phlogi
fuente