“Cli; hlt ”?


16

Son zamanlarda HLTCPU'yu durdurmak için bir opcode olduğunu anladım . Harika, bakalım ne olacak!

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! Ne kadar sıkıcı.

Çıktı HLTayrıcalıklı bir talimattır, bu yüzden başka bir şey deneyelim.

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$

Hiçbir şey olmuyor! Sıkıcı!

Sonradan anlaşıldı ki, HLTCPU ... sonraki kesme kadar durur. Harika, kesintileri devre dışı bırakmayı deneyelim. CLIistediğimizi yapacak gibi görünüyor.

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

... ve bu noktada, işletim sistemi girdilerime yanıt vermeyi durdurdu. İmleci hareket ettiremedim veya klavyemi kullanarak hiçbir şey yazamadım. Çok donmuş.

Dışında değildi. GUI panelimdeki saat çalışmaya devam etti. Cehennem, müzik bile çalmaya devam etti. Sanki sadece farem ve klavyem durmuş gibiydi. (USB) klavyemin artık gücü olmadığını, kapak kilidi LED'imin bile çalışmayacağını fark ettim.

Peki, burada ne oldu? Neden bir çift talimatın sistemi sadece "kapatması" gerektiğini düşündüğümde USB aygıtlarımı kapatıyor? Neden her şey koşmaya devam ediyor? Bonus olarak: Sistemin donmasını sağlamak için ne yapmam gerekir?


3
Bu nasıl bir sistem? CLIyalnızca üzerinde çalıştığı CPU için geçerlidir, bu nedenle birden fazla CPU'nuz varsa her birinde çalıştırmanız gerekir. CLI+HLTCPU'ya güvenmeyen her şey neşeli yoluna devam etmekte özgür olacak
Eric Renouf

2
Birden çok çekirdekli bir CPU üzerinde çalışan normal masaüstü makinemde test ettim. Her bir çekirdeğin de bir "mantıksal" CPU olduğunu biliyorum; bahsettiğin şey bu mu?
secretpow

Yanıtlar:


2

CPU'nun durdurulması işlemciyi tamamen durdurmaz. Yapılacak daha fazla iş olmadığında genellikle işletim sistemi tarafından yürütülür. CPU daha sonra bir kesme ile değil, aynı zamanda ACPI ile örnekleme için her zaman uyanabileceği bir IDLE durumuna girer - böylece bunu da durdurmayı deneyebilirsiniz: BIOS'unuzda veya bir önyükleme bağımsız değişkeni olarak:

ACPI = kapalı

USB aygıtlarının artık çalışmamasının nedeni, bu tartışmaya göre USB'nin tasarımla kesintiye uğramamasına rağmen, devre dışı bırakılmış kesintilerden kaynaklanıyordu .

Referans için: https://en.wikipedia.org/wiki/X86_instruction_listings

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.