Vì vậy, gần đây tôi đã phát hiện ra rằng có một HLT
opcode để tạm dừng CPU. Thật tuyệt, hãy xem điều gì xảy ra!
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:~$
Tât nhiên! Như thế nào là chán nản.
Hóa ra HLT
là một hướng dẫn đặc quyền, vì vậy hãy thử một cái gì đó khác.
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$
Chẳng có gì xảy ra! Nhàm chán!
Khi nó bật ra, HLT
tạm dừng CPU ... cho đến khi ngắt tiếp theo. Thật tuyệt, vì vậy hãy thử vô hiệu hóa các ngắt. CLI
Âm thanh như nó sẽ làm những gì chúng ta muốn.
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
... Và tại thời điểm này, HĐH đã ngừng đáp ứng đầu vào của tôi. Tôi không thể di chuyển con trỏ hoặc gõ bất cứ thứ gì bằng bàn phím của mình. Khá nhiều đông lạnh.
Ngoại trừ nó đã không. Đồng hồ trong bảng điều khiển GUI của tôi tiếp tục chạy. Địa ngục, thậm chí âm nhạc tiếp tục chơi. Như thể chỉ có chuột và bàn phím của tôi đã ngừng hoạt động. Tôi nhận ra rằng bàn phím (USB) của tôi không còn nguồn nữa, thậm chí đèn LED không khóa của tôi cũng không hoạt động.
Vì vậy, những gì đã xảy ra ở đây? Tại sao một cặp hướng dẫn mà tôi cảm thấy muốn "treo" hệ thống chỉ tắt các thiết bị USB của tôi? Tại sao mọi thứ khác tiếp tục chạy? Như một phần thưởng: Tôi phải làm gì để thực sự làm cho hệ thống đóng băng?
CLI
chỉ áp dụng cho CPU mà nó đang chạy, vì vậy nếu bạn có nhiều CPU, bạn sẽ phải chạy nó trên mỗi CPU. Bất cứ điều gì không dựa vàoCLI+HLT
CPU sẽ được tự do tiếp tục trên con đường vui vẻ của nó