Niedawno odkryłem, że istnieje HLT
kod 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 HLT
jest 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, HLT
zatrzymuje procesor ... aż do następnego przerwania. Fajnie, spróbujmy wyłączyć przerwania. CLI
wyglą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ę?
CLI
dotyczy 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ę naCLI+HLT
procesorze, będzie kontynuowane na wesołej drodzeOdpowiedzi:
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:
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
źródło