2011-10-12 13 views
5

Sto studiando RDTSC e sto imparando come è virtualizzato per gli scopi di macchine virtuali come VirtualBox e VMWare. Perché Intel/AMD ha fatto tutto il problema di virtualizzare questa istruzione?Perché RDTSC è un'istruzione virtualizzata sui processori moderni?

Mi sembra che possa essere facilmente simulato con una trappola e non è esattamente un'istruzione super-comune (ho provato e non c'è alcun rallentamento notevole per l'uso generale in una macchina virtuale in cui la virtualizzazione RDTSC dell'hardware è disabilitata).

Tuttavia, so che Intel/AMD non avrebbe avuto alcun problema ad aggiungere questa istruzione all'hardware di virtualizzazione a meno che non fosse importante poter eseguire molto rapidamente.

Qualcuno sa perché?

+0

Nota che secondo i miei test, su un'istanza EC2 standard RDTSC è * non * virtualizzato (ho usato i test a [questa domanda su haveged] (http: // security.stackexchange.com/questions/34523/is-it-appropriate-to-use-haveged-as-a-source-of-entropy-on-virtual-machines) - anche questo sembra essere confermato dal commento su [ questo thread] (https://forums.aws.amazon.com/thread.jspa?messageID=221076&tstart=0#jive-message-231568) – Korny

risposta

7

È comune utilizzare RDTSC per ottenere informazioni di sincronizzazione a grana fine, in cui il sovraccarico di una trappola di virtualizzazione sarebbe piuttosto significativo. L'uso più comune è quello di avere due istruzioni RDTSC con una piccola quantità di codice tra di loro, prendendo la differenza dei tempi come il tempo trascorso (numero di cicli) per la sequenza di codice. Quindi anche il sovraccarico di scarichi/svuotamenti di tubature è piuttosto significativo.

Inoltre, dal momento che tutte le istruzioni vengono lette da un contatore in esecuzione continua, la virtualizzazione è abbastanza semplice - l'hardware deve solo consentire il salvataggio/ricaricamento del valore del contatore sugli interruttori di contesto VM e non qualcosa di speciale per l'istruzione RDTSC si.

+0

Ok, ho capito perché avresti bisogno della virtualizzazione per tempistiche a grana molto fine di un breve sequenza di istruzioni Tuttavia, l'unica ragione per cui posso pensare a questo scopo sono gli scopi di ricerca, o attacchi di canale laterale. Ci sono motivi legittimi? Sembra quasi come la virtualizzazione di rdtsc è il male –

+0

(non implicare la ricerca isn ' t legittimo: P, volevo dire "qualsiasi altra gamba" motivi più importanti oltre al compito vitale, ma non comune, della ricerca di cronometraggio a grana fine? ") –

+0

Bene, se NON si virtualizza correttamente RDTSC, diventa un modo semplice per un programma di rilevare se è in esecuzione in virtualizzazione, cosa che potrebbe non volere –

2

Le macchine virtuali devono poter disporre di TSC separati perché si avviano in momenti diversi. La CPU fisica ne ha solo una, quindi è necessario qualcosa per ottenere almeno compensi TSC individuali per VM.

Inoltre, poiché le macchine virtuali non possiedono interamente le CPU fisiche sottostanti, cioè non le eseguono continuamente su di esse, i loro TSC dovrebbero in qualche modo riflettere i periodi "on/off" ed è desiderabile che non cambino improvvisamente in valore tempo effettivo, che le macchine virtuali dovrebbero ancora ottenere direttamente dal sistema operativo host, perché c'è un sacco di software che è la virtualizzazione non già pronto e può interrompersi quando i numeri sono troppo spenti.

Penso che questi siano i motivi per cui RDTSC è virtualizzato. Ma qualunque cosa tu faccia, soddisfare requisiti conflittuali è difficile e complicare le cose. Non è possibile nascondere la virtualizzazione e fare in modo che le macchine virtuali funzionino alla velocità quasi nativa allo stesso tempo. Ci sono trade off e alcune cose devono cedere.

Problemi correlati