Этот код выполняет доступ к блоку памяти, указанному параметрами ptr и size, в необычном шаблоне: он читает нулевой байт, затем байт со смещением 16 страниц, затем один байт, затем байт со смещением 16 страниц плюс один и т. д., чередующийся между байтом и его аналогом на 16 страниц вперед.
Этот специфический шаблон доступа в Windows 95 побеждал алгоритм обнаружения «последовательного сканирования памяти».
Напомним, что компьютеры в эпоху Windows 95 имели 4 МБ ОЗУ. Предположим, вы долго работали над документом. Наконец, вы сделали, и вы закрываете окно или сверните его. Бум, теперь ваш рабочий стол виден, и растровые изображения обоев должны быть разбиты на страницы. Если ваш экран имеет разрешение 1024 × 768 при 16 битах на пиксель, это дает 1,5 МБ памяти. Пейджинг в 1,5 МБ памяти означает, что для растрового изображения нужно выкинуть 1,5 МБ памяти, используемой для других задач, и это достаточно памяти для машины, с которой нужно работать только 4 МБ (тем более, что большая часть этих 4 МБ принадлежит материалам). это не имеет права быть выгруженным). Феномен, который мы видели, состоял в том, что перекраска вашего рабочего стола вымывает большую часть вашей памяти.
И затем следующая вещь, которую вы делаете, вероятно, запускает новое приложение, которое покроет обои, так что память обоев больше не понадобится. Поэтому мы в основном удалили всю память в вашей системе, чтобы обработать огромный блок памяти, доступ к которому был получен только один раз.
Уловка, которую использовала Windows 95, состояла в том, чтобы наблюдать ваш шаблон ошибок страниц, и если она увидела, что вы выполняете последовательный доступ к памяти, она начала помечать память на 16 страниц за текущим доступом как доступ к которой не было недавно. . В случае прямого последовательного сканирования это означает, что весь буфер циклически перебирает окно памяти размером 64 КБ независимо от размера буфера. С этим приемом буфер 4 МБ в итоге потребляет только 64 КБ памяти, в отличие от использования всей памяти в вашей системе.
Эта Sys_PageIn
функция специально отключает детектор последовательного сканирования, преднамеренно возвращаясь назад на 16 страниц и снова получая доступ к странице. Это приводит к тому, что он помечается как недавно использованный , что противодействует неиспользованному недавно, что сделал детектор последовательного сканирования. Результат: все страницы памяти помечены как недавно использованные и больше не являются первыми кандидатами на удаление.