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

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

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

  1. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    SII
    Не логическими, а линейными. В 1 томе мануала АМД-64 Technology (chapter 2. Memory model) все достаточно четко расписано:
    1) Виртуальное пространство = линейное. Или точнее: виртуальное - это более общее понятие, но оно по определению является линейным, поэтому применительно к железу везде юзается virtual = linear:
    2) Программы работают с эффективными адресами (programs provide\generate effective addresses).
    В 64-битном режиме (long mode) юзается плоская модель памяти, поэтому эффективный адрес = виртуальный\линейный с учетом ограничения разрядности (т.е. формально эфф.адрес 64-битный, а вирт.\лин. в текущих реализациях 48-битный).
    В прочих режимах юзается сегментированная модель памяти и эффективный адрес = смещению относительно базового адреса сегмента. Комбинация селектора сегмента и эфф.адреса = логический адрес (The combination of segment selector and effective address is also called a logical address or far pointer). В зависимости от режима логический адрес транслируется в линейный адрес соотв.разрядности.
    И вот тут "писаки" от АМД немного хитрят\осторожничают: для 64-битного compatibility mode они называют итоговый адрес virtual (linear), а для legacy режимов просто linear (?!). Более того, в описании ptotected mode они выдают загадочный опус, перекликающийся с древним мануалом Интел, с которого видимо и разгорелась дискуссия:
    Как сие понимать, если после преобразования логического адреса к 32-битному линейному мы "теряем" информацию о сегменте и фактически сворачиваем 16К*4G потенциальных логических адресов в 4G ?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    l_inc
    Не понял - что вопрос был в том, что для Вас новость то что написано на стр 14? я потрясён :)) или просто не хватало "официальной формулировки"?
    Или дело в том что: "Ну что ж, в этой презентации на стр. 14 действительно написано, что виртуальный адрес Винды -- это линейный адрес Интел."? - так тут именно этот вопрос обсуждался 11 страниц?

    defaultplayer
    Спасибо за аттач.
    Но и не даст ответа на вопрос "сколько в граммах вешать" 4Гб, 8Гб, 8Гб+4кб, 24Гб, 64Тб и т.д.

    SII
    Я конечно не претендую на строгость формулировки, но имхо термин "виртуальный адрес" означает что в физический он преобразуется не напрямую а через страничный (или другой хитрый) механизм и в этом смысле действительно все win функции работают с виртуальными адресами даже AllocateUserPhysicalPages, MapUserPhysicalPages, которые не гарантируют, что юзерские страницы находятся в памяти, а не на диске, а значит и эти страницы тоже виртуальны :). По моему в этой презентации этот нюанс достаточно понятно изложен.

    Так вроде бы мы тут связку IA-32 + win32 обсуждали, а не AMD64 + win64 ;) АП оно конечно везде АП, но его размеры есно разные :)
     
  3. SII

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

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

    Собственно, такое противоречие есть и в этой презентации. На странице 4 читаем:

    Совершенно недвусмысленно говорится о том, что приложения имеют дело с виртуальными адресами.

    Однако на странице 14 не менее недвусмысленно говорится:

    Если объединить оба этих высказывания из одного и того же документа, получается, что приложения Винды работают с линейными адресами Интел. Но ведь мы прекрасно знаем, что никакого доступа к линейным адресам ни у приложений, ни даже у ОС нет!

    В общем, получается полностью по Козьме Пруткову: "Если на клетке слона прочтёшь надпись «буйвол», не верь глазам своим".
     
  4. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Y_Mur
    Так дело в том, что реально IA-32 и АМДшные процы -- это одна и та же архитектура. Просто в данном случае АМД выёживается и использует свою терминологию.

    leo
    Угу, въехал. Когда писал, спешил (убегать надо было), поэтому доку не листал, да и сейчас ещё не смотрел, но будет время -- уточню для себя. Но в любом случае АМД здесь использует "свой" термин, хотя архитектура та же самая, что у Интел -- ИА-32.

    kero
    Если б мой английский был бы не однонаправленным, давно бы пожаловался :)
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    SII
    Имхо ты совершенно напрасно фразу "Windows virtual address is Intel linear address(32 bits)" понимаешь как необходимость всегда уточнять сегмент :) вспомни про flat модель винды, которая предполагает односегментную (даже если есть несколько дескрипторов с разными правами) память, а значит и явно уточнять какой из сегментов имеется в виду при передаче адреса функции не нужно, а с учётом того что база этого единственного сегмента равна нулю "Windows virtual address is Intel linear address" означает их численное равенство, а не эквивалентность самих понятий "виртуальности" и "линейности" ;) А вот часто встречающееся в msdn (и в презентации) уточнение что адрес виртуальный (в смысле #262), а не физический имхо вполне оправданно.
    Я бы так не сказал - "64-bit integer registers, 48-bit virtual addresses, 40-bit physical addresses" ни в IA-32+win32 ни даже в AMD64+win32 не доступны также глухо, как будто их просто нет. Так что речь тут уже о новой архитектуре поддерживающей обратную совместимость со старой.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    SII
    Дело не в процах, а в том что в 64-битном long mode используется плоская модель памяти (базовые адреса и переопределения сегментов кроме FS,GS - игнорируются), поэтому эффективный адрес = виртуальный (линейный)
     
  7. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Y_Mur
    Кажется, Вы не совсем поняли, о чём я говорю :) Сегментация и плоская модель в данном случае роли не играют, речь совсем о другом.

    Весь спор возник из-за того, что разные люди имеют разные мнения относительно того, что именно Майкрософт называет виртуальным адресом. Мы все согласны, что численно виртуальный адрес Винды равен линейному адресу в терминах Интел. Однако некоторые на основании этого считают, что Майкрософт и называет линейный адрес Интел виртуальным адресом. Я же с этим не согласен, поскольку Майкрософт неоднократно говорит о виртуальном адресе как о том, с которым непосредственно работает программа и который может передаваться как параметр -- как известно, линейный адрес в этих целях использоваться не может.

    leo
    И Вы тоже недопоняли то, о чём я говорил. Я обращал внимание на использование разных терминов разными производителями процессоров для обозначения одного и того же. У Интел присутствуют термины "логический" и "линейный", АМД пишет о "виртуальном", хотя могла бы использовать термины, существующие у Интел, ведь реально процессоры одинаковы (с точки зрения программиста, конечно, на уровне их "макроархитектуры", а не внутреннего устройства). И говорил это я лишь для того, чтобы показать разночтения в терминологии у разных производителей, даже выпускающих по сути одно и то же.
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    SII
    Тогда конечно поддерживаю SII :)) но с оговоркой - M$ всё-таки правильно "называет линейный адрес Интел виртуальным адресом" :)) поскольку линейный адрес формируется в процессоре до того как задействуется страничный механизм, а потому является виртуальным :)) Но из этого разумеется не следует обратное утверждение - "виртуальный адрес это только линейный адрес (т.е. сегмент:смещение после обрезания до 32бит)" Виртуальность более широкое понятие, чем линейность ;)
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Несоответствие не наблюдаете? :-) Они виртуальный адрес называют линейным, а не наоборот. А вот обратное утверждение (которое "наоборот") уж точно неверно по двум причинам:
    1) Microsoft не имеет права давать определения Intel'овским понятиям (линейный адрес, линейное АП, логический адрес, виртуальная память, физический адрес).
    2) Если Windows проектировалась не только под IA-32, то и IA-32 проектировалась и подавно не для того, чтобы под ней только Windows бегала.
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    l_inc
    Имхо как я уже писал "Windows virtual address is Intel linear address" всего лишь подчёркивает их численное равенство, а не утверждает эквивалентности между понятиями. Имхо это вполне очевидно если не вырывать эту фразу из контекста хотя бы той же самой презентации :), не говоря уже про msdn и т.п.

    Зато имеет полное право "заимствовать" интеловские определения для совместимости понятий, даже если их области применения пресекаются лишь частично ;) А по интеловским понятиям линейный адрес является виртуальным при условии, что задействован страничный механизм (в win32 он соответсвенно задействован).
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    Я о полной эквивалентности и не говорил. :-)
    Я и не вырывал. Там весь контекст из этой фразы состоит. :-)
    [obsolete]Согласен, но в фразе: "M$ всё-таки правильно 'называет линейный адрес Интел виртуальным адресом' ", — наблюдается переопределение, а не заимствование.[/obsolete]
    Гоню... всё потому, что отвечаю, сидя на парах. :-)
    Понятие виртуального адреса среди интеловских отсутствует независимо от того, задействован пэйджинг или нет. Наличие пэйджинга вводит понятие виртуальной памяти, но не виртуального адреса или виртуального АП, которые находятся в компетенции Windows. Похоже, я эту фразу за исключением небольших различий уже десяток раз в теме повторил. :-)
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    l_inc
    Имхо термин виртуальный адрес слишком широк, чтобы ограничивать его особенностями конкретной версии win или конкретной архитектуры процессора. Осмелюсь дать определение - виртуальный адрес - адрес подвергаемый неявным (прозрачным для прикладной программы) преобразованиям прежде чем он станет физическим. Этим преобразованием может быть и страничный механизм и любое программное извращение. В соответсвии с этим определением виртуальным является и виндовый offset и интеловские сегмент:смещение. А про виртуальное АП можно говорить уже только применительно к конкретному механизму отображения виртуальных адресов на физические.