Что на самом деле происходит, когда я запускаю "cli; hlt" в моей системе Linux?

1459
secretpow

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

16
Что это за система? `CLI` применяется только к процессору, на котором он запущен, поэтому, если у вас несколько процессоров, вам придется запускать его на каждом. Все, что не полагается на процессор `CLI + HLT`, будет свободно продолжать свой веселый путь Eric Renouf 8 лет назад 3
Я проверил это на моей обычной настольной машине, работающей на одном процессоре с несколькими ядрами. Я знаю, что каждое ядро ​​также является одним «логическим» процессором; это то, что вы имеете в виду? secretpow 8 лет назад 2

1 ответ на вопрос

2
Phlogi

Halting the CPU does not completely halt the processor. It's usually executed by the operating system when there is no more work to be done. The CPU then enters an IDLE state from which it can wake-up anytime for exmample by an interrupt, but also by ACPI - so you might want to try to stop that as well: In your BIOS or as a boot argument:

acpi=off

The reason for USB devices to not work anymore was due to the disabled interrupts although according to this discussion USB is not interrupt driven by design.

For reference: https://en.wikipedia.org/wiki/X86_instruction_listings

Похожие вопросы