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?
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 dieCLI+HLTCPU verlässt , kann auf seinem fröhlichen Weg weitermachen