Y_Mur В общем-то да. Единственное "но": эта память всё равно остаётся памятью пользовательской программы, просто выделение-освобождение её для этой самой пользовательской программы происходит неявно. Те же ДЛЛки типа user32.dll находятся в виртуальной памяти программы пользователя, хотя память для них была выделена не по запросу программы, а самой системой, и не для своих нужд, а для нужд пользовательской программы (которая без этих ДЛЛ не будет работать). Для "фантазирования" -- нет. Просто это может сбить с толку человека, который плохо представляет, как всё это хозяйство работает. Ну а вводить в заблуждение, даже неумышленно, не есть хорошо defaultplayer Скорей, не диапазон адресов принадлежит (сам по себе диапазон -- чисто техническая вещь, определяемая разрядностью и архитектурными особенностями процессора), а именно виртуальная память. Программа может обратиться к своей памяти, но не может к виртуальной памяти ядра -- защита срабатывает, хотя сами адреса действительно отображены.
Y_Mur Не совсем так. Есть и другие состояния страниц, в частности "обнуляемая по требованию" - именно в таком состоянии создаются PTE страниц, выделенных MEM_COMMIT. При первом обращении к такой странице возникает page_fault и винда выделяет для нее обнуленную страницу физ.памяти из списка обнуленных страниц. Т.е. на момент обращения к странице никакой "реальной" памяти под нее м.б. не выделено, но в рез-те обработки исключения винда обязана предоставить эту память PS: Подробности см. у Руссиновича и\или в статье Great'а
хорошо, раз стоит разделять понятие виртуальное адресное пространство и виртуальная память, то нужно дать хотя бы приблизительное определение. Будет ли так верно? Виртуальное адресное пространство - представляет собой диапазон адресов, которые может формировать программа и размер которого зависит от архитектуры проца. Виртуальная память - диапазон адресов виртуального адресного пространства, по которым программа может обращаться, тоесть pte для данных адресов не содержит valid=0 prototype=0 (пользователь\супервизор пока опускаем, непонятно как его притулить к данному определению) add: наверно понятие "физическая память" нужно рассматривать в зависимости от контекста, тоесть говорить о ней и подразумевать озу или же память на которую проецируются виртуальные адреса, а это уже может быть либо озу либо какой-нить внешний носитель что и делает рихтер
defaultplayer диапазон адресов == адресное пространство память != диапазон адресов Виртуальную память тогда уж скорее стоит определить как совокупность ОЗУ + файл подкачки + те страницы о которых написал leo которые уже выделены, но их на самом деле ещё нигде нет ни в ОЗУ ни в файле подкачки
defaultplayer Т.е. диапазон адресов (он же адресное пространство) это пустая коробка, а память это то что в эту коробку кладётся А кладутся собственно туда всегда страницы ОЗУ т.е физическая память, но иногда это делается "виртуально" т.е. программа уверена, что у неё в указанном месте кробки память есть, а на самом деле её там нет, а информация из этой памяти лежит не в ОЗУ, а на диске, или вообще нигде как в случае со свежевыделенными нулями
гг, про пустую коробку понятно, смотрите есть диапазон адресов именуемый виртуальным адресным пространством, так вот в нем к определенным диапазонам можно обращаться а к другим нельзя. Вопрос: как будут называться адреса к которым обращаться можно, а далее нас уже не интересует что на них проецируется, озу, винт либо вообще ничего??
Дык в том то и дело, что можно обращаться ко всем за исключением тех что заняты осью, только нужно своевременно предупредить об этом ось и она подставит туда реальную физическую память , а если она "схалтурит" и выполнит эту заявку только виртуально то возьмёт на себя обязательство исправить недоработки по первому требованию Так что имхо определение из #24 хоть и несколько сумбурно, но вполне годится для понятия виртуальная память
defaultplayer Я б назвал допустимыми виртуальными адресами. А недопустимые -- это те, обращение по которым вызовет ошибку (не исключение по отсутствию страницы, обрабатывая которое, ось просто "подсунет" нужную страницу, загрузив её с диска, так что программа ничего и не заметит, а именно ошибку, по которой задача в общем случае должна быть снята). Есно, для задачи весь диапазон виртуальных адресов, зарезервированный для оси, является недопустимым, хотя сформировать соответствующие адреса она может (ведь в простейшем случае для Вин32 виртуальный адрес -- это просто смещение, указываемое в команде, ну а селекторы сегментов всегда одни и те же, поскольку сегментация не используется).
Память - сущность которая запоминает. Физическая память - сущность материальная, присутствует в физическом мире. Сюда можно было бы включить своп, но он стоит отдельно. Физическая память состоит из Системной памяти и памяти различных устройств и их портов в/в. Виртуальная память - сущность не материальная, но частична, имеет отображение в физическую память. Что касается свопинга, то это попытка предоставить больше памяти, чем есть на самом деле, больше чем физической. Диапазон это подмножество из адресатного пространства. А адресатное пространство это совокупность все возможных адресов для данной сущности. Термин “адресатного пространства” применяется для широких диапазонов. К примеру, адресатное пространство 4ГБ это диапазон от 0 до 0FFFFFFFFh, в этом адресатном диапазоне существуют большое число диапазонов от, к примеру, 0A000h-0AFFh. Адресное пространство в виртуальной памяти. В виртуальной памяти доступен селектор: смещение, в самой ОС вириальная память может быть и расширенна : др. :задача :селектор :смещение . Организация intel такова что виртуальное адресатное пространство преобразуется в линейное 4ГБ. Хотя перехвати мы переключение селектора мы сможем подсунуть что захотим, что позволяет линейной памяти адресовать гораздо больше. Виртуальная память может физически отсутствовать и даже быть не отображена, на то она и виртуальная. Но в конкретный момент времени будет доступна только часть данных. Только часть будут в физической памяти. Может быть так что нет ничего в физической памяти, но как только это потребуется система отреагирует и загрузит нужные данные или выдаст сообщение об ошибке.
мне кажеться так, виртуальная память может быть выделена(та, к которой можно обращаться) а может быть невыделена(к которой нельзя обращаться), та которая выделена может быть спроецирована на физ.память(озу, винт, етк) а может быть нет, поэтому виртуальную память нужно рассматривать как кучу адресов, которыми собственно и оперируют программы, в совокупности со структурами описывающими их (это может быть pte с valid=0 prototype=0, описывающих невыделенную вирт.память либо с prototype=1, когда осью используются еще доп. структуры для описанию состояния физических данных для данного виртуального адреса). Мне кажется это Рихтер и хотел сказать в своем повествовании. Вопрос: например две виртуальных страницы спроецированы на одну страницу физ.памяти(озу), сколько у процесса будет виртуальной памяти а сколько физической? Не ругайтесь если намолол чепухи
кстати этот вот EXEшник и есть физической памятью(не в понимании озу) для зарезервированного региона виртуальных адресов, который будет спроецирован на нее
в англоязычной литературе, по крайней мере майкрософт и рихтером, используется термин physical storage, так вот переводят его на русский как физическая память, что на мой взгляд неверно, и в конечном итоге искажает истинный смысл повествования в данном контексте. Переводить его следует как "физическое хранилище", тоесть правильно будет сказать: передача региону физического хранилища (ram, page, mmf). Цитата из его книги только с заменой "память" на "хранилище": "Образ исполняемого файла (т.е. EXE- или DLL-файл), размещенный на жестком диске и применяемый как физическое хранилище для того или иного региона адресного пространства, называется проецируемым в память файлом (memory-mapped file)." И еще, сама майкрософт использует выражения как проецирование виртуальных страниц на физические, так и физические на виртуальные.