Почему Windows откладывает создание PPTE для файлов данных?

FSD вызывает CcInitializeCacheMap при чтении/записи файла в первый раз, что приведет к созданию карты приватного кеша, объекта раздела, области управления, сегмента, подразделов, если они еще не существуют. Поскольку диспетчер кеша создает объект раздела, он указывает, что это раздел данных SEC_DATA в параметре атрибутов раздела NtCreateSection, что означает, что PPTE изначально не настроены, а база в сегменте остается пустой. Фактическое чтение выполняется с помощью CcCopyRead, который сначала выделяет VACB и отображает представление файла, а затем копирует из VACB в буфер. Каждый раз, когда он выделяет VACB, он отображает представление размером 265 КБ в виртуальное пространство диспетчера кеша. Когда он делает это сопоставление, ему нужно инициализировать PPTE, но когда он инициализирует один PPTE, он может также инициализировать их все для всего файла, потому что они должны быть непрерывными по дизайну; эта память будет зарезервирована независимо от того, выделены они или нет.

Внутренние компоненты Windows утверждают, что откладывают создание PPTE для файлов данных до тех пор, пока не будет сопоставлено первое представление, но с файлами изображений они создаются при создании объекта раздела.

For page-file-backed sections, an array of prototype PTEs is created when a section object is first created. For mapped files, portions of the array are created on demand as each view is mapped.

А другой источник сообщает:

While mapping a data file, the main purpose of MiCreateDataFileMap is to setup the subsection object. In the normal case only one subsection is created, but under some special conditions multiple subsections are used, e.g. if the file is very large. For data files, the subsection field SubsectionBase is left blank. This defers the creation of PPTE until the the section is mapped into the memory and finally accessed for the first time. The reasoning behind this is to avoid wasting memory when very large data files are mapped. Instead the SegmentPteTemplate field of the segment object is setup properly which can be used to create the PPTEs subsequently if necessary.

Я просто не согласен с этим, потому что, если бы файл данных размером 4 ГБ был сопоставлен, ему потребовалось бы только 2 МБ страниц PPTE, а это не так много места, поэтому я не вижу в этом преимущества. Реальная экономия места достигается за счет VACB и того факта, что весь файл не обязательно должен находиться в физической памяти.

Все еще не имеет смысла, почему они утверждают, что «части» PPTE инициализируются по запросу, как будто это подразумевает экономию места, потому что это просто не так, потому что, как только один PPTE отображается, вся область резервируется и SubsectionBase устанавливается в сегмент, поскольку PPTE для всего файла должны быть непрерывными.

«части» могут быть инициализированы по запросу, но это не меняет того факта, что пространство зарезервировано независимо от того, есть ли там PPTE или нет. Например, когда выделяется VACB, он может инициализировать все PPTE, охватывающие 256 КБ. Когда происходит ошибка страницы, PTE указывают на PPTE, и PPTE будут недействительными, поэтому он может выполнять кластерный ввод-вывод 256 КБ с гранулярностью 256 КБ, что означает, что любые другие ошибки страницы будут программными ошибками страницы. (Я полагаю, что когда PPTE выделяются впервые, в то время, когда PTE выделяются для представления VACB, PTE заставляют указывать на PPTE. процесс для запуска и завершения PPTE на странице 411, но системный кеш является частью памяти ядра, которая не отслеживается VAD, поэтому это неправильно. Этот метод используется только для сопоставления пользовательского пространства). Проблема с этим заключается в том, что страница может быть изменена, поэтому она не обязательно может выполнять оптимизацию кластера 256 КБ (1 жесткая ошибка страницы, 63 программных) и блокировать страницы в памяти для выполнения ввода-вывода. Он должен был бы знать, что все PPTE выделены заново, и ошибка не только в том, что не было ни одного кадра. Лучше всего было бы выполнить ввод-вывод, когда представления в диапазоне сопоставлены и выделено PPTE, чтобы при чтении не возникало ошибки страницы. В противном случае ему пришлось бы обслуживать 64 ошибки жестких страниц.

Так в чем смысл? Он также может инициализировать массив PPTE, как только будет создан раздел файла данных, потому что он будет немедленно прочитан только в приведенном выше сценарии. Я не могу придумать сценарий, в котором процесс сопоставляет множество файлов со своим адресным пространством, а затем не трогает их. Даже если бы он отображал 40 ГБ, он все равно занимал бы только 20 МБ в PPTE, поскольку они были инициализированы при создании раздела данных.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что преимущество заключается в том, что зарезервированный виртуальный диапазон, который будет содержать PPTE, на самом деле не отображается в физической памяти, несмотря на то, что весь диапазон PPTE в виртуальном пространстве будет использоваться для каждого процесса. При отображении VACB будет заполнена часть PPTE для диапазона, который теперь имеет стоимость в физической памяти. Однако для файла размером 40 ГБ это все еще всего 20 МБ. В виртуальной памяти будет зарезервировано 20 МБ, а в физической — 0. Объем занимаемого физического пространства увеличился бы на 64 * 8 байт на просмотр 256 КБ.

Другие вопросы по теме