Co się właściwie dzieje, kiedy uruchamiam „cli; hlt ”w moim systemie Linux?

16

Niedawno odkryłem, że istnieje HLTkod operacji do zatrzymania procesora. Fajnie, zobaczmy co się stanie!

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:~$

Hه! Jak nudna.

Okazuje się, że HLTjest to uprzywilejowana instrukcja, więc spróbujmy czegoś innego.

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$

Nic się nie dzieje! Nudny!

Jak się okazuje, HLTzatrzymuje procesor ... aż do następnego przerwania. Fajnie, spróbujmy wyłączyć przerwania. CLIwygląda na to, że zrobi to, co chcemy.

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

... i w tym momencie system operacyjny przestał reagować na moje dane wejściowe. Nie mogłem przesuwać kursora ani pisać niczego za pomocą klawiatury. Prawie zamrożone.

Tyle że nie było. Zegar w panelu mojego GUI działał dalej. Do diabła, nawet muzyka grała dalej. To było tak, jakby tylko moja mysz i klawiatura przestały działać. Uświadomiłem sobie, że moja klawiatura (USB) nie ma już zasilania, nawet dioda LED mojej czapki nie zadziała.

Co się tu stało? Dlaczego para instrukcji, które mam na myśli, powinna „rozłączyć się” z systemem, aby zamknąć tylko urządzenia USB? Dlaczego wszystko inne działa? Jako bonus: co muszę zrobić, aby system zawiesił się?

Secretpow
źródło
3
Co to za system? CLIdotyczy tylko procesora, na którym jest uruchomiony, więc jeśli masz wiele procesorów, musisz uruchomić go na każdym z nich. Wszystko, co nie opiera się na CLI+HLTprocesorze, będzie kontynuowane na wesołej drodze
Eric Renouf
2
Przetestowałem to na moim normalnym komputerze stacjonarnym działającym na jednym procesorze z wieloma rdzeniami. Wiem, że każdy rdzeń jest również jednym „logicznym” procesorem; czy o to ci chodzi?
secretpow

Odpowiedzi:

2

Zatrzymanie procesora nie powoduje całkowitego zatrzymania procesora. Zwykle jest wykonywany przez system operacyjny, gdy nie ma już pracy do wykonania. Następnie procesor przechodzi w stan bezczynności, z którego może się w każdej chwili obudzić, na przykład przez przerwanie, ale także przez ACPI - więc możesz spróbować zatrzymać to również: W systemie BIOS lub jako argument rozruchowy:

acpi = wyłączone

Powodem, dla którego urządzenia USB przestały działać, były spowodowane wyłączonymi przerwaniami, chociaż zgodnie z tą dyskusją USB nie jest przerywane przez projekt.

W celach informacyjnych: https://en.wikipedia.org/wiki/X86_instruction_listings

Phlogi
źródło