Подтвердить что ты не робот

Что вызывает ошибки страницы?

Согласно Википедии:

Ошибка страницы - это ловушка для программного обеспечения, созданного аппаратным обеспечением, когда программа обращается к странице, которая отображается в виртуальном адресном пространстве, но не загружается в физическую память. (акцент мой)

Хорошо, это имеет смысл.

Но если это так, то почему, когда информация о процессе в Process Hacker обновляется, я вижу около 15 ошибок страницы?

Screenshot

Или, другими словами, почему любая память выгружается? (Я не знаю, является ли это память пользователя или ядра.) У меня есть файл нет, а использование ОЗУ составляет 1,2 ГБ из 4 ГБ, что после чистой перезагрузки. Нет недостатка в каком-либо ресурсе; зачем что-нибудь выгружается?

4b9b3361

Ответ 1

(Я являюсь автором Process Hacker.)

Во-первых:

Ошибка страницы - это ловушка для программного обеспечения поднятый аппаратным обеспечением, когда программа доступ к странице, отображаемой в виртуальное адресное пространство, но не загружено в физической памяти.

Это не совсем правильно, как объясняется далее в той же статье (Недостаток страницы). Существуют ошибки софт-страницы, где все ядро ​​необходимо сделать, это добавить страницу в рабочий набор процесса. Вот таблица из книги Windows Internals (я исключил те, которые приводят к нарушению доступа):

  • Причина сбоя - Результат
  • Доступ к странице, которая не находится в памяти, но находится на диске в файле страницы или сопоставленном файле. Выделите физическую страницу и прочитайте нужную страницу с диска и в соответствующий рабочий набор.
  • Доступ к странице, находящейся в резервном или измененном списке. - Переход страницы к соответствующему процессу, сеансу или работающему набору системы.
  • Доступ к странице с нулевым значением - добавление нулевой страницы в соответствующий рабочий набор
  • Запись на страницу с копией на запись - Сделайте частную (или сессию-приватную) копию процесса и замените исходный файл в процессе работы или системе.

Ошибки страниц могут возникать по разным причинам, как вы можете видеть выше. Только один из них связан с чтением с диска. Если вы попытаетесь выделить блок из кучи, а диспетчер кучи выделяет новые страницы, затем обращается к этим страницам, вы получите ошибку страницы с нулевой ошибкой. Если вы попытаетесь подключить функцию в ядре32, записав на страницы kernel32, вы получите ошибку копирования на запись, потому что эти страницы молча копируются, поэтому ваши изменения не влияют на другие процессы.

Теперь, чтобы ответить на ваш вопрос более конкретно: Process Hacker, похоже, имеет ошибки страницы при обновлении служебной информации - то есть, когда он вызывает EnumServicesStatusEx, которые RPC для SCM (services.exe). Я предполагаю, что при этом выделяется много памяти, что приводит к ошибкам страницы с нулевой ошибкой (для служебной информации требуется несколько страниц для хранения, IIRC).

Ответ 2

Медленным, но постоянным источником ошибок страниц является проверка ОС для редко просматриваемых страниц. В этом случае операционная система отмечает некоторые страницы, которые не присутствуют, но оставляет их в памяти как есть. Если приложение обращается к странице, то появляется ловушка #PF, и ОС просто снова помещает отображаемую страницу без лишнего шума. Если "длительное время" проходит, и страница никогда не отключает ошибку, тогда ОС знает, что страница является хорошим кандидатом для обмена, если возникнет такая необходимость. Этот механизм может работать проактивно даже в периоды отсутствия ресурсного давления.

Ответ 3

", которая отображается в виртуальном адресном пространстве, но не загружена в физическую память", не означает, что она ранее была в физической памяти. Предположим, вы скопировали файл? Он все еще находится на диске, а не в памяти.

Предположим, что вы сопоставляете файл журнала и продолжаете добавлять к нему. Каждый раз, когда вы превысите окончание зафиксированной памяти, возникает ошибка страницы, ОС предоставит вам новую пустую страницу и отрегулирует длину файла.


Это могут быть также нарушения доступа, которые пойманы и обрабатываются программой.


Также может случиться так, что в программе больше сегментов памяти, чем в TLB (это кеш для таблиц страниц). Когда страницы смежны, все они могут обрабатываться одной табличной таблицей. Но если память фрагментирована в физическом адресном пространстве, требуется много записей в таблице страниц, и они могут не соответствовать TLB. Когда происходит пропуски TLB, вызывается обработчик ошибок на странице ОС и просматривает отображение в таблице страниц процесса.

В некотором роде это вариация на Дин ответ: страницы уже находятся в физической памяти, и ОС необходимо загрузить эти сопоставления в TLB, но не из-за IPC.

Брайан отметил, что x86 (и, следовательно, все системы Win32) обрабатывает это без ошибки страницы.

Еще одна причина сбоев страниц - это запуск защитных страниц, используемых для роста стека и копирования на запись, но обычно это не происходит без ограничений. Я не уверен на 100%, если они появятся как нарушения доступа или нет, потому что они будут отмечены как нарушение доступа при входе в ловушку MMU, но, вероятно, обработаны обработчиком ошибок на странице ОС и не преобразованы в пользователя (SEH).

Ответ 4

Всякий раз, когда читается раздел mmap'd, генерируется ошибка страницы, которая включает в себя всякий раз, когда вы загружаете DLL. Таким образом, загрузка DLL на самом деле не считывает всю DLL в память, это только приводит к ее ошибке при выполнении кода.

Ответ 5

При обнаружении обмена данными между процессами вы увидите ошибки в работе. В принципе, если у вас есть файл с отображением памяти, разделяемый между двумя процессами, когда второй процесс загружает файл с отображением памяти, возникают сбои программной страницы - память уже находится в физической памяти, но операционной системе необходимо исправить память менеджеров, чтобы адрес виртуальной памяти в вашем процессе указывал на правильную физическую страницу.

В частности, для чего-то вроде Process Hacker, который, вероятно, вводит код в каждый запущенный процесс (для сбора информации), он, вероятно, довольно сильно использует общую память для IPC.

Ответ 6

Операционные системы используют пейджинг для группировки элементов, которые должны быть помещены в физическую память и перемещать их между физической памятью и общей памятью. в большинстве случаев элементы данных, размещенные на одной странице, связаны друг с другом. когда элементы данных на странице не используются в течение длительного времени, операционная система перемещает ее в виртуальную память, чтобы освободить некоторое пространство в физической памяти. а затем, когда требуется страница, которая находится в виртуальной памяти, операционная система перемещает ее из виртуальной памяти (жесткий диск) в физическую память. это ошибка страницы!

и помните, что разные операционные системы отличаются по алгоритмам поискового вызова.

Основы ошибок страницы

Ответ 7

Распределение ресурсов - это деликатный баланс между хранением первичного хранилища, доступным для использования, и предотвращением необходимости как можно большего перехода на вторичное. Если процесс пытается выделить память и не может это обычно исключение, а иногда и фатальное исключение.

По существу, вы не можете хранить все в ОЗУ без каких-либо свободных ресурсов, потому что, когда запускается программа или запрашивается больше, она будет сбой.