だから私は最近HLT
、CPUを停止するためのオペコードがあることがわかりました。クール、何が起こるか見てみましょう!
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:~$
ああ!なんてつまらない。
判明したこと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
、次の割り込みまでCPUを停止します。クールなので、割り込みを無効にしてみましょう。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
...そしてこの時点で、OSは入力に応答しなくなりました。カーソルを動かしたり、キーボードを使って何かを入力したりできませんでした。かなり凍っています。
そうでないことを除いて。GUIのパネルの時計は動作し続けました。地獄、音楽も演奏し続けた。マウスとキーボードだけが機能しなくなったかのようでした。(USB)キーボードにはもう電源がなく、キャップロックLEDでも動作しないことに気付きました。
それで、ここで何が起こったのですか?システムを「ハングアップ」する必要があると感じる2つの指示が、USBデバイスのみをシャットダウンするのはなぜですか?他のすべてが実行し続けるのはなぜですか?ボーナスとして:システムを実際にフリーズさせるにはどうすればよいですか?
CLI
実行中のCPUにのみ適用されるため、複数のCPUがある場合は、それぞれで実行する必要があります。頼らない何かCLI+HLT
CPUは、その陽気な方法で継続して自由になる