所以我最近发现有一个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 设备?为什么其他一切都继续运行?作为奖励:我必须做什么才能真正让系统冻结?
答案1
停止 CPU 并不完全停止处理器。它通常由操作系统在没有更多工作要做时执行。然后 CPU 进入空闲状态,它可以随时唤醒,例如通过中断,也可以通过 ACPI - 因此您可能也想尝试停止它:在您的 BIOS 中或作为启动参数:
acpi=关闭
USB 设备无法工作的原因是中断被禁用,尽管根据这次讨论USB 在设计上不是中断驱动的。