Come faccio a rilevare a livello di codice in cui l'anello (-1, 0, 1, 2, 3) Sono in esecuzione?
-
23-08-2019 - |
Domanda
Come faccio a rilevare a livello di codice in cui l'anello (-1, 0, 1, 2, 3) Sono in esecuzione?
Soluzione
Il modo più semplice è, per eseguire solo il comando (x86) e intercettare l'errore corrispondente.
es. (SEH, Windows, in modalità kernel)
bool ring_lower_0 = false;
__try
{
__asm { <cmd> };
ring_lower_0 = true;
}
__except( GetExceptionCode() == EXCEPTION_PRIV_INSTRUCTION )
{
ring_lower_0 = false;
}
Note:
cmd, è un comando assembler. Per un elenco dei comandi e dei loro rispettivi livelli di Anello vedere i manuali di riferimento Intel Architecture.
Linux ha un concetto leggermente diverso.
Ma ricordate che VM che risiedono su un livello più basso può mascherare il risultato emulando la chiamata.
(NB: il lavoro del VM è quello di tradurre l'istruzione non valida in una chiamata significativo)
Se davvero si vuole controllare se il vostro un virtualizzato e vuole fermare l'esecuzione a causa di questo, si dovrebbe leggere ciò che è stato scritto su 'La pillola rossa'.
Altri suggerimenti
A meno che non sei un driver di periferica, sarai sempre in esecuzione in Ring 3 (per i sistemi che hanno "anelli", di per sé).
Normalmente avrei scritto che si dovrebbe leggere "Programmazione modalità protetta". C'è un articolo su come intertact con anello 0 si utilizza Windows XP SP2. Si noti che cambierà per gli altri le versioni di Windows e di sicuro altri sistemi operativi.
http://www.codeproject.com/KB/threads/MinimalisticRingZero.aspx
Se si desidera solo per rilevare se si esegue all'interno di una macchina virtuale, al fine di evitare che le persone eseguire il debug delle applicazioni, ad esempio, è possibile controllare qui: