Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [OSDEV] Spegnere la macchina da codice
Forum - C/C++ - [OSDEV] Spegnere la macchina da codice

Avatar
LittleHacker (Member)
Guru


Messaggi: 1033
Iscritto: 28/04/2009

Segnala al moderatore
Postato alle 21:44
Martedì, 26/03/2013
Salve a tutti, sto portando avanti il mio progetto: "MudStorm OS", e ho un problema per quanto riguarda lo spegnimento della Macchina virtuale!

Prima usavo questo codice:
Codice sorgente - presumibilmente Plain Text

  1. asm("movw $0x1000,%ax;"
  2.             "movw %ax,%ss;"
  3.             "movw $0xf000,%sp;"
  4.             "movw $0x5307,%ax;"
  5.             "movw $1,%bx;"
  6.             "movw $3,%cx;"
  7.             "int  $0x15;");



Che però non mi spegneva la macchina, ma la mandava in crash con eccezzione: "General Protection Fault Exception"!"
Adesso, uso questo codice:

Codice sorgente - presumibilmente Plain Text

  1. __asm__ __volatile__ ("cli");
  2. __asm__ __volatile__ ("hlt");



Questo non la manda in crash, blocca gli interrupt, ma rimane sempre attiva, io invece vorrei che si spegnesse completamente, con la chiusura della macchina! Come posso fare?
Grazie mille! :k:


Android User :)

MudStorm OS Source GitHub: https://github.com/Piso94/MudStorm-OS
PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 8:42
Mercoledì, 27/03/2013
ciao,

qui -> http://stackoverflow.com/questions/678458/shutdown-the-com ... alcune  risposte fanno al caso tuo... ;)

ciao


... sei un proxy che perde i pacchetti ...
PM Quote
Avatar
LittleHacker (Member)
Guru


Messaggi: 1033
Iscritto: 28/04/2009

Segnala al moderatore
Postato alle 21:33
Mercoledì, 27/03/2013
Testo quotato

Postato originariamente da tasx:

ciao,

qui -> http://stackoverflow.com/questions/678458/shutdown-the-com ... alcune  risposte fanno al caso tuo... ;)

ciao



Avevo già provato, ma non funzionano!
Invece ho trovato questo:
Codice sorgente - presumibilmente Plain Text

  1. __asm__ __volatile__ ("cli");
  2. __asm__ __volatile__ ("outw %1, %0" : : "dN" ((unsigned short)0xB004), "a" ((unsigned short)0x2000));



E funziona! :rotfl: :k:
Grazie lo stesso per la risposta! :k:

Edit:
Questo codice funziona solo su QEMU(altre VM non le ho provate), ma su Macchina Reale no!

ReEdit:

Ho trovato un codice che funziona su tutte le VM (non testato su Bochs), ma sempre no su quella Reale :grr: ! Comunque ecco il codice:

Codice sorgente - presumibilmente C++

  1. // Questa è l'istruzione vecchia che spegneva solo la macchina virtuale QEMU!
  2.         //asm volatile ("outw %1, %0" : : "dN" ((unsigned short)0xB004), "a" ((unsigned short)0x2000));
  3.        
  4.         // Questa è quella nuova che spegne tutte le VM, ma non quelle reali!
  5.         asm volatile ("cli");
  6.         for (;;)
  7.         {
  8.               // Funziona per QEMU e Bochs
  9.               outportw (0xB004, 0x2000);
  10.        
  11.               // Magic shutdown per Bochs e QEMU
  12.               for (const char *s = "Shutdown"; *s; ++s)
  13.                         outportb (0x8900, *s);
  14.  
  15.               // Magic code per VMWare
  16.               asm volatile ("cli; hlt");
  17.         }


Ultima modifica effettuata da LittleHacker il 01/04/2013 alle 0:07


Android User :)

MudStorm OS Source GitHub: https://github.com/Piso94/MudStorm-OS
PM Quote