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 drodze