Sto cercando di comprendere la "fusione", ma per prima cosa capisco, ho cercato di capire gli accessi alla memoria.
Da quanto ho capito, la CPU tenta di cercare l'indirizzo virtuale nel buffer lookaside di traduzione, che indica quali dati sono nella cache della CPU. Se è lì, lo recuperiamo immediatamente. Altrimenti, cerchiamo l'indirizzo nella tabella delle pagine.
Ora dalla mia lettura, ogni processo ha la sua tabella di pagine. Tuttavia, ogni processo ha anche il kernel mappato nella sua tabella di pagina.
Presumibilmente la tabella della pagina ha anche dei bit di accesso, ovviamente non possiamo permettere la lettura direttamente nello spazio del kernel quando la CPU è in modalità utente (penso che questo sia chiamato "ring-3").
Da quanto ho capito delle tabelle di pagine, questi bit di accesso sono memorizzati nei bit inferiori dell'indirizzo. Dato che le nostre voci di pagina sono 4k, ci sono molti bit rimasti per memorizzare i bit di accesso.
Da quanto ho letto sull'exploit, il problema è che il controllo per l'accesso viene eseguito dopo che i dati sono stati recuperati. La ragione di ciò è per motivi di efficienza, vogliamo ottenere rapidamente i dati nella CPU e possiamo solo rilevare l'errore di autorizzazione prima di apportare modifiche permanenti. Ma sfortunatamente abbiamo influenzato la cache della CPU eseguendo un recupero di memoria indiretta che è rilevabile tramite attacchi temporali.
Questo schema potrebbe avere senso se la ricerca della pagina fosse economica, ma il controllo dell'accesso è costoso. Ma dalla mia comprensione non sembra essere il caso.
Ho letto la tabella delle pagine su una macchina a 64 bit con almeno tre livelli, il che significa almeno tre ricerche di memoria. Spero che questi siano nella cache, ma se non lo sono, significa cercare ricorsivamente la tabella delle pagine per le proprie pagine.
Dopo aver eseguito tutto questo lavoro e finalmente trovato la voce della tabella di pagina, quando cariciamo l'indirizzo fisico dalla tabella della pagina, carichiamo anche i bit di accesso. Perché non controllarlo lì? Sembra molto più banale controllare il bit di accesso che abbiamo già caricato piuttosto che lasciarlo a bocca aperta con i circuiti per affrontarlo in seguito.
Ovviamente mi manca qualcosa su come funziona la CPU, ma non riesco a capire cosa. Dobbiamo fare la ricerca della tabella di pagina per capire anche cosa recuperare, e una volta che siamo andati a quel problema, perché non controllare semplicemente il bit di accesso?