当我在 Linux 系统上运行“cli; hlt”时实际发生了什么?

sec*_*pow 18 linux assembly

所以我最近发现有一个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:~$
Run Code Online (Sandbox Code Playgroud)

呸!多么无聊。

原来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$
Run Code Online (Sandbox Code Playgroud)

没发生什么事!无聊的!

事实证明,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
Run Code Online (Sandbox Code Playgroud)

...此时,操作系统停止响应我的输入。我无法移动光标,也无法使用键盘输入任何内容。冻得差不多了。

除了它不是。我的 GUI 面板中的时钟继续运行。见鬼,连音乐都在继续播放。就好像只有我的鼠标和键盘停止工作了。我意识到我的 (USB) 键盘不再有电,甚至我的大写锁定 LED 也无法工作。

那么,这里发生了什么?为什么我觉得应该“挂断”系统的一对指令只会关闭我的 USB 设备?为什么其他一切都继续运行?作为奖励:我必须做什么才能真正使系统冻结?

Phl*_*ogi 3

停止 CPU 并不完全停止处理器。当没有更多工作要做时,它通常由操作系统执行。然后,CPU 进入 IDLE 状态,可以随时从该状态唤醒,例如通过中断,也可以通过 ACPI - 因此您可能也想尝试停止这种情况:在 BIOS 中或作为启动参数:

ACPI=关闭

USB 设备不再工作的原因是由于禁用了中断,尽管根据此讨论USB 不是由设计驱动的中断。

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