O que realmente acontece quando corro “cli; hlt ”no meu sistema Linux?

16

Então eu descobri recentemente que há um HLTcódigo de operação para interromper 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 aborrecido.

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!

Como se vê, HLTinterrompe a CPU ... até a próxima interrupção. Legal, então vamos tentar desativar as interrupções. CLIParece que vai fazer o que queremos.

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 momento, o sistema operacional parou de responder às minhas informações. Não consegui mover o cursor nem digitar nada usando o teclado. Quase congelado.

Exceto que não era. O relógio no painel da minha GUI continuava funcionando. Inferno, até a música continuava tocando. Era como se apenas meu mouse e meu teclado parassem de funcionar. Percebi que meu teclado (USB) não tinha mais energia, nem mesmo o LED do caps lock funcionaria.

Então, o que aconteceu aqui? Por que um par de instruções que eu acho que deveria "desligar" o sistema apenas desligou meus dispositivos USB? Por que todo o resto continua funcionando? Como bônus: O que preciso fazer para congelar o sistema?

secretpow
fonte
3
Que tipo de sistema é esse? CLIaplica-se apenas à CPU em que está sendo executado; portanto, se você tiver várias CPUs, será necessário executá-la em cada uma. Qualquer coisa não contando com a CLI+HLTCPU estaria livre para continuar em seu caminho alegre
Eric Renouf
2
Eu testei na minha máquina de desktop normal rodando em uma CPU com vários núcleos. Eu sei que cada núcleo também é uma CPU "lógica"; é a isso que você está se referindo?
26816 secretpow

Respostas:

2

Interromper a CPU não interrompe completamente o processador. Geralmente é executado pelo sistema operacional quando não há mais trabalho a ser feito. A CPU entra em um estado inativo a partir do qual pode ser ativada a qualquer momento, por exemplo, por uma interrupção, mas também pela ACPI - então você pode tentar interromper também: Na BIOS ou no argumento de inicialização:

acpi = desativado

O motivo para os dispositivos USB não funcionarem mais foi devido às interrupções desativadas, embora, de acordo com essa discussão, o USB não seja interrompido por design.

Para referência: https://en.wikipedia.org/wiki/X86_instruction_listings

Phlogi
fonte