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


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

......此时,操作系统停止响应我的输入。我无法移动光标,或使用键盘输入任何内容。几乎冷冻。

除了它不是。 GUI面板中的时钟一直在运行。地狱,即使是继续播放的音乐。好像只有我的鼠标和键盘停止工作。我意识到我的(USB)键盘不再有电,甚至我的大写锁定LED都不会工作。

那么,这里发生了什么?为什么我认为应该“挂断”系统的一对指令只关闭我的USB设备?为什么其他一切继续运行?作为奖励:我需要做些什么来实际使系统冻结?


3
这是什么类型的系统? CLI 仅适用于正在运行的CPU,因此如果您有多个CPU,则必须在每个CPU上运行它。什么都不依赖于 CLI+HLT CPU可以自由地继续它的快乐方式
Eric Renouf

2
我在运行在一个具有多个内核的CPU上的普通台式机上测试了它。我知道每个核心也是一个“逻辑”CPU;那是你指的是什么?
secretpow

Answers:


2

暂停CPU并不会完全停止处理器。当没有更多的工作要做时,它通常由操作系统执行。然后,CPU进入IDLE状态,可以通过中断随时唤醒,也可以通过ACPI唤醒 - 所以你可能也想尝试停止它:在你的BIOS中或作为启动参数:

ACPI =关

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.