Ci sono più cose che possono causare la fuoriuscita di registro, dalla preemption di thread come hai menzionato a tutti i tipi di interrupt. Al momento non c'è modo di prevenirlo, a meno di disabilitare completamente le interruzioni (che è difficile quando si prendono in considerazione gli NMI e le SMI) e la preventiva. Questo può essere fatto solo in kernelmode e rende un computer completamente inutilizzabile.
Penso che il problema sia l'incomprensione dello scopo di mlock()
. Non è progettato per mantenere le informazioni sensibili fuori dalla RAM (dopo tutto, la memoria bloccata è ancora memoria), ma per impedire che venga scambiata su disco, per ragioni di sicurezza o di prestazioni. I registri che sono stati messi in pila durante un cambio di contesto non sono soggetti ad essere scambiati in primo luogo. Non appena l'interruttore di contesto è finito, i registri vengono ripristinati.
Does the kernel save registers in the same location each time?
I registri vengono salvati in alcune posizioni, a seconda dell'origine dell'interruttore di contesto. Nel file sorgente del kernel arch/x86/entry/entry_64.S
, generale i registri di scopo vengono spinti in pila, in genere utilizzando macro dedicate. Successivamente vengono ripristinati usando il pop. Le macro rilevanti (come SAVE_C_REGS
e RESTORE_C_REGS
) sono definite in arch/x86/entry/calling.h
.