Всем доброго времени суток, хочу вот уточнить правильно ли я понимаю как работают прототипные PTE. Т.е допустим у нас есть разделяемая секция, 2 процесса спроецировали её на своё адресное пространство, таким образом у первого процесса есть свои прототипные PTE и у второго свои и указывают они на реальные PTE этой для этой секции. Т.к прототипные PTE являются не валидными, то по обращению к ним происходит page fault и, вот тут я не совсем понимаю, винда подменяет прототипный PTE реальным PTE для того чтобы операция чтения/записи прошла по корректному адресу физической памяти ? Или как ? А как тогда потом прототипный PTE выставляется назад ?
Понял, что бред написал ) И заодно понял как всё работает, если не трудно попрошу модератора удалить эту тему
Хм, теперь снова непонятно ( Вобщем, насколько я понял (второй раз) работает это так: Есть два процесса: первый и второй ). У обоих есть реальные PTE на какую-то общую разделяемую страницу в физической памяти. Также есть прототипный PTE, который тоже описывает эту же страницу (те реальные PTE как раз и были заполнены с использованием этой прототипной PTE). Пока страница лежит хотя бы в чьём-нить рабочем наборе (т.е она активная) всё хорошо, но как только она к примеру выгружается в страничный файл, реальные PTE этих двух процессов становятся невалидными и указывают на прототипную PTE (опять-таки непонято как это они становятся невалидными ? А если у меня 100 процессов, каким образом их PTE станут невалидными ? В PFN'е прототипного PTE разве есть список процессов, используеющих его ?). Таким образом, когда какой-нить из этих процессов обращается к этой выгруженной странице генерится #PF и ось пытается загрузить эту страницу из страничного файла назад в физическую память, допустим у неё получилось, тогда PTE процесса, который вызвал #PF восстанавливается следующим образом: из его ещё невалидного PTE берётся смещение прототипного PTE, а там уже лежит новый PFN, ну и короче копируется в PTE того процесса и он снова валидный. А если другой процесс тоже сгенерит #PF, то его PTE ведь тоже на прототипный указывает, а там PFN лежит, его ты мы и берём и делаем наш PTE валидным. Вот так я понимаю, это верно ? P.S: Просьба сильно не бить, разбираться с низкоуровневым устройством памяти и кэша винды начал разбираться только сегодня, и хотя уже достаточно много ковыряю WRK, в голове ещё каша. 2 Great: Кстати, прочитал твою статью http://wasm.ru/article.php?article=mem_management, спасибо, помогло много с чем разобраться. 2 All: Кто-нибудь может посоветовать что-нибудь ещё почитать по данной теме: память, кэш, пэйджинг и т.д (кроме Руссиновича, уже прочитал, всё понятно, но честно говоря, как вилами по воде, ничего конкретного) ?
n0name, мне нужно про устройство всего этого в винде, т.е описание софтверной части, что-то типа этой статьи Great'а, такое вообще есть или единственный вариант - ковырять WRK самому + отладчик ? Это конечно тоже не проблема, просто хочется обойтись малой кровью
Неплохо было бы все-таки кому-то написать стотью на эту тему, ибо тема действительно интересная, но не раскрытая. n0name Кто то обещался способ разбора PDE/PTE со всякими извращениями
угу %) я его написал, сейчас тестирую некоторые моменты связанные с тем как процесс обрабатывает различные комбинации одинаковых полей в PDPTE/PDE/PTE. флаги present и кеширование например.
Исходники Win2000, WRK. Там все есть Честно говоря, я не особо разбирался с устройством прототипных PTE и разделяемой памяти.