“В embedded устройствах не нужно разграничивать адресные пространства процессов и не нужно думать о виртуальной памяти – здесь просто ее так мало, что не разгуляешься, да и никакого юзерского кода нет в принципе. А если все делаешь сам и для себя – нет смысла париться про безопастность.
Таким образом в 32-битных системах на RISC-процессорах используется единое адрессное пространство размером 4Гб т.е. адреса 00000000 – FFFFFFFF. И все всё видят, почти как ring-0 в винде, где существует только Non-paged память. Или как это в x86 называется plane-адресация.”
То есть про реальный режим в x86 люди уже не знают. Для них существует только ring 0…
Оригинал этой записи. Комментировать можно тут или там.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме
Tags:
no subject
Селектор-то штука логическая, ему совершенно не обязательно численно совпадать с сегментом, который он адресует.
no subject
В NT используется "плоская" модель - сегменты имеют базу 0 и размер в 4 Гига. Их несколько - чтобы можно было разные права доступа установить и при переходе kernel mode -> user mode и обратно выбираются соответствующие селекторы, но все равно в режиме ядра сегмент описывает все адресное пространство.
В x64 по-другому и сделать нельзя, а в x86 мало кто использует сегменты так, как Intel предполагал когда 386 процессор создавался.
Виртуальная память в ядре используется для того, чтобы все что не нужно можно было вытеснять на диск, освобождая физические страницы для того, что нужнее.
От физической адресации, даже если адрес совпадает и если у кода есть права доступа к странице, это все равно отличается - например процессор установит dirty bit, access bit и т.п. Кроме того, трансляция адреса все равно производится (виртуального в физический) и никак нельзя от этого отказаться. Что в свою очередь означает что CR3, селекторные регистры, GDTR, LDTR, IDTR и GDT/LDT и таблицы и каталоги страниц все должны быть заполнены правильно.
В физической адресации ничего этого не используется (кроме, быть может, IDTR).
no subject
Если точно известно, что селектор 0 относится к физическому сегменту, начинающемуся с нулевого адреса, то получаем виртуальную адресацию, совпадающую с физической, но в общем случае этого никто не обещал. А в реальном режиме, как ты правильно описал, никаких дополнительных данных не нужно - берём адрес сегмента, сдвигаем на 4 бита, прибавляем смешение и получаем однозначный физический адрес.
no subject
Если точно известно, что селектор 0 относится к физическому сегменту, начинающемуся с нулевого адреса, то получаем виртуальную адресацию, совпадающую с физической,
>>>
Это упрощенние.
Чтобы получить физический арес из виртуального нужно:
(в классичесокй x86 модели)
взять селектор из сегментного регистра, используя селектор как индекс в GDT или LDT взять дескриптор сегмента.
К базе сегмента прибавить смещение - получится линейный адрес.
Линейный адрес состоит из индекса page table, индекса страницы и смещения внутри страницы.
Теперь из CR3 нужно достать физический адрес PDT, используя индекс page table нужно из pdt достать физический адррес page table и используя индекс страницы достать из page table фихический адрес страницы. К физическому адресу страницы нужно прибавить смещение и получить искомый физический адрес.
Вся эта процедура делается даже если PDT/PT отображает линейные адреса в физические 1:1. Для ускорения процесса используется TLB и кэш дескрипторов.