Cosa succede effettivamente quando eseguo “cli; hlt "sul mio sistema Linux?


16

Quindi di recente ho capito che esiste un HLTcodice operativo per arrestare la CPU. Bene, vediamo cosa succede!

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! Che noioso.

Si scopre che HLTè un'istruzione privilegiata, quindi proviamo qualcos'altro.

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$

Non succede nulla! Noioso!

A quanto pare, HLTarresta la CPU ... fino al prossimo interrupt. Bene, quindi proviamo a disabilitare gli interrupt. CLIsembra che farà quello che vogliamo.

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

... ea questo punto, il sistema operativo ha smesso di rispondere al mio input. Non riuscivo a spostare il cursore o digitare qualsiasi cosa usando la mia tastiera. Abbastanza congelato.

Solo che non lo era. L'orologio nel pannello della mia GUI continuava a funzionare. Diavolo, anche la musica continuava a suonare. Era come se solo il mio mouse e la mia tastiera avessero smesso di funzionare. Mi sono reso conto che la mia tastiera (USB) non era più alimentata, nemmeno il LED di blocco maiuscole avrebbe funzionato.

Allora, cosa è successo qui? Perché un paio di istruzioni che ritengo dovrebbero "riagganciare" il sistema solo spegnendo i miei dispositivi USB? Perché tutto il resto continua a funzionare? Come bonus: cosa devo fare per bloccare il sistema?


3
Che tipo di sistema è questo? CLIsi applica solo alla CPU su cui è in esecuzione, quindi se hai più CPU dovresti eseguirla su ognuna. Tutto ciò che non si affida alla CLI+HLTCPU sarebbe libero di continuare a modo suo
Eric Renouf,

2
L'ho provato sulla mia normale macchina desktop in esecuzione su una CPU con più core. So che ogni core è anche una CPU "logica"; è quello a cui ti riferisci?
secretpow,

Risposte:


2

L'arresto della CPU non arresta completamente il processore. Di solito viene eseguito dal sistema operativo quando non c'è più lavoro da fare. La CPU entra quindi in uno stato IDLE dal quale può riattivarsi in qualsiasi momento per esempio da un interrupt, ma anche da ACPI - quindi potresti voler provare a fermarlo anche nel tuo BIOS o come argomento di avvio:

acpi = off

Il motivo per cui i dispositivi USB non funzionavano più era dovuto agli interrupt disabilitati, sebbene in base a questa discussione USB non sia guidato dalla progettazione.

Per riferimento: https://en.wikipedia.org/wiki/X86_instruction_listings

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.