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?
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