Что на самом деле происходит, когда я запускаю «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:~$

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-устройства? Почему все остальное продолжает работать? В качестве бонуса: что мне нужно сделать, чтобы система фактически зависла?


3
Что это за система? CLIприменяется только к процессору, на котором он работает, поэтому, если у вас несколько процессоров, вам придется запускать его на каждом. Все, что не зависит от CLI+HLTпроцессора, будет свободно продолжать свой веселый путь
Эрик Ренуф,

2
Я проверил это на моей обычной настольной машине, работающей на одном процессоре с несколькими ядрами. Я знаю, что каждое ядро ​​также является одним «логическим» процессором; это то, что вы имеете в виду?
secretpow

Ответы:


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.