จะเกิดอะไรขึ้นเมื่อฉันเรียกใช้“ cli; hlt” ในระบบ Linux ของฉัน


16

ดังนั้นเมื่อเร็ว ๆ นี้ฉันคิดว่ามี 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 ของฉันเท่านั้น ทำไมทุกอย่างยังคงทำงานต่อไป เป็นโบนัส: ฉันต้องทำอะไรเพื่อทำให้ระบบหยุดทำงานจริง?


3
นี่เป็นระบบอะไร CLI ใช้กับ CPU ที่ทำงานอยู่เท่านั้นดังนั้นหากคุณมี CPU หลายตัวคุณจะต้องเรียกใช้งาน CPU แต่ละตัว สิ่งใดที่ไม่พึ่งพา CLI+HLT CPU มีอิสระที่จะดำเนินต่อไปอย่างสนุกสนาน
Eric Renouf

2
ฉันทดสอบบนเครื่องเดสก์ท็อปปกติของฉันที่ทำงานบน CPU ตัวเดียวที่มีหลายคอร์ ฉันรู้ว่าแต่ละคอร์เป็นซีพียู "ตรรกะ" หนึ่งตัว นั่นคือสิ่งที่คุณหมายถึง?
secretpow

คำตอบ:


2

การหยุด CPU ไม่หยุดโปรเซสเซอร์ชั่วคราว มันมักจะดำเนินการโดยระบบปฏิบัติการเมื่อไม่มีงานให้ทำอีกต่อไป จากนั้น CPU จะเข้าสู่สถานะ IDLE ซึ่งสามารถปลุกได้ทุกเวลาเพื่อ exmample โดยการขัดจังหวะ แต่ด้วย ACPI - ดังนั้นคุณอาจต้องการลองหยุดเช่นกัน: ใน BIOS ของคุณหรืออาร์กิวเมนต์การบูต:

ACPI = ปิด

สาเหตุที่อุปกรณ์ USB ไม่ทำงานอีกต่อไปเกิดจากการถูกขัดจังหวะการใช้งาน การสนทนานี้ USB ไม่ได้ถูกขัดจังหวะโดยการออกแบบ

สำหรับการอ้างอิง: https://en.wikipedia.org/wiki/X86_instruction_listings

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.