Реальный режим DOS - непонятки

Тема в разделе "WASM.BEGINNERS", создана пользователем Nikankin, 17 янв 2008.

  1. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Прочитав выборочно главу о сегментации памяти в реальном режиме в разных книгах, статьях и пр. так и не понял как же все-таки формируется реальный адрес байта памяти с использованием 20 разрядной шины. В книгах об этом говорится вскользь и дана формула, но кто-нибудь пожалуйста разжуйте этот момент. Плохо без полного понимания двигаться дальше :dntknw:
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Nikankin
    Пусть cs=1234h и si=5678h, тогда адрес на который они указали
    address=1234h*10h+5678h=12340h+5678h=179B8h
    на тот же адрес указывают ds=1000h и di=79B8h и
    es=179Bh и bx=8h
     
  3. Nikankin

    Nikankin New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2008
    Сообщения:
    16
    Весь прикол, что не могу увязать вот это умножение на 16, действительно, посмотрев в отладчике на любую программу видно, что сегмент у нее примерно следующий 0D1450 или 12340. Все оканчиваются на нуль. То-есть реальный адрес будет таков 12340:5678 ? Вот какя-то мелочь, а все равно не въеду. Как в таком случае процессор преобразует 20ти разрядный адрес в 16-разрядный, например при чтении данного.?
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Преобразование происходит из 16-ти разрядов в 20-ти разрядный а не наоборот. При чтении переменной всегда есть два элемента: сегмент и смещение. Сегмент сдвигается влево на 4 бита и добавляется смещение.
    Код (Text):
    1. C917:BA04 =
    2.  
    3. C9170
    4.  BA04
    5. ----- +
    6. D4B74 = 20-bit
     
  5. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Nikankin
    с адреса 00000h по 0FFFFh - адреса доступные из нулевого сегмента
    00010h по 1000Fh - адреса доступные из первого сегмента
    . . .
    FFFF0h по FFFFFh - адреса доступные из сегмента номер FFFFh
    но так как разрядность шины адресов всего 20 бит - дальше адресация из сегмента номер FFFFh въедет в адреса доступные из нулевого сегмента, т.е. максимальный адрес в сегменте номер FFFFh равен FFFF0h+FFFFh=0FFEFh
    1234:5678h сегмент/смещение -> адрес 179B8h
     
  6. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Nikankin

    Как уже сказали, в реальном режиме:

    физический адрес = сегмент * 16 + смещение.

    Но тут существует один прикол. В процессорах 8086/80186 шина адреса процессора действительно была 20-разрядная, почему при обращении к последним байтам последних сегментов реальный доступ выполнялся к первым адресам памяти. Например, при сегменте FFFF и смещении FFFF получался адрес:

    Код (Text):
    1.    FFFF
    2. +
    3.     FFFF
    4.    -----
    5. (1)0FFEF
    Старшая 1, получившаяся в результате сложения, теряется, и доступ выполняется к байту с физическим адресом FFEF.

    Но при разработке 80286 инженеры Интел в очередной раз облажались и не отсекали в реальном режиме 20-й разряд адреса (напомню, что младший бит имеет номер 0, поэтому старший разряд 20-разрядного адреса имеет номер 19). В результате в реальном режиме стало возможным обращаться не к 1 Мб памяти, а к 1 Мб + 64 Кб - 16 байт. Этой ошибкой воспользовались разработчики MS DOS, запихнувшие значительную часть кода системы в эту самую "неправильную" область памяти. Ну а разработчики железа вынуждены были ввести специальный элемент, который мог либо блокировать линию A20, либо разрешать её, т.е. выполнять ту работу, которую по-хорошему должен был бы делать сам процессор.

    На практике это означает, что в реальном режиме не следует употреблять такие сегменты и смещения, в результате сложения которых адрес "зашкаливает" за 20 бит, потому что в результате можно получить не то поведение программы, какое ожидалось (ну или чётко представлять себе, что делаешь и как настроено железо).
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    а с чего вы взяли, что обязательно нужно что-то отсекать?
    то, что при разрядности шины > 20 можно обращатся по адресам >= 1Mb не входит в противоречие со структурой адресации в реальном режиме
    имхо
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    если бы в реальном режиме нельзя было бы работать с адресами > 1Mb, то нельзя было бы использовать 4-х гигабайтные сегменты для реализации нереального режима, а значит и всякие расширители памяти DOS и т. д
    постоянные переключения RM <-> PM в разы снизят производительность
    имея же A20# мы можем выбирать желаемое поведение
     
  9. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rei3er
    Потому что это делает процессор 80286 не до конца совместимым в реальном режиме с 8086. Что шанс на реальное проявление подобной несовместимости невелик, это понятно (разумный программист навряд ли станет адресоваться к первым 64 Кб памяти, используя "верхние" сегменты), но, тем не менее, факт налицо: 80286 (и последующие за ним) не имеет полной совместимости "снизу вверх" с предшествующими процессорами. А вот IBM в своих мэйнфреймах исповедовала обратный подход, в результате чего прикладные программы, написанные полвека назад для System/360, благополучно выполняются на современных zServer.

    Насчёт "нереального" режима скажу только одно: это нештатный режим работы процессора, не описываемый в фирменной документации, и работать он вовсе не обязан. А если хочешь работать с процессором "на полную катушку" -- работай в защищённом режиме, а не изгаляйся с "нереальным".

    Пы.Сы. Опять флудить "на тему" начинаем? :)))
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    однако многие BIOS его очень даже используют
    то, что он недокументированный - это понятно
    только не вижу причин для его неработоспособности
    это тот же реальный режим, но с большим лимитом сегментов
    опирается на те же скрытые части сегментных регистров (база + лимит)
    точно так же, как и обычный реальный режим
    пока на тему :)
     
  11. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rei3er
    Ну, БИОСы-то рассчитаны на вполне конкретное железо, поэтому могут смело "закладываться" на его имеющиеся функции, даже недокументированные.

    Если поменять аппаратуру управления памятью в процессоре. Лично я, кстати, так бы и проектировал 80286 и последующие, в результате чего они были бы в реальном режиме полностью совместимы снизу вверх с 8086...
     
  12. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    тогда изменится и семантика реального режима
    а если не изменится, то и нереальный режим будет работать
     
  13. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rei3er
    С какой это стати? Вы всерьёз полагаете, что без теневых частей сегментных регистров в реальном режиме нельзя обойтись? =-O
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    если бы лимит не использовался, тогда можно было бы и обойтись
    а лимит используется
    и даже псевдоисключения бросаются при его превышении
     
  15. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rei3er
    Это как раз несовместимая реализация архитектуры 8086 на более поздних процессорах. А совместимая делала бы банальное 20-разрядное сложение сегмента и смещения без всяких лимитов, и всё. Доступ, естественно, был бы только к первому мегабайту физической памяти -- точно так же, как на 8086, т.е. совместимость была бы 100%. Ну а в Интеле извращенцы сидят -- собсно, это видно по всем их процессорам, причём если для 4004 и 8008 простить недостатки можно на том основании, что они -- первые, то для последующих, и особенно 8086 и прочей линейки x86, извинений уже нет.

    Вот теперь точно переходим на чистый оффтоп :)
     
  16. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    SII
    разговор о чем зашел то?
    о нереальном режиме
    вы утверждаете, что он будет неработоспособен
    я же говрю, что тогда и семантика существующего реального режима изменится
    а если не измениться, тогда и с нереальным режимом будет все в порядке, т. к эти режимы отличаются только лимитами сегментов
     
  17. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    я считаю, что механизм A20# более гибок, нежели банальное отсечение старших разрядов при формировании адреса
    по-умолчанию после RESET# A20# активен и маскирует старшие разряды, тем самым делая реальный режим аналогом такового в 8086
     
  18. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rei3er

    Я исхожу не из какой-то там "гибкости", а из совместимости. В нормальных проектах, декларирующих совместимость со своими предшественниками, совместимость должна быть реализована качественно. У Интела этого нет: чуть ли не в каждом новом процессоре долгое время бывали "фишки", реализованные не так, как в предыдущих (то значение SP, сохраняемое по PUSHA, отличается, то многоразрядный сдвиг не так работает, то вычисление адреса в реальном режиме).

    Что же касается шлюза A20, то это "латание дыр" внешними схемами. В конце концов, единственное назначение реального режима, помимо сохранения совместимости с MS DOS, -- это обеспечить переключение в защищённый режим, а отнюдь не в "нереальный". Последнее, как и использование в последних версиях ДОСа HMA, -- это уже из серии "голь на выдумки хитра".
     
  19. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    а когда не было защищенного режима...
    кроме того, не создавался же реальный режим только для того, чтобы когда-то стать режимом для совместимости
    в первую очередь реальный режим - это режим отсутствия ограничений
    а если так совпало, что разрядность адресной шины первых процессоров диктовала условия использования физического адресного пространства, то это еще не значит, что при расширении разрядности нужно нямерянно (без возможности контроля) отказываться от новых возможностей
    а так, и волки сыты, и овцы целы
    и совместимость есть, и новые возможности (типа нереального режима) можно использовать
     
  20. SII

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

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    rei3er
    Есно, он не создавался для этого. Однако когда речь зашла о создании процессора, поддерживающего переадресацию и защиту памяти, это автоматически сделало реальный режим устаревшим, поэтому его "улучшать" и не требовалось: надо было лишь обеспечить, чтобы любая программа реального режима работала корректно на новом процессоре. Этого инженеры Интел не сделали.

    НЕТУ совместимости. Она получена лишь за счёт внешних по отношению к процессору схем. Сам процессор 80286 (и последующие) не является полностью совместимым с 8086.

    Обратный пример демонстрируют мэйнфреймы IBM. Изначально на них был принят 24-разрядный адрес, позднее его расширили до 31 разряда. Однако если этот самый "расширенный режим" выключен, машина функционирует в обычном 24-разрядном режиме, сохраняя полную совместимость с предыдущими моделями. Причём в одно и то же время можно выполнять и 24-, и 31-"разрядные" прикладные программы -- естественно, если ОС является 31-"разрядной" и умеет переключать процессор из одного режима в другой.

    Правда, ещё позднее совместимость пришлось всё-таки частично нарушить, но касалось это не разрядности адреса, а привилегированных возможностей и команд. В результате операционные системы 1960-70-х годов на современных zServer работать уже не могут (изменения в управлении памятью, кардинально переделан ввод-вывод), однако всё прикладное ПО остаётся работоспособным без малейших модификаций.

    Сравните с этим 8086 и 80286. Реальный режим не является полностью совместимым (из-за суммирования); кроме того, если память не изменяет, несколько изменилась функциональность каких-то команд (утверждать не буду, а искать инфу лень, но вообще эта проблема есть, только не уверен, в каких именно процессорах). Ну а в защищённом режиме совместимость с 8086 на прикладном уровне вообще теряется: программы MS DOS или какой-нибудь там CP/M-86 не могут функционировать в любой ОС для 80286 в защищённом режиме. И только в 80386 на Интеле "вспоминают" про совместимость со старыми системами и делают режим V86.

    Кроме того, можно припомнить, что защищённый режим 80286, 80386 и других процессоров вплоть до появления специальных "технологий виртуализации" не позволял создавать настоящие виртуальные машины: можно было делать только эмуляторы, которые функционируют во много раз (иногда в десятки) медленнее реальных машин. Проблема -- в "кривой" реализации ряда команд и возможностей (в первую очередь проблема заключается в том, что непривилегированная программа может прочитать ряд системных регистров).

    Так что, как ни крути, а творение Интела -- отнюдь не шедевр инженерной мысли. Скорей эта фирма -- "партия трудовиков", которая создаёт себе (и не только себе) трудности, а потом их мужественно преодолевает.