Що насправді відбувається, коли я запускаю «cli; hlt ”у моїй системі Linux?


16

Тому я нещодавно зрозумів, що існує 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-пристрої? Чому все інше продовжує працювати? Як бонус: Що мені потрібно зробити, щоб система фактично замерзла?


3
Що це за система? CLIстосується лише центрального процесора, на якому він працює, тому, якщо у вас є кілька процесорів, вам доведеться запускати його на кожному. Все, що не покладається на CLI+HLTпроцесор, буде вільне продовжувати свій веселий шлях
Ерік Реноф,

2
Я перевірив це на моїй звичайній настільній машині, що працює на одному процесорі з декількома ядрами. Я знаю, що кожне ядро ​​- це також один "логічний" процесор; це те, про що ти маєш на увазі?
потай

Відповіді:


2

Припинення процесора не повністю зупиняє процесор. Зазвичай він виконується операційною системою, коли більше роботи не потрібно робити. Потім процесор переходить у стан IDLE, з якого він може прокинутися в будь-який час для прикладу шляхом переривання, але також і ACPI - тому ви можете спробувати зупинити це також: у вашому BIOS або як аргумент завантаження:

acpi = вимкнено

Причиною того, що USB-пристрої більше не працюють, було пов’язано з відключеними перериваннями, хоча згідно з цим обговоренням USB не переривається за рахунок дизайну.

Довідково: https://en.wikipedia.org/wiki/X86_instruction_listings

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.