Ce que ce code fait, c'est accéder au bloc de mémoire spécifié par les paramètres ptr et size dans un modèle inhabituel: il lit l'octet zéro, puis l'octet avec un décalage de 16 pages, puis l'octet un, puis un octet avec un décalage de 16 pages plus un, et ainsi de suite, alternant entre un octet et son homologue 16 pages à venir.
Ce modèle d'accès spécifique dans Windows 95 a vaincu l'algorithme de détection «analyse séquentielle de la mémoire».
Rappelons que les ordinateurs de l'ère Windows 95 avaient 4 Mo de RAM. Supposons que vous travailliez depuis longtemps sur un document. Enfin, vous avez terminé et vous fermez la fenêtre ou la minimisez. Boom, maintenant votre bureau est visible et le bitmap du fond d'écran doit être paginé. Si votre écran est de 1024 × 768 à 16 bits par pixel, cela donne 1,5 Mo de mémoire. La pagination dans 1,5 Mo de mémoire signifie que le bitmap signifie le retrait de 1,5 Mo de mémoire utilisé pour d'autres choses, et cela représente beaucoup de mémoire pour une machine qui n'a que 4 Mo pour travailler (d'autant plus qu'une grande partie de ces 4 Mo appartient à des choses qui ne peut pas être paginé). Le phénomène que nous avons vu était que repeindre votre bureau viderait la majeure partie de votre mémoire.
Et puis la prochaine chose que vous faites est probablement de lancer une nouvelle application, qui couvrira le fond d'écran, de sorte que la mémoire du fond d'écran ne sera plus nécessaire. Nous avons donc essentiellement purgé toute la mémoire de votre système afin de gérer un énorme bloc de mémoire accessible une seule fois.
L'astuce utilisée par Windows 95 était de surveiller votre modèle de défauts de page, et s'il voyait que vous faisiez un accès séquentiel à la mémoire, il commençait à marquer la mémoire 16 pages derrière l'accès actuel comme non récemment consultée . Dans le cas d'un balayage séquentiel direct, cela signifie que le tampon entier parcourt une fenêtre de mémoire de 64 Ko, quelle que soit la taille du tampon. Avec cette astuce, un tampon de 4 Mo finit par ne consommer que 64 Ko de mémoire, au lieu d'utiliser toute la mémoire de votre système.
La Sys_PageIn
fonction détruit spécifiquement le détecteur à balayage séquentiel en remontant intentionnellement 16 pages et en accédant à nouveau à la page. Cela le marque comme récemment utilisé , contrebalançant le fait que le détecteur à balayage séquentiel n'avait pas été utilisé récemment . Résultat: les pages mémoire sont toutes marquées comme récemment utilisées et ne sont plus des candidats privilégiés pour être paginées.