Ciò che questo codice fa è accedere al blocco di memoria specificato dai parametri ptr e size in un modello insolito: legge byte zero, quindi il byte con un offset di 16 pagine, quindi il byte uno, quindi un byte con un offset di 16 pagine più uno e così via, alternando tra un byte e la sua controparte 16 pagine in anticipo.
Questo modello di accesso specifico in Windows 95 ha sconfitto l'algoritmo di rilevamento "scansione sequenziale della memoria".
Ricordiamo che i computer dell'era Windows 95 avevano 4 MB di RAM. Supponiamo che tu stia lavorando a lungo in un documento. Finalmente hai finito e chiudi la finestra o la minimizzi. Boom, ora il tuo desktop è visibile e la bitmap dello sfondo deve essere cercata. Se lo schermo è 1024 × 768 a 16 bit per pixel, questo risulta a 1,5 MB di memoria. Il paging in 1,5 MB di memoria significa per la bitmap significa espellere 1,5 MB di memoria utilizzata per altre cose, e questa è molta memoria per una macchina che ha solo 4 MB con cui lavorare (specialmente perché gran parte di quei 4 MB appartiene a cose che non è idoneo per il paging). Il fenomeno che abbiamo visto è stato che ridipingere il desktop cancellerebbe la maggior parte della memoria.
E poi la prossima cosa che fai è probabilmente lanciare una nuova applicazione, che coprirà lo sfondo, quindi la memoria dello sfondo non sarà più necessaria. Quindi abbiamo praticamente eliminato tutta la memoria del tuo sistema al fine di gestire un enorme blocco di memoria a cui è stato effettuato l'accesso solo una volta.
Il trucco usato da Windows 95 era guardare il tuo schema di errori di pagina, e se vedeva che stavi facendo un accesso sequenziale alla memoria, ha iniziato a contrassegnare la memoria 16 pagine dietro l'accesso corrente come non di recente accesso . Nel caso di una scansione sequenziale diretta, ciò significa che l'intero buffer scorre ciclicamente attraverso una finestra di memoria di 64 KB, indipendentemente dalle dimensioni del buffer. Con questo trucco, un buffer da 4 MB finisce per consumare solo 64 KB di memoria, invece di utilizzare tutta la memoria del sistema.
La Sys_PageIn
funzione sconfigge specificamente il rilevatore a scansione sequenziale tornando intenzionalmente indietro di 16 pagine e accedendo nuovamente alla pagina. Questo fa sì che venga contrassegnato come usato di recente , contrastando ciò che non è stato utilizzato di recente dal rivelatore a scansione sequenziale. Risultato: le pagine di memoria sono tutte contrassegnate di recente e non sono più i candidati principali per il paging.