ดังนั้นเมื่อเร็ว ๆ นี้ฉันคิดว่ามี HLT
opcode สำหรับการหยุด 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) ของฉันไม่มีพลังงานอีกต่อไปแม้แต่ตัวพิมพ์ใหญ่ของฉันก็จะทำงาน
แล้วเกิดอะไรขึ้นที่นี่ ทำไมคู่คำสั่งที่ฉันรู้สึกว่าควร "วางสาย" ระบบจะปิดอุปกรณ์ USB ของฉันเท่านั้น ทำไมทุกอย่างยังคงทำงานต่อไป เป็นโบนัส: ฉันต้องทำอะไรเพื่อทำให้ระบบหยุดทำงานจริง?
CLI
ใช้กับ CPU ที่ทำงานอยู่เท่านั้นดังนั้นหากคุณมี CPU หลายตัวคุณจะต้องเรียกใช้งาน CPU แต่ละตัว สิ่งใดที่ไม่พึ่งพาCLI+HLT
CPU มีอิสระที่จะดำเนินต่อไปอย่างสนุกสนาน