Apa yang sebenarnya terjadi ketika saya menjalankan “cli; hlt ”di sistem Linux saya?

16

Jadi saya baru-baru tahu bahwa ada HLTopcode untuk menghentikan CPU. Keren, mari kita lihat apa yang terjadi!

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:~$

Duh! Betapa membosankan.

Ternyata HLTinstruksi yang istimewa, jadi mari kita coba sesuatu yang lain.

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$

Tidak ada yang terjadi! Membosankan!

Ternyata, HLTmenghentikan CPU ... sampai interupsi berikutnya. Keren, jadi mari kita coba nonaktifkan interupsi. CLIKedengarannya seperti itu akan melakukan apa yang kita inginkan.

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

... dan pada titik ini, OS berhenti merespons input saya. Saya tidak bisa memindahkan kursor, atau mengetik apa pun menggunakan keyboard saya. Cukup beku.

Tapi ternyata tidak. Jam di panel GUI saya terus berjalan. Sial, bahkan musiknya terus diputar. Seolah-olah hanya mouse dan keyboard saya yang berhenti bekerja. Saya menyadari bahwa keyboard (USB) saya tidak memiliki daya lagi, bahkan LED caps lock saya tidak akan berfungsi.

Jadi, apa yang terjadi di sini? Mengapa sepasang instruksi yang saya rasa harus "menutup" sistem hanya mematikan perangkat USB saya? Mengapa semua yang lain terus berjalan? Sebagai bonus: Apa yang harus saya lakukan untuk benar-benar membuat sistem macet?

secretpow
sumber
3
Sistem apa ini? CLIhanya berlaku untuk CPU yang menjalankannya, jadi jika Anda memiliki banyak CPU, Anda harus menjalankannya pada masing-masing CPU. Apa pun tidak bergantung pada CLI+HLTCPU akan bebas untuk melanjutkan di jalan gembira nya
Eric Renouf
2
Saya mengujinya pada mesin desktop normal saya yang berjalan pada satu CPU dengan banyak core. Saya tahu bahwa setiap inti juga satu CPU "logis"; Apakah itu yang Anda maksud?
secretpow

Jawaban:

2

Menghentikan CPU tidak sepenuhnya menghentikan prosesor. Biasanya dijalankan oleh sistem operasi ketika tidak ada lagi pekerjaan yang harus dilakukan. CPU kemudian memasuki keadaan IDLE dari mana ia dapat bangun kapan saja untuk dicoba oleh interupsi, tetapi juga oleh ACPI - jadi Anda mungkin ingin mencoba untuk menghentikannya juga: Di BIOS Anda atau sebagai argumen boot:

acpi = mati

Alasan untuk perangkat USB untuk tidak bekerja lagi adalah karena gangguan yang dinonaktifkan meskipun menurut diskusi ini USB tidak terganggu oleh desain.

Untuk referensi: https://en.wikipedia.org/wiki/X86_instruction_listings

Phlogi
sumber