Тому я нещодавно зрозумів, що існує 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:~$
Да! Як нудно.
Виявляється, 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-пристрої? Чому все інше продовжує працювати? Як бонус: Що мені потрібно зробити, щоб система фактично замерзла?
CLI
стосується лише центрального процесора, на якому він працює, тому, якщо у вас є кілька процесорів, вам доведеться запускати його на кожному. Все, що не покладається наCLI+HLT
процесор, буде вільне продовжувати свій веселий шлях