ARM Linux: PTE не доступен для записи, но грязный

Я знаю, что архитектура ARM эмулирует молодые и грязные флаги Linux, устанавливая их в обработчиках ошибок страниц, как обсуждалось здесь. Но недавно для небольшого бинарного файла я заметил, что PTE Linux в одном из анонимных сегментов был установлен как недоступный для записи и грязный. Наблюдалось следующее состояние Linux PTE:

- L_PTE_PRESENT : 1
- L_PTE_YOUNG   : 1 
- L_PTE_DIRTY   : 1
- L_PTE_RDONLY  : 1
- L_PTE_XN      : 0

Я не смог найти объяснение этой комбинации флагов PTE. Устанавливает ли ядро ​​эту комбинацию для специальных анонимных сегментов VMA? Что означает это сочетание? Любые указатели будут полезны. Заранее спасибо.


person jada12276    schedule 11.02.2016    source источник
comment
В вопросе я предполагаю, что страница была грязной и недоступной для записи. Я хотел спросить, как страница, которую нельзя писать, может быть помечена как грязная? что, вероятно, означает, что кто-то написал это? Бинарный файл просто разветвляет дочерний процесс и выделяет область кучи, прежде чем войти в вечный цикл.   -  person jada12276    schedule 13.02.2016
comment
хм... так что это ново для меня. Я думал, что бит dirty указывает на то, что содержимое страницы не соответствует вторичному хранилищу, и удаление этой страницы требует выполнения обратной записи. Напротив, я считаю, что бит young используется для принятия решения об удалении страницы (на основе алгоритма LRU). Я почерпнул эти идеи, прочитав главу Page Frame Reclaiming из этой книги.   -  person jada12276    schedule 15.02.2016
comment
Итак, я не могу понять это ваше утверждение: Грязный означает, что он не находится во вторичном хранилище и является кандидатом на удаление из основной памяти. Это не означает, что кто-то обязательно написал в него. Я новичок в ядре Linux, так что, пожалуйста, потерпите меня, если я спрошу что-нибудь глупое. Спасибо за это обсуждение.   -  person jada12276    schedule 15.02.2016
comment
Ахан... так что не имеет значения, доступна ли страница для записи или нет. Ядро помечает страницу как грязную, если знает, что не сможет восстановить ее позже из подкачки или инода. И что средство восстановления страниц перемещает их для обмена только тогда, когда не остается другого выхода. Большое спасибо за объяснение!!   -  person jada12276    schedule 16.02.2016


Ответы (1)


Я заметил, что Linux PTE в одном из анонимных сегментов был установлен как недоступный для записи и грязный... Что означает эта комбинация?

TL;DR — это просто означает, что страница не находится в резервном хранилище и доступна только для чтения.


Грязный просто означает, что не записано в резервное хранилище (файл подкачки, файл mmap или inode). Многие вещи, такие как код, всегда считываются из файла, поэтому они поддерживаются индексным узлом.

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

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

См.: биты ARM Linux PTE
ARM Linux эмулирует грязный/доступный

Кажется, мало документации о том, что означает молодой бит. young — это информация о том, что нужно поменять местами. Если что-то молодо и недоступно в течение длительного времени, это хороший кандидат на выселение. Напротив, dirty означает, что его нужно поменять местами. Если страница грязная, значит, она не была записана в резервное хранилище (файл подкачки или файл mmap и т. д.). Затем пейджер должен записать эту страницу. Если она не была грязной (или чистой), то пейджер может просто сбросить память и использовать заново.

Разница между молодым и грязным такая же, как следует и должен.

- L_PTE_PRESENT : 1   - it has physical RAM (not swapped)
- L_PTE_YOUNG   : 1   - is has not been used
- L_PTE_DIRTY   : 1   - it is different than backing store
- L_PTE_RDONLY  : 1   - user space can not write.
- L_PTE_XN      : 0   - code can execute.

Например, условие Not Present and dirty кажется невозможным, но условие dirty and read-only допустимо.

person artless noise    schedule 17.02.2016