November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Monday, November 22nd, 2010 12:38 am

“В embedded устройствах не нужно разграничивать адресные пространства процессов и не нужно думать о виртуальной памяти – здесь просто ее так мало, что не разгуляешься, да и никакого юзерского кода нет в принципе. А если все делаешь сам и для себя – нет смысла париться про безопастность.
Таким образом в 32-битных системах на RISC-процессорах используется единое адрессное пространство размером 4Гб т.е. адреса 00000000 – FFFFFFFF. И все всё видят, почти как ring-0 в винде, где существует только Non-paged память. Или как это в x86 называется plane-адресация.”

То есть про реальный режим в x86 люди уже не знают. Для них существует только ring 0…

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

Monday, November 22nd, 2010 09:46 am (UTC)
Вот у меня тоже было ощущение, что даже в режиме ядра виртуальная память может местами отображаться на физическую 1:1, но далеко не всегда.
Селектор-то штука логическая, ему совершенно не обязательно численно совпадать с сегментом, который он адресует.
Monday, November 22nd, 2010 07:36 pm (UTC)
Я не вполне понимаю причем тут селектор, я, видимо, не понял твою мысль.

В NT используется "плоская" модель - сегменты имеют базу 0 и размер в 4 Гига. Их несколько - чтобы можно было разные права доступа установить и при переходе kernel mode -> user mode и обратно выбираются соответствующие селекторы, но все равно в режиме ядра сегмент описывает все адресное пространство.
В x64 по-другому и сделать нельзя, а в x86 мало кто использует сегменты так, как Intel предполагал когда 386 процессор создавался.

Виртуальная память в ядре используется для того, чтобы все что не нужно можно было вытеснять на диск, освобождая физические страницы для того, что нужнее.

От физической адресации, даже если адрес совпадает и если у кода есть права доступа к странице, это все равно отличается - например процессор установит dirty bit, access bit и т.п. Кроме того, трансляция адреса все равно производится (виртуального в физический) и никак нельзя от этого отказаться. Что в свою очередь означает что CR3, селекторные регистры, GDTR, LDTR, IDTR и GDT/LDT и таблицы и каталоги страниц все должны быть заполнены правильно.
В физической адресации ничего этого не используется (кроме, быть может, IDTR).
Monday, November 22nd, 2010 09:23 pm (UTC)
Мысль моя была в том, что в защищенном режиме виртуального адреса сегмента (то бишь селектора) и смещения недостаточно для определения физического адреса, который ими адресуется. Надо ещё знать содержимое descriptor table для этого селектора.

Если точно известно, что селектор 0 относится к физическому сегменту, начинающемуся с нулевого адреса, то получаем виртуальную адресацию, совпадающую с физической, но в общем случае этого никто не обещал. А в реальном режиме, как ты правильно описал, никаких дополнительных данных не нужно - берём адрес сегмента, сдвигаем на 4 бита, прибавляем смешение и получаем однозначный физический адрес.
Tuesday, November 23rd, 2010 03:22 am (UTC)
>>>

Если точно известно, что селектор 0 относится к физическому сегменту, начинающемуся с нулевого адреса, то получаем виртуальную адресацию, совпадающую с физической,

>>>

Это упрощенние.
Чтобы получить физический арес из виртуального нужно:
(в классичесокй x86 модели)
взять селектор из сегментного регистра, используя селектор как индекс в GDT или LDT взять дескриптор сегмента.
К базе сегмента прибавить смещение - получится линейный адрес.
Линейный адрес состоит из индекса page table, индекса страницы и смещения внутри страницы.
Теперь из CR3 нужно достать физический адрес PDT, используя индекс page table нужно из pdt достать физический адррес page table и используя индекс страницы достать из page table фихический адрес страницы. К физическому адресу страницы нужно прибавить смещение и получить искомый физический адрес.

Вся эта процедура делается даже если PDT/PT отображает линейные адреса в физические 1:1. Для ускорения процесса используется TLB и кэш дескрипторов.