Son zamanlarda HLT
CPU'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ı HLT
ayrı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, HLT
CPU ... sonraki kesme kadar durur. Harika, kesintileri devre dışı bırakmayı deneyelim. CLI
istediğ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?
CLI
yalnızca üzerinde çalıştığı CPU için geçerlidir, bu nedenle birden fazla CPU'nuz varsa her birinde çalıştırmanız gerekir.CLI+HLT
CPU'ya güvenmeyen her şey neşeli yoluna devam etmekte özgür olacak