Так что я недавно выяснил, что есть код операции HLT
для остановки процессора. Круто, посмотрим что получится!
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! Как скучно.
Оказывается, HLT
- привилегированная инструкция, так что давайте попробуем что-нибудь еще.
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$
Ничего не произошло! Скучный!
Оказывается, HLT
останавливает процессор ... до следующего прерывания. Круто, так что давайте попробуем отключить прерывания. Похоже, CLI
будет делать то, что мы хотим.
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
... и в этот момент ОС перестала отвечать на мой ввод. Я не мог двигать курсор или набирать текст с помощью клавиатуры. Довольно сильно заморожен.
Кроме этого не было. Часы на панели моего графического интерфейса продолжали работать. Черт, даже музыка продолжала играть. Как будто только моя мышь и моя клавиатура перестали работать. Я понял, что моя клавиатура (USB) больше не питается, даже светодиодный индикатор блокировки колпачка не сработает.
Итак, что здесь произошло? Почему пара инструкций, которые, как мне кажется, должны "зависать", система отключает только мои USB-устройства? Почему все остальное продолжает работать? В качестве бонуса: что мне нужно сделать, чтобы система фактически зависла?