Upper Memory Blocks, EMM386

Тема в разделе "WASM.ASSEMBLER", создана пользователем lukash, 19 июл 2008.

  1. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Всем привет

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

    "EMM386 has detected error # 6 in an application at memory address
    00B8: 1202. To minimize the chance of data loss,
    EMM386 has halted your computer.
    To restart your computer, press ENTER "

    Запустить Soft-Ice и посмотреть откуда и почему прыгаем по неправильному адресу (попытка выполнить неизвестную инструкцию - по этому адресу какие-то левые данные) не получается, из за загруженного EMM386.

    Может у кого есть какие идеи в какую сторону копать, поделитесь плз.

    Сам EMM386 (да и еще некоторые схожие программы типа QEMM) корректно устанавливает эти UMBs (смотрю с помощью mem), с использованием ключей RAM или NOEMS, но вот использовать эти блоки не получается.

    Уже перепробовал все возможные комбинации ключей EMM386, каким либо образом связанных с этой проблемой, но пока безрезультатно.

    В общем подскажите плз, где наиболее полно можно почитать о том, как EMM386 предоставляет доступ к блокам верхней памяти.
     
  2. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Хотелось бы услышать хоть какие-нить предположения, потестирую любые..

    Странно - почему-то перед загрузкой драйвера (функцией 4Bh 21 прерывания) выполняется 21 прерывание в функцией 58h - ax=5803, bx=0 - т.е. устанавливаем новое состояние UMB- не используется. Зачем ДОС (6.22) отключает использование UMBs, если мы собираемся загружать туда драйвер?
    При выполнении кода по включению UMB (int 21h ax=5803 bx=1), машина виснет.
    Странно, что не работает только на этой (AMD LX800) машине, на остальных все ок.
    Также неважно сколько памяти и по каким адресам (могу использовать от C800 до DC00) выделяю под UMB - все равно валиццо на 6-й ошибке.
    уф...
     
  3. ConstZ

    ConstZ New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    42
    Если я ничего не забыл за 15 лет, то -

    1. Для того, чтобы DOS смогла пользоваться UMB, первыми строками в config.sys должны быть:
    DOS=HIGH,UMB
    DEVICE=HIMEM.SYS
    DEVICE=EMM386.EXE NOEMS

    2. Ни himem, ни emm386 не могут быть загруженными директивой DEVICEHIGH.

    3. Некоторые программы могут игнорировать директивы DEVICEHIGH или INSTALLHIGH (если не ошибаюсь - smartdrv).

    4. EMM386 не предоставляет доступ к блокам верхней памяти, - он "обманывает" DOS, показывая ей наличие там RAM, которую заимствует у HIMEM.SYS