Was passiert eigentlich, wenn ich „cli; hlt ”auf meinem Linux-System?


16

Also habe ich kürzlich herausgefunden, dass es einen HLTOpcode zum Anhalten der CPU gibt. Cool, mal sehen was passiert!

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! Wie langweilig.

Es stellt sich heraus, dass HLTes sich um eine privilegierte Anweisung handelt. Probieren wir also etwas anderes aus.

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$

Nichts passiert! Langweilig!

Wie sich herausstellt, HLThält die CPU an ... bis zum nächsten Interrupt. Cool, also lassen Sie uns versuchen, Interrupts zu deaktivieren. CLIklingt so, als würde es tun, was wir wollen.

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

... und zu diesem Zeitpunkt reagierte das Betriebssystem nicht mehr auf meine Eingaben. Ich konnte den Cursor nicht bewegen oder mit meiner Tastatur nichts eingeben. Ziemlich gefroren.

Nur dass es nicht so war. Die Uhr in meinem GUI-Panel lief weiter. Verdammt, sogar die Musik spielte weiter. Es war, als hätten nur meine Maus und meine Tastatur aufgehört zu funktionieren. Ich stellte fest, dass meine (USB-) Tastatur keinen Strom mehr hatte und nicht einmal meine Feststelltaste funktionierte.

Also, was ist hier passiert? Warum sollte ein Befehlspaar, nach dem ich das Gefühl habe, das System "aufhängen", nur meine USB-Geräte herunterfahren? Warum läuft alles andere weiter? Als Bonus: Was muss ich tun, damit das System tatsächlich einfriert?


3
Was für ein System ist das? CLIDies gilt nur für die CPU, auf der es ausgeführt wird. Wenn Sie also mehrere CPUs haben, müssen Sie es auf jeder einzelnen ausführen. Alles, was sich nicht auf die CLI+HLTCPU verlässt , kann auf seinem fröhlichen Weg weitermachen
Eric Renouf

2
Ich habe es auf meinem normalen Desktop-Rechner getestet, der auf einer CPU mit mehreren Kernen läuft. Ich weiß, dass jeder Kern auch eine "logische" CPU ist; ist es das, worauf du dich beziehst?
secretpow

Antworten:


2

Durch das Anhalten der CPU wird der Prozessor nicht vollständig angehalten. Es wird normalerweise vom Betriebssystem ausgeführt, wenn keine Arbeit mehr zu erledigen ist. Die CPU geht dann in einen IDLE-Zustand über, aus dem sie beispielsweise durch einen Interrupt, aber auch durch ACPI jederzeit aufgeweckt werden kann. Vielleicht möchten Sie dies auch stoppen: In Ihrem BIOS oder als Boot-Argument:

acpi = aus

Der Grund dafür, dass USB-Geräte nicht mehr funktionieren, lag in den deaktivierten Interrupts, obwohl USB laut dieser Diskussion nicht durch das Design interruptgesteuert ist.

Als Referenz: https://en.wikipedia.org/wiki/X86_instruction_listings

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.