Was passiert eigentlich, wenn ich "cli; hlt" auf meinem Linux-System starte?

1515
secretpow

So habe ich kürzlich herausgefunden, dass es einen HLTOpcode für das 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 dies HLTeine privilegierte Anweisung ist, also versuchen wir etwas anderes.

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 bis zum nächsten Interrupt an. Cool, also versuchen wir mal, Interrupts zu deaktivieren. CLIklingt 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 über meine Tastatur etwas eingeben. Ziemlich gefroren.

Außer es war nicht. 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 arbeiten. Ich erkannte, dass meine (USB-) Tastatur nicht mehr mit Strom versorgt wurde, nicht einmal meine LED für die Feststelltaste würde funktionieren.

Also, was ist hier passiert? Warum sollten ein paar Anweisungen, bei denen ich das Gefühl habe, das System "auflegen", nur meine USB-Geräte herunterfahren? Warum läuft alles andere weiter? Als Bonus: Was muss ich tun, um das System tatsächlich einzufrieren?

16
Was für ein System ist das? `CLI` gilt nur für die CPU, auf der es läuft. Wenn Sie also mehrere CPUs haben, müssen Sie sie auf jeder CPU ausführen. Alles, was nicht auf die CLI + HLT-CPU angewiesen ist, kann frei weiterlaufen Eric Renouf vor 8 Jahren 3
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 Sie sich beziehen? secretpow vor 8 Jahren 2

1 Antwort auf die Frage

2
Phlogi

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, in dem sie jederzeit durch einen Interrupt, aber auch durch ACPI zum Beispiel aufgeweckt werden kann. Daher möchten Sie vielleicht auch versuchen, dies zu beenden: In Ihrem BIOS oder als Boot-Argument:

acpi = aus

Der Grund dafür, dass USB-Geräte nicht mehr funktionieren, war auf die deaktivierten Interrupts zurückzuführen, obwohl laut dieser Diskussion USB nicht vom Design abhängt.

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