「cli」を実行すると実際に何が起こりますか。Linuxシステムでhlt」


16

だから私は最近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デバイスのみをシャットダウンするのはなぜですか?他のすべてが実行し続けるのはなぜですか?ボーナスとして:システムを実際にフリーズさせるにはどうすればよいですか?


3
これはどのようなシステムですか? CLI実行中のCPUにのみ適用されるため、複数のCPUがある場合は、それぞれで実行する必要があります。頼らない何かCLI+HLTCPUは、その陽気な方法で継続して自由になる
エリックRenouf

2
複数のコアを持つ1つのCPUで実行されている通常のデスクトップマシンでテストしました。各コアも1つの「論理」CPUであることを知っています。それはあなたが言っていることですか?
secretpow

回答:


2

CPUを停止しても、プロセッサが完全に停止するわけではありません。通常、実行する作業がなくなったときにオペレーティングシステムによって実行されます。その後、CPUはIDLE状態になり、割り込みまたはACPIにより、いつでもウェイクアップできるようになります。したがって、同様に停止することもできます。BIOSまたはブート引数として:

acpi = off

USBデバイスが動作しない理由は、割り込みが無効になっているためです。ただし、この議論によると USBは設計によって割り込み駆動されません。

参考:https : //en.wikipedia.org/wiki/X86_instruction_listings

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.