Почему в областях, отображаемых только для чтения, есть грязные страницы?


8

Выполнение (например) следующей команды для получения списка отображенных страниц памяти:

pmap -x `pidof bash`

Я получил такой вывод: введите описание изображения здесь почему некоторые страницы только для чтения помечены как «грязные», то есть написанные, которые требуют обратной записи? Если они доступны только для чтения, процесс не сможет писать в них ... (В приведенном примере грязные страницы всегда имеют размер 4 КБ, но я обнаружил другие случаи с другими значениями)

Я также проверил / proc / pid / smaps и эти страницы описаны как «Private Dirty».

Ответы:


7

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

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

Страницы, которые доступны только для чтения, являются частными и грязными, но находятся в пределах диапазона отображаемого в памяти файла, как правило, страницы данных, которые содержат константы, которые должны быть инициализированы во время выполнения, но не изменяются после их инициализации. Например, они могут содержать статические данные, которые встраивают указатели; Значения указателя зависят от адреса, по которому отображается программа или библиотека, поэтому его необходимо вычислять после запуска программы, а страница читается и записывается на этом этапе. После того, как указатели были вычислены, содержимое страницы никогда не изменится в этом экземпляре программы, поэтому страница может быть изменена только для чтения. См. «Поиск по грязным страницам памяти» от stosb для примера с фрагментами кода.

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


Я не проверял это, но я подозреваю, что вы также можете получить исполняемые частные грязные страницы только для чтения с общими объектами без PIC. Кажется, я помню, что именно поэтому общие объекты PIC стали фактически необходимыми.
Эндрю Хенле

2

В дополнение к спискам дел Жиля :

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.