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 12:12 am (UTC)
Я не верю в безопасность систем, написанных людьми, пишущими про безопасТность.

Кстати, я не помню точно пределы адресации в реальном режиме. Не один ли мегабайт? Вроде как там про FFFFFFFF даже речи не было.
Monday, November 22nd, 2010 04:32 am (UTC)
Практически адресуется один мегабайт. Но там шестнадцатибитные сегмент и смещение.
Monday, November 22nd, 2010 08:01 am (UTC)
Да, тоже верно - оно не совсем plain
Monday, November 22nd, 2010 04:48 am (UTC)
существовали всякие трюки типа unreal mode (http://en.wikipedia.org/wiki/Unreal_mode).
Monday, November 22nd, 2010 08:01 am (UTC)
Ого
Monday, November 22nd, 2010 07:35 am (UTC)
В данном случае безопасность ни при чём.

На x86 (начиная с 286, кажется) в реальном режиме адресовался мегабайт плюс ещё немножко: если в сегментный регистр положить 0xFFFF, то можно было дойти до 0xFFFF0+0xFFFF=0x10FFEF. Старший бит по идее должен был отбрасываться из-за переполнения, но он не отбрасывался.
Monday, November 22nd, 2010 07:53 am (UTC)
Кажется это началось со 186, но он в массы не пошел.
Monday, November 22nd, 2010 08:00 am (UTC)
Ну все равно это не FFFFFFFF, все ж таки...
Monday, November 22nd, 2010 09:44 am (UTC)
Так вопрос не в объёме памяти, а в прямой адресации
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 я пока не обнаружил никакой вирутализации и защиты памяти. Хотя может быть это только пока..
Monday, November 22nd, 2010 06:09 am (UTC)
как то писал из ностальгии тут для Z80, с трудом вспомнилось что моя прога одна выполняется в памяти и все ей подвластно и никого больше там нет
Monday, November 22nd, 2010 07:47 am (UTC)
Как же одна, а ОС? :)
Или это что-то совсем embedded было?
Monday, November 22nd, 2010 08:14 am (UTC)
ты чо! там было две версии прошивки и разработчики очень любили звать куски кода оттуда напрямую :)
это если про Sinclair и его клоны говорить, но у нас про Amstrad и не слышали почти.
Monday, November 22nd, 2010 09:50 am (UTC)
может это вообще про АОНы, они тоже часто на Z80 делались :)
Monday, November 22nd, 2010 08:31 am (UTC)
Мужик вообще не понимает, о чем пишет. И прикладная память, и память 0-кольца организованы абсолютно одинаково, и они виртуальные. Более того, они нормально друг на друга маппятся. Можно любой сегмент залочить в физической памяти, но адресация физической от этого не становится.

Короче, DDK ему в зубы, а про безопасность - вообще бред.
Monday, November 22nd, 2010 09:52 am (UTC)
Ты, между прочим, сам мне подсунул почитать этого непонимающего мужика :)
Monday, November 22nd, 2010 09:54 am (UTC)
Ой, когда это?
Monday, November 22nd, 2010 09:57 am (UTC)
Хорошая болезнь склероз :)
http://dil.livejournal.com/975809.html?thread=7370689#t7370689
Monday, November 22nd, 2010 10:10 am (UTC)
А, так это я просто нагуглил. Да и тема другая была... ;)

Про эмбеды Артемка Кокорев в теме, он на них собаку слопал, но где его сейчас искать - не в курсе.
Monday, November 22nd, 2010 08:59 am (UTC)
Слушай, если это ембедщики, то среди них всегда попадалось дофига странных — и C для них сложный язык, и что такое указатель не понимают (при том, что пишут на ассемблере всю жизнь!), и вот такое сплошь и рядом.
Я уже не говорю о системах контроля версий, грамотной организации проекта в смысле фалов-имён-статик-не-статик, etc. — там для огромного их числа Откровение и Прорыв то, что CVS Существует.
Monday, November 22nd, 2010 09:54 am (UTC)
Это, типа, краткое введение в расколупывание бинарных прошивок для хацкеров, привыкших к windows PE: http://xtin.activebb.net/forum-f1/tema-t38.htm
Monday, November 22nd, 2010 09:31 am (UTC)
То есть, то, что 4 гига памяти - "ее так мало, что не разгуляешься" - тебя не смутило? :)
Monday, November 22nd, 2010 09:56 am (UTC)
На общем фоне это уже мелочи :)
Полная версия: http://xtin.activebb.net/forum-f1/tema-t38.htm