Điều gì thực sự xảy ra khi tôi chạy trên cli cli; Có gì trên hệ thống Linux của tôi?


16

Vì vậy, gần đây tôi đã phát hiện ra rằng có một HLTopcode để 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 HLTlà 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, HLTtạ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?


3
Đây là loại hệ thống gì? CLIchỉ á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ào CLI+HLTCPU sẽ được tự do tiếp tục trên con đường vui vẻ của nó
Eric Renouf

2
Tôi đã thử nghiệm nó trên máy tính để bàn bình thường của tôi chạy trên một CPU có nhiều lõi. Tôi biết rằng mỗi lõi cũng là một CPU "hợp lý"; đó là những gì bạn đang đề cập đến?
bí mật

Câu trả lời:


2

Ngừng CPU không hoàn toàn dừng bộ xử lý. Nó thường được thực thi bởi hệ điều hành khi không còn nhiều việc phải làm. CPU sau đó đi vào trạng thái IDLE mà từ đó nó có thể thức dậy bất cứ lúc nào để lấy mẫu bằng một ngắt, nhưng cũng bởi ACPI - vì vậy bạn cũng có thể muốn dừng điều đó: Trong BIOS của bạn hoặc làm đối số khởi động:

acpi = tắt

Lý do khiến các thiết bị USB không hoạt động được nữa là do các ngắt bị vô hiệu hóa mặc dù theo cuộc thảo luận này, USB không bị gián đoạn do thiết kế.

Để tham khảo: https://en.wikipedia.org/wiki/X86_in cản_listings

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.