Программирование x86 в защищённом режиме

Тема в разделе "WASM.ASSEMBLER", создана пользователем sergh, 10 ноя 2005.

  1. _CC

    _CC New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    52
    2The Svin:

    >> Я вот уже 6 источников с одним и тем же "что" по

    >> интересующей меня теме прочитал.

    Иначе говоря 6 источников о защищенном режиме, или это гипотетическое предположение?..
     
  2. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    Из-за раззрядности шинного интерфейса IMHO.
     
  3. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    Ни то ни другое. Просто по теме, которая сейчас интересует, тоже тучка источников, включая MS доки, но определённости в картине изучаемого объекта не могу получить.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Третья попытка прояснить ситуацию с переполнением и сложением по модулю 2^32 ;)



    В разделе 3.2 IA-32, vol.3 читаем: механизм сегментации может быть использован для реализации широкого круга системных решений, начиная от плоских моделей с минимальным использованием сегментации до многосегментных моделей, обеспечивающих устойчивую надежную работу множества программ. И далее кратко рассматриваются возможные модели памяти.

    В простой плоской модели базовые адреса сегментов устанавливаются в 0, а segment limit в 4Gb. Это отключает генерацию исключений out of memory limit, даже если в итоге результирующему адресу не будет соответсвовать никакой физической памяти. Но при этом и переполнение линейного адреса при base+offset возникать не может.

    В защищенных плоских моделях и многосегментных моделях памяти должны устанавливаться валидные значения limit, предотвращающие и переполнение, и выход за пределы размера сегмента, и some kinds of program bugs. При валидном значении (limit+1)*granularity < 4Gb-base с учетом предварительной проверки offset на out of limit переполнение суммы base+offset просто невозможно - иначе еще до сложения будет выброшено исключение. Устанавливай валидные лимиты сегментов и наслаждайся ;)

    Вывод: в предлагаемых IA-32 моделях памяти переполнение линейного адреса не возникает, поэтому особо подчеркивать, что сложение base+offset осуществляется по mod 2^32 вроде как и нет.



    А возможно ли вообще переполнение линейного адреса ? Наверное возможно, если прикинуться идиотом и установить limit = 4Gb при base <> 0. Тут уж извините - не учли, не объяснили. Хотя сколько идиоту не объясняй, что пальцы в розетку не нужно совать, он обязательно попробует что из этого выйдет ;))



    PS: Не нужно путать вычисление линейного адреса с эффективным и базовый адрес сегмента с базовым регистром при программной адресации. Разумеется вычисление эффективного адреса при mov eax,[esp+offset] всегда осуществляется по модулю 2^32 и ес-но без всяких исключений
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Получается что по идее архитектура IA32 позволяет адресовать до ~8ГиБ (т.е. descr.base = 0xFFFFFFFF, descr.limit = 4ГиБ), но сложение ограничивает адресацию в 4ГиБ виртуальной памяти (т.е. по сумме любое смещение + база не превышает 0xFFFFFFFF)?
     
  6. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    alpet

    До 64-х, с использованием страниц и на процессорах новее Pentium Pro.



    leo

    Спасибо на добром слове :)



    >> А возможно ли вообще переполнение линейного адреса ? Наверное возможно...



    Странный вопрос, конечно возможно.



    >> .. прикинуться идиотом и установить limit = 4Gb при base <> 0.



    Это называется не идиот, а естествоиспытатель.



    >> Тут уж извините - не учли, не объяснили



    Что значит не учли? Процессор от этого взорвётся? Всё они учли, просто описать забыли.
     
  7. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    The Svin

    >> Из-за раззрядности шинного интерфейса IMHO.



    А можно тоже самое, но для простых людей :) Что за шина хотя бы имеется в виду? И причём здесь она, по идее процессор туда больше 32-х разрядов не отдаст.. И главное, в защищённом режиме то точно такая же шина. В общем, я пока тебя не понял..
     
  8. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    И если этот эффективный адрес = FFFFFFF0h а базовый >= 10h то и тут может не быть исключение.

    Короче, у меня в старых доках Intel кружочек, у Григорьева кружочек. Так что вот :)
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    sergh, The Svin

    Согласен, что плюсик в кружочке с пометкой mod 2^32 было бы правильнее ;)

    Просто разработчикам часто кажется, что и так все ясно, и предусмотреть все варианты нештатного использования своего творения им просто в голову не приходит. Взгляните с позиции писателей Intel: предлагаемые модели памяти описали, механизм проверки лимита описали, все возможные исключения описали, на схеме указали 32 разряда результирующего линейного адреса. Что еще нужно ? Ну нету 33-го разряда, и флага переноса нету, и исключения соответсвующего нету. Зато есть рекомендации по установке лимита. Для System Programming Guide вполне достаточно. А вот для исследователей есть над чем голову поломать - а вдруг у коварных интелов не обычный 32-разрядный сумматор и FFFFFFF0h+10h != 0 ;) Кстати кто-нибудь проверял, что в итоге получается ?! Исследовать, так исследовать ;)



    > "А почему в реальном режиме всё так плохо?"



    Может поэтому:

    IA-32,vol.3 16.1.1. Address Translation in Real-Address Mode:

    "The IA-32 processors beginning with the Intel386 processor can generate 32-bit offsets using an address override prefix; however, in real-address mode, the value of a 32-bit offset may not exceed FFFFH without causing an exception.

    For full compatibility with Intel 286 real-address mode, pseudo-protection faults (interrupt 12 or 13) occur if a 32-bit offset is generated outside the range 0 through FFFFH.
     
  10. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    leo

    >> Может поэтому:

    >> ...



    Ну, это просто неправда :) Т.е. они конечно такое пишут, но в Unreal mode замечательно просто можно использовать любые смещения.



    В реальном режиме FFFFH это segment limit, соответственно, при попытке обратьться дальше будет исключение. Unreal mode снимает это ограничение.