1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Пространства адресов

Тема в разделе "WASM.BEGINNERS", создана пользователем defaultplayer, 28 дек 2008.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Речь идёт о логическом адресе. Мы где-то в середине темы договаривались к концу обсуждения определить понятие логического АП. Как раз пришло время. Разумеется, что никто не возражает, что, каким бы ни был размер логического АП (которое пока не определено), логический адрес "отображается" через механизм сегментации на строго 32-битное линейное АП. Поэтому те 24 ГБ (о которых верно уточнил defaultplayer, поправляя ерунду написанную AndreyMust19) или 8 ГБ+4 КБ - это довольно абстрактные размеры. Лично меня удовлетворяют пока два варианта размеров логического АП: 2^48 байт (уже предвижу возмущение :-) ) и 4 ГБ. 2^46 байт из просроченной интеловской документации довольно скользкие.
    А уж размер виртуального АП процесса Windows и подавно 4 ГБ.
     
  2. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    Y_Mur
    вы я смотрю товарисч весельчак такой, прям петросян, профессией не ошиблись?
    а смешное то на самом деле то, что с AndreyMust19 подгоняете, а сами та и подавно адреса путаете.
    AndreyMust19 умозаключения хотя бы делает, но вам это негрозит, в отсутствие оного, имхо все конечно.

    l_inc
    мы уперлись в логический адрес как множество адресов логического ап, а это, на мой взгляд и есть наша ошибка,
    нужно же просто проссумировать все оффсеты, тоесть если
    есть два сегмента по 1 байту, суммируем их и получаем логическое ап. 2^46 это кол-во возможных оффсетов в одной GDT и одной LDT

    а майкрософт это делает, если бы это было красиво, то она бы наверно сказала offset address,
    но так как это ни в какие ворота нелезет, она его называет segment-relative address.

    да да да, только в том "называть его самостоятельным адресом" и "считать единственно возможной частью адреса" ничего общего нет
    это раз, и виртуальным его майкрософт неназывает это два, так как пишет что конвертирует segment-relative address to linear virtual address.

    я рассматриваю аргументы и SII, но пока эти утверждения неподкреплены никакими ссылками, цитатами, чтобы я мог убедиться в обратном от своего
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    defaultplayer
    Немного не так. :-) Логическому адресу Intel уже дали определение: селектор:смещение. А вот на то, что понимать под логическим АП, я ссылок в новой документации не видел. Поэтому логическое АП на основе логического адреса, а не наоборот: логическое АП - это множество логических адресов.
    Почему ошибка? Есть какая-то аргументация за или против такого определения логического АП? Существование segment-relative address, как понятия отдельного адреса, ИМХО не влияет на то, как будет определено логическое АП, которое имеет или по крайней мере должно иметь отношение только к полному логическому адресу.
    Речь о всё той же GetThreadSelectorEntry? Ну... тут SII же скажет, что это платформозависимая функция... хотя... интересно узнать, что именно скажет SII. :-)
    Я даже не знаю, как это назвать, но такая формулировка неудачна. :-) А откуда происходит 2^46, я знаю.
     
  4. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    l_inc
    Именно это и скажу :) Когда Майкрософт пишет о виртуальном адресе и виртуальном адресном пространстве, она явно это делает безотносительно к аппаратной платформе, а значит, эти термины универсальны. Ну а махинации с дескрипторами сегментов -- это, как все (или не все?..) мы прекрасно понимаем, вещь специфическая, реализуемая только на некоторых платформах. Поэтому приплетать подобные фичи к обсуждению того, что же есть виртуальный адрес по Майкрософт, не просто не следует -- этого нельзя делать, поскольку, как уже тыщу раз говорил, определение виртуального адреса должно быть кроссплатформенным.

    Мне тоже такая идея не шибко нравится. Однако это единственный способ на платформе ИА-32 удовлетворить тому, что пишет о виртуальном адресе Майкрософт. Любая иная трактовка будет противоречить сказанному в МСДН, а значит, с формальной точки зрения будет неверной.

    Лично я тоже придерживаюсь такого определения. Если виртуальное АП -- множество возможных виртуальных адресов, а физическое -- физических, то и логическое АП должно быть множеством логических адресов. Естественно, речь о платформе ИА-32, поскольку мы используем определение логического адреса от Интел. На других платформах логических адресов может и не быть или же ими будет назваться что-то другое.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    l_inc
    Большое спасибо - я наконец врубился в чём прикол этой темы, а то думаю чего тут на пустом месте уже 9 страниц нафлудили :))
    Тогда предлагаю не размениваться на частный случай адресации с использованием сегментных регистров, а действовать с настоящим размахом - у нас же есть 6 адресных пространств по 4Гб адресуемых через [eax+offset], [ebx+offset],..., ещё есть 36 адресных пространств по 5Гб адресуемых [eax+ecx+offset],..., ещё 36 адресных пространств по 9Гб адресуемых [eax+ecx*2+offset],..., ещё 36 адресных пространств по 17Гб адресуемых [eax+ecx*4+offset],..., ещё 36 адресных пространств по 33Гб адресуемых [eax+ecx*8+offset].
    Проссумировав эти дикие Гб можно получить шикарное адресное пространствище, правда это в соотвествии с запретом defaultplayer на изменение регистров, а если это непонятное мне ограничение снять, то просторы супер-пространства сильно расширяются.
    Осталось только ему название покрасивее выбрать :) Затем можно дать персональное название каждому из "возможных" в IA32 "адресных пространств" и получится супер-пупер-мега классификатор на основе которого можно уже и учебник издать ;) а в 3200 году интернет археологи раскопают здесь этот классификатор и сделают на его основе реальный камешек по случаю юбилейноё даты IA32 :)))
     
  6. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Y_Mur
    Жжешь!
     
  7. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    l_inc
    такого определения нет ни в старой документации ни в новой, но при этом оно вам нравится, зато прийти к тому, что линейное ап на основе линейных адресов (потому что линейный адрес однозначен, так как не состоит еще из каких-то бит не участвующих непосредственно в адресации) возможно, с физическим тоже самое, ну а логическое ап как множество логических адресов, сами же говорите и видите что не лепится, и при этом определение даете свое собственное. Логическое ап это множество сегментов(оффсетов в них, байт в них).
    опять же, с чего такое утверждение

    SII
    вы уже в конце концов определитесь, "этого нельзя делать" или "это единственный способ на платформе ИА-32 удовлетворить тому, что пишет о виртуальном адресе Майкрософт", а то получается когда вам нужно вы всех ткнете носом в то что термин "виртуальный" кроссплатформенный, но когда нужно обратное непрочь упомянуть что это оффсет на ИА-32, вы как-то подружите одни свои мысли с другими.

    та отжигает похлеще петросяна

    Y_Mur
    я что-то сомневатся стал что мы с вами одного и того же рихтера читаем, наверно тот что у вас, фантаст какой-то
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В общем если тут кого нибудь интересует реальность, то:
    Сегментная модель расширяла адресное пространство в IA-16 (с 65кб до 1Мб в 8086 и до 16Мб в 286). В IA-32 сегментная модель всего-лишь один из способов адресации в пределах 4Гб. Способ интересный, полезный (позволяет красиво решать проблемы с растущими массивами, контролем за случайным выходом из допустимого диапазона в массиве и другие задачи), но практически не востребованный, надо полагать сильно осеписателей достала сегментная модель в IA-16, что они и в IA-32 так от неё шарахнулись :)) Но адресовать больше 4Гб этот способ не позволяет так же как и потенциально 34Гб адрес вида [eax+8*ecx+offset].
    Таким образом линейное адресное пространство сегмент:смещение составляет 4Гб.
    Если страничный механизм отключен, то линейный адрес = физический адрес, т.е. именно линейный адрес (сегмент:смещение) подаётся на шины адреса линеек памяти и других девайсов имеющих память отображаемую в адресное пространство процессора. В этом случае физическое АП тоже 4Гб, даже если памяти в системе больше чем 4Гб.
    Если страничный механизм включён, то линейный адрес = виртуальный адрес (как раз потому что связь с физическими адресами здесь не прямая, а через посредника), а физический адрес уже формируется страничным механизмом и за счёт этого физическое АП может быть 64Гб. Но линейное (сегмент:смещение) АП всё равно 4Гб хоть 6 сегментов используй, хоть 136 сегментов :)) поскольку на уровне одной задачи они все отобразятся в эти 4Гб.
    На этом обзор аппаратно поддерживаемых АП в IA-32 окончен ;)
    Можно рассмотреть ещё АП оси = сумме всех АП процесов, но это уже не IA-32 а осезависимое программное АП.

    А если здесь речь о фантазиях на тему альтенативы IA-32, то какие-то слабенькие фантазии ;) что такое 8Гб+4кб? или 24Гб? - учитесь как надо - в дескрипторе сегмента IA-3200 будут предусмотрены специальные флаги указывающие как интерпретировать конструкции типа [eax+8*ecx+offset] - как в IA-32 для совместимости или как 4294967295 адресных пространств по 34359738360 байт или как 21474836475 адресных пространств по 4Гб :))

    defaultplayer
    Может подскажешь с каким ключиком линковать программу чтобы win32 выделила моей задаче 8Гб+4кб? или 24Гб?
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Гляньте вот сюда. Вот когда прочитаете про то, что Intel сами говорят о 64-терабайтном адресном пространстве, может поменяете свою точку зрения.
    И хватит писать фразы в духе: "Линейное адресное пространство сегмент:смещение составляет 4Гб". Мы уже вроде выяснили, что они недостаточно формализованы, чтобы на них можно было опираться.
     
  10. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    l_inc
    Это где они считают 8191+8192 сегмента по 4 Гбайта, всё это суммируют и получают эти самые 64 Тбайта без 4 Гбайт? Я соглашусь, что логическое адресное пространство действительно такое, только практической пользы от этого нет из-за ограниченного линейного адресного пространства. Практическая польза может быть при использовании сегментов меньшего размера, т.е. при нормальной сегментированной модели памяти, но это уже другой разговор...
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    А я и не говорил о практической пользе. Я всё время предлагал три варианта: 2^48 (абстрактно), 2^32 (практически) или вообще не вводить понятие логического АП. Причём последний вариант меня устраивает не меньше других. А вот defaultplayer настаивает на том, чтобы обязательно определиться с ним.
     
  12. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    l_inc
    Ну, лично я применительно к Винде не вижу особого смысла в введении понятия логического АП. Мне как-то майкрософтовского виртуального хватает :)
     
  13. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    Аналогично. :-) Особенно учитывая, что в новой документации Intel оно упоминается ровно один раз, причём без какого-либо контекста.
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А с учётом того что IA-32 очень скоро останется только как режим совместимости со старыми прораммами, то те аспекты что до сих пор не имеют практической пользы так её уже и не приобретут ;)
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Вы только что долго и весело иронизировали на тему любых АП, размер которых превышает 4 ГБ. Что-нибудь скажете по поводу данной в 229-м посте ссылки?
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    l_inc
    Скачал, почитал и рекомендованный в ссылке п3.1.2 и п11 на который 3.1.2 ссылается - не увидел ничего противоречащего тому что здесь писал я :)) Если уж Интел фантазирует на тему АП то масштаб фантазии у них вполне нормальный - 64Тб особенно для того времени очень прилично :)) Надо полагать, что они тогда задумывались на тему не реализовать ли эту возможность не в фантазии, а в реальности (как я уже отмечал в #218 это было бы неплохо ;), но раз не разделили АП сегментов (не гипотетически, а так чтобы практически доступно было) до сих пор, значит уже и не сделают, поскольку IA-32 уже не перспективна.
     
  17. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    defaultplayer
    Вот из 192 поста:
    Чего здесь непонятного - не знаю. Может лучше было сказать так:
    Может мысли получше выражать? Но тогда посты будут немного длиннее. Если непонятки - смотрите рисунки из #207 - так, думаю, будет понятнее.
    #213 Y_Mur
    Я понял твои доводы. Но ведь максимальный размер сегмента в 4 Гб (макс. значение 32-го значения) - не просто так придумали. Я скажу так:
    - абсолютный адрес в командах передачи управления отсчитывается от начала сегмента кода (условно - CS)
    - адрес в командах пересылки данных - от начала сегмента данных (DS)
    - Значение регистра eip отсчитывается от начала сегмента стека (SS) при использовании команд работы со стеком (push, pop и др.)
    - получать доступ к другим сегментам можно, если поставить перед командой префикс соответствующего сегмента. Можно просто поменять сам сегмент - использовать, например, GS вместо DS, если записать значение регистра ds в регистр gs.
    Именно поэтому приложение может адресовать (т. е. получать доступ) к каждому (!) сегменту, стоит только поставить префикс сегмента перед командой. Поэтому и макс. размер сегмента равен максимальному виртуальному адресу.

    Есть еще особенность, по которой я четко понимаю - зачем IBM в своей машине отказалась от "доступа на выполнение". Чтобы выполнять команды в другом сегменте (н-р FS) нужно перед каждой из них поставить префикс этого сегмента (то есть модифицировать код). Именно поэтому "гадость", не обладающая дизассемблером, не сможет исполнить свой код в сегменте стека.

    К сожалению, из-за плоской модели памяти, используемой в Windows, многие понятия сегментов для людей стали труднопонятными (почему это так, если Windows так не делает?). Windows не делает очень многого, чего позволяет архитектура IBM PC. Например, для прикладных программ она не использует эти самые сегменты - все они начинаются с одного и того же линейного адреса и имеют макс. размер - 4 Гб. (кроме FS, опять таки). Поэтому для программы возникает почти полная картина того, что любая ее команда (будь это передача управления или пересылка данных) может получить доступ к любому (!) значению в адресном пространстве, поскольку все адреса (и пересылки и в командах ветвления) отсчитываются от одной и той же точки отсчета.
     
  18. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Я считаю, на уровне доступа к памяти, что в низкой безопасности Windows виновата Microsoft. Она погналась за переносимостью, сделала плоскую модель памяти, отказалась от многих прибамбасов Intel-архитектуры, но... не догнала. Ведь в 99,9999% случаев Windows стоит только на платформе IBM PC! Вывод - если в переносимости нет выгоды, почему бы от нее не отказаться! Почему бы не использовать сегменты так, как это полагается.

    Тогда затирание адреса возврата не приводило бы к передачи управления на стек! Ведь стек бы распологался отдельно от сегмента кода. А команда ret воспринимает снимаемый адрес как тот, который отсчитывается от начала сегмента кода! Это привело бы к значительному повышению безопасности системы от червей и переполнений локальных буферов в стеке. То есть ДАННЫМИ было бы невозможно повлиять на КОД, поскольку они бы рапологались в отдельных "комнатах".
    И еще много-много всего!!!
     
  19. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Короче, долго мы все это будем размусоливать?
    Куча людей уже 10 страниц сидят, разбирают устройство песочницы, когда могли бы заняться другими топиками, требующими размышлений. Получается что после нового года в голове у всех завелся чертик, который переворошил кучу бумаг и привел документацию в беспорядок.
    Я так думаю, надо будет в срочном порядке опубликовать статью (это я не про себя), которая раз и хотя бы на 2 недели ограничит все расхождения в головах. А так мы до бесконечности будем рассуждать, хотя одними только словами такие Простые вещи сложно объяснить. Получится - что не только с флудом бесполезно бороться, но и с тем, что каждый понимает что-то по-разному.

    Вот небольшой текст, им попытаюсь разогнать хоть часть непоняток. Я сам не все до конца понимаю, местами буду об этом упоминать. Время позднее, поэтому кроме непоняток у меня могут быть ошибки.Приводите комментарии, если где ошибся.

    Материал

    *** Линейный=Физический адрес ***
    Физический адрес - это значение, проходящее в шине данных процессора, которое означает настоящий адрес в оперативной памяти, к которому обращается команда. Линейный адрес пришел из реального режима, где он совпадает с физическим.

    *** Сегмент в защищенном режиме ***
    Сегмент - это область данных в оперативной памяти, которой соответствуют некоторые атрибуты. У сегмента есть:
    - Начало
    Линейный адрес, размером в 32 (?) бита.
    - Размер
    20-битное беззнаковое значение, определяющее размер сегмента в "попугаях". Размер одного попугая определяется по "биту гранулярности". Если он его нет, то - 1 байт, если он есть - то 1 Мегабайт. В последнем случае макс. размер = 4 Гб.
    - Атрибуты
    Записи и чтения. В новых моделях теперь есть "исполнение".
    - Привилегия
    (Кольца защиты) - от 0 до 3. Влияет на список допустимых команд для выполнения. Посему особо важен для сегмента кода. Но команда не может обратится к линейному адресу, если сегмент, которому он принадлежит, имеет бОльшие привилегия, чем сегмент, в котором лежит эта команда.
    Программе доступны только 6 сегментов. Каждый сегмент - это свое адресное пространство

    *** Сегментный регистр ***

    Содержит индекс в локальной или глобальной таблице сегментов. Вот только отчего зависит - какая из них - ?. Таблица сегментов содержит параметры сегментов.
    - абсолютный адрес в командах передачи управления отсчитывается от начала сегмента кода, индекс которого записан в сегментном регистре CS. Относительный адрес - отсчитывается от значения eip после выполнения команды.
    - адрес в командах пересылки данных - от начала сегмента данных (DS)
    - Значение регистра esp отсчитывается от начала сегмента стека (SS) при использовании команд работы со стеком (push, pop и др.)
    Получать доступ к другим сегментам можно, если поставить перед командой префикс.

    *** Windows ***
    В этой системе для каждого приложения все сегменты (кроме FS) начинаются с одного линейного адреса и имеют размер в 4 Гб (из 3-го кольца доступны только первые 2 Гб, а первые 64 Кб недоступны вообще). Поэтому получается модель плоской памяти. В этой модели можно говорить об ОДНОМ адресном пространстве. Далее будет идти речь только о плоской модели

    *** Логический=Виртуальный адрес ***
    Это адрес внутри команды. Этот адрес отсчитывается от начала адресного пространства процесса (если, конечно перед командой не стоит префикс FS).

    *** Страницы ***
    Собственно нужны процессору чтобы, например, контролировать доступ к разным данным в сегменте DS (для констант - только чтение, для глобальных переменных - чтение и запись). В Windows страницы используются гораздо больше, чем сегменты. Размер всех страниц для процесса - одинаковый и где-то задается (?). В новых моделях процессоров у страниц имеется атрибут "выполнение".

    Ждите продолжения! И следите за исправлениями!
     
  20. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    AndreyMust19
    Полный бред. Объём виртуальной памяти вообще ничем не ограничен. Может быть 256 МБ, может быть 3 ГБ, а может быть и 100 ГБ.
    Опять бред. Во-первых, нету никаких команд ветвления. Есть инструкции условных переходов. Во-вторых, адрес, записанный внутри этих инструкций, отсчитывается от адреса следующей за ними инструкции.
    Не знаю, причём здесь стекло, но eip к push и pop даже примерного отношения не имеет. И уж точно он не отсчитывается от SS. Короче, очередной бред.
    И снова бред. [obsolete]Максимальный размер сегмента (он же просто размер сегмента) равен полю limit из дескриптора сегмента, если флаг гранулярности сброшен, или 4 КБ * limit, если флаг гранулярности выставлен.[/obsolete]. Тут погорячился. Хотя это всё равно не влияет на то, что высказывание - бред.

    Ну а дальше просто без комментариев. Просто бред.

    P.S. Пока писал, ещё пара постов... не рискну сказать, что бред... читать лень.