Здравствуйте уважаемые специалисты! У меня возник вопрос по страничной организации памяти. Кто знает, подскажите! Вопрос не простой. Сама это адресация какая-то мутная. Не понятно следующее. Используем 32-bit paging, PAE=0; Процесс 1. Допустим в CR3, загрузили физический адрес каталога страниц - PHYSADDR1. Пусть для примера используется страницы размером в 4MB. В каталоге 1024 PDE, с помощью каждой PDE адресуется страница памяти в 4MB. Итого 1024 страницы *4MB каждая= 4GB физического пространства адресуется одним каталогом. Затем используя CR3,линейный адрес и PDE, которых в каталоге 1024 штуки по 4 байта каждая, проц может перегнать любой 32-битный линейный адрес 00000000h-FFFFFFFFh в физический. На всех картинках по защищённому режиму, в том числе в intel software developer's manual физический адрес изображён 32-битным - он адресует максимум 4 GB. Процесс 2. Затем например произошло переключение в адресное пространство другого процесса. Загрузилось новое значение в CR3 - PHYSADDR2 - каталог страниц другого процесса. У другого процесса должно быть другое адресное пространство в 4GB. Но когда проц перегоняет линейный адрес в физический, он получается так-же 32-битным. Просто для перегонки используется другой каталог страниц и всё. Адрес то физический у второго процесса после перегонки из линейного тоже 32-битный, и может адресовать 4-GB адресного пространства, 1024 страницы по 4MB каждая, как же проц узнаёт что это уже другие 4GB, другие 1024 страницы, которые не имеют отношение к первому процессу? Какой регистр отвечает за это? Проц же как-то должен отключить 1024 страницы соответствующие 1-му процессу, и затем подключить 1024 страницы соответствующие второму процессу,и не лезть в чужие страницы. Как это осуществляется?
за всё отвечает регистр CR3 мы загружаем в него адрес другого каталога вот и всё. Процессору не надо знать кому страницы принадлежат он просто транслирует адреса, распределение памяти между процессами это задача операционной системы.
Тогда же получается,что у первого процесса после трансляции адреса из линейного - физический адрес 32 битный, и у второго процесса физический адрес 32-х битный. Как же каждому процессу по 4GB памяти? Если у всех процессов физ. адрес 32-х битный после трансляции - то всего всем процессам 4GB памяти получается, а это неверно. В чём фишка?
Nafanya Если я все правильно понимаю в организации виртуальной памяти в защищенном режиме, в котором кстати работают все 32 битные приложения, то фишка втом, что windows это система, которая обеспечивает многозадачность путем разделения адресного пространства процессов через свой планировщик задач, кторый регулирует взаимотношения между процессами. Таким образом изза наличия защиты размер виртуальной памяти может достигать 64Гб если не ошибаюсь.(или несколько терабайт не помню).
у каждого процесса 4Gb линейных адресов, физических страниц намного меньше. в какой-нибудь таблице страниц 1-го процесса адрес указывает на физическую страницу номер 1, в таблице страниц 2-го процесса адрес указывает на страницу номер 2. итого у обоих процессов по 4Кб физической памяти.
INTEL пишет: A logical processor uses 32-bit paging if CR0.PG= 1 and CR4.PAE= 0. 32-bit paging translates 32-bit linear addresses to 40-bit physical addresses. 1 Although 40 bits corresponds to 1 TByte, linear addresses are limited to 32 bits; at most 4 GBytes of linear-address space may be accessed at any given time. Но в то же время нет никакой инфы как и откуда заполняются биты 39:32 физического адреса. intel пишет: Bits in the range 39:32 are 0 in any physical address used by 32-bit paging. То есть что есть они, что их нет никакой разницы. А всем известно что 32-х битный физ. адрес может адресовать только 4GB физ. памяти. Как адресуются 64Г, или Тбайт о котором упоминает INTEL не ясно.
Nafanya Прочтите Юрова "Assembler" - глава 2 "Архитектура персонального компьютера" >Но в то же время нет никакой инфы как и откуда заполняются биты 39:32 физического адреса. Во 2 главе раздел "Организация памяти"...
Это уже 64-битные процессоры. В них предел физически адресуемой памяти может варьироваться. Что касается PAE, то там все предельно просто: за счет увеличения разрядности табличных входов (элементов) до 64 бит в них можно хранить более длинные физические адреса, на основании чего 4-гигабайтное виртуальное адресное пространство можно составлять из страниц еще более крупного физического адресного пространства. В режиме PAE не используются страницы размером 4 мб. Только 4 кб (адрес состоит из битовых групп 2-9-9-12) или 2 мб (2-9-21), как в длинном режиме. Страницы размером 4 мб могут использоваться с 36-битной физической адресацией только в режиме PSE-36, который не слишком популярен. Что касается основного вопроса топика, то здесь также все элементарно. Тебе уже сказали, что в каждое вирт. пространство может отображаться лишь небольшое количество физических страниц памяти. К этому следует добавить, что большинство страниц каждого вирт. адр. пространства могут храниться не в оперативной памяти, а на диске. ОС может перераспределять одни и те же страницы оперативной памяти между несколькими вирт. адр. пространствами, поочередно загружая в них данные то одного, то другого пространства и отображая их то в одно, то в другое пространство. Кроме того, часть страниц может быть отображена сразу (одновременно) в несколько пространств или не отображена вообще ни в одно вирт. адр. пространство.
Пардон, все ответы не читал, но по сути: У автора непонимае того, что физическая память - она одна, а линейных пространств при наличии пейджинга (страничной адресации) - множество. Сколько их - зависит от ОС и процессов, под этой ОС работающих. Есть таблицы страниц с базой в CR3. Как они организованы (4М/2М/4к) - неважно. Важно другое - _любой_ линейный адрес транслируется согласно этим таблицам, т.е. линейный адрес _может_ (не должен, а именно может) соответствовать какому-то физическому адресу. Причем, поскольку для разных процессов таблицы эти разные, то и один и тот же ЛА _может_ соотв. _разным_ физическим адресам. А может и нет, например, для модулей ОС, которые общие для всех процессов в системе. Страшно, что процесс 2 попадет в те же адреса, что и процесс 1? А это уже ОС должна разруливать, чтобы они не столкнулись. Бывает, что данный ЛА не связан ни с каким ФА в данной системе таблиц. Тогда вылазит #PG. Это может возникнуть по разным причинам, например, при нехватке физической памяти ОС выкидывает страницы самых неактивных процессов на диск (в его таблицах делаются соотв. пометки, что страниц нет). Тут вдруг процесс просыпается (CR3 переключается на его таблицы), лезет за своими законными данными - а страницы-то ОСь сдала в макулатуру. Приходится ОСи по #PG в срочном порядке подгружать страницы с диска, выпихивая при этом кого-то еще. Что можно наблюдать воочию, запустив ХР на тачке с 256 метров мозгов. Старт калькулятора вгоняет всю систему в своп. Но это уже лирика... зы Простите за многабукв, не вполне трезв.
элементарно! адресуются как обычно. В режиме PAE надо просто указать 36 битный адрес в каталоге или таблице страниц вот и всё. в случае когда на машине строят все 64 гига памяти, обеспечить непересекаемость адресных пространств процессов намного проще. 0-4 ГБ первому процессу, 4-8 второму процессу, 8-12 третьему, вот и всё. Нельзя забывать что потребление процессом всех 4 гигов памяти очень редкий случай. если в физическом адресе больше 36 бит, это уже long mode! и не надо вводить людей в заблуждение. 39:32 биты заполняются также как и другие. Специально для этого элементы PLM4, PDPT, PD и PT расширены до 64 бит (в long mode PAE всегда должен быть включён)
Nafanya Ты путаешь возможности процессора с возможностями и реалиями управления физической и виртуальной памятью операционной системы. Как уже сказали, процессор лишь предоставляет возможность и правила трансляции 4Гб линейных адресов в 4Гб (без PAE) или 64Гб (с PAE) физических адресов. Причем эти физ.адреса используются процессором только для доступа к ОЗУ, и соотв-но реально адресуемый размер физ.памяти не может превышать размера установленого ОЗУ, и если он равен, скажем 2Гб, то соотв-но все PDE\PTE могут указывать только на эти 2Гб, а никак не на 4Гб и тем более "каждому процессу по 4GB памяти". А "интеллектуальными" задачами распределения физ.памяти ОЗУ между процессами, создания\изменения\переключения PDE\PTE и обеспечения виртуальной адресации физ.памяти свыше размера ОЗУ за счет использования подкачки страниц с диска - занимается операционная система, а не "тупая железяка" под названием процессор Соотв-но, чтобы понять как вся эта кухня работает, нужно курить не интеловские мануалы, а книжки\статейки по управлению памятью в WinNT - например, Руссиновича, и\или статью Great'а Управление памятью в ядре Windows XP
Спасибо большое за ответы! Теперь разобрался. Нужно копать в сторону исследования кода VMM(менеджер памяти) WINNT , на нём всё завязано. Он как раз и занимается "интеллектуальными" задачами распределения физ.памяти ОЗУ между процессами, создания\изменения\переключения PDE\PTE и обеспечения виртуальной адресации физ.памяти. Такие уже исследования сделаны, надо просто почитать и проанализировать, понять. Вот например http://gl00my.chat.ru/ программер софтайсом код VMM ревёрсил , и результаты исследований опубликовал на своём сайте. Да всё ж чётко в WINNT адресное пространство одного процесса, защищено от вмешательства другого. Сразу то даже и не поймёшь даже с какой стороны подбираться.
64 гига адресуются переключеним не помню какого регистра:бита, страницы становятся 4метра, а адресация 40битной