Also habe ich kürzlich herausgefunden, dass es einen HLT
Opcode 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 HLT
es 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, HLT
hält die CPU an ... bis zum nächsten Interrupt. Cool, also lassen Sie uns versuchen, Interrupts zu deaktivieren. CLI
klingt 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?
CLI
Dies 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 dieCLI+HLT
CPU verlässt , kann auf seinem fröhlichen Weg weitermachenAntworten:
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:
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
quelle