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 04:43 am (UTC)
Какой реальный режим на рисках?
Monday, November 22nd, 2010 04:49 am (UTC)
Такой-же, какой и ring-0 в винде на рисках :)
Monday, November 22nd, 2010 05:00 am (UTC)
Ну я к тому, что вполне готов представить себе человека, которому просто нафиг не нужна x86 архитектура, но он о ней что-то краем уха слышал и объясняет, как получается. Что совершенно не говорит нам об этом человеке ничего более того, что он не в курсе архитектуры x86.

P.S. ring 0 то вполне существует, ядро с драйверами в нем сидят и стараются друг-друга не ушибить.
Monday, November 22nd, 2010 07:46 am (UTC)
Ring 0, конечно, существует, но у меня есть смутное подозрение, что несмотря на слабую защиту программ друг от друга и там используется виртуальная память, в отличие от физической адресации в реальном режиме.
Monday, November 22nd, 2010 07:51 am (UTC)
Твое подозрение правильное. Впрочем, если меня склероз не подводит, именно для ядра оно ничем не будет отличаться от физической в этом смысле. Для остальных будет.
Monday, November 22nd, 2010 08:38 am (UTC)
Будет естественно - адресное пространство ядра в классической x86 NT - это адреса от 0x80000000 до 0xFFFFFFFF, 2 ГБайт.
А физической памяти может быть гораздо больше или гораздо меньше и т.п. В ядре есть некоторые вещи, виртуальный адрес которых умышленно совпадат с физическим, но их мало и они очень специальные.
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 и кэш дескрипторов.
Monday, November 22nd, 2010 07:41 am (UTC)
"реальный режим в x86"
Monday, November 22nd, 2010 07:42 am (UTC)
http://dil.livejournal.com/976042.html?thread=7374762#t7374762
Monday, November 22nd, 2010 08:39 am (UTC)
там тоже бывает его аналог - physical mode.
Monday, November 22nd, 2010 09:49 am (UTC)
Это от конкретной архитектуры зависит, у ST20 я пока не обнаружил никакой вирутализации и защиты памяти. Хотя может быть это только пока..