Вынос первого мегабайта.

Тема в разделе "WASM.RESEARCH", создана пользователем NoName, 24 ноя 2008.

  1. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    NoName
    Так включи страничную адресацию. Замени првый мегобайт вторым и включи виртуальный режим с разрешеными портами и перенаправленнымипрерываниями. Сделать это легко.
     
  2. ConstZ

    ConstZ New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    42
    Что-то я тебя не понимаю: *.com файл это просто образ памяти - код, данные и будущий стек вместе взятые, помещённые в один сегмент. Запускается он простой загрузкой в память и передачей управления в начало кода (файла). Дос "подклеивает" *.com после специального блока psp, размером 0x100, место под который резервируется заранее ORG_100h. Т.е. код идёт с начала файла, а то что после загрузки произойдёт смещение на 0x100, держим в уме.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    NoName
    Про запуск Com посмотри Абеля Ассемблер. У него это раписанно.
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    NoName
    Интересная постановка задачи - ты столько писал что собираешся затереть ДОС своим кодом за ненадобностью и вдруг:
    :))
    Я собственно предлагаю вообще не бороться с ДОС:
    Код (Text):
    1. // запись word за пределы 1Мб
    2. void outHiMemW(unsigned long addr, unsigned int data){
    3.     __asm {
    4.         _emit 0x66  // 32битные данные
    5.         mov si, word ptr [addr] // это: mov esi, dword ptr [addr]
    6.         mov ax, [data]
    7.         _emit 0x65  // GS
    8.         _emit 0x67  // 32битный адрес
    9.         mov [si], ax    // это: mov gs:[esi], ax
    10.     }
    11. }
    12.  
    13. // чтение word за пределами 1Мб
    14. unsigned int inHiMemW(unsigned long addr){
    15.     __asm {
    16.         _emit 0x66  // 32битные данные
    17.         mov si, word ptr [addr] // это: mov esi, dword ptr [addr]
    18.         _emit 0x65  // GS
    19.         _emit 0x67  // 32битный адрес
    20.         mov ax, [si]    // это: mov ax, gs:[esi]
    21.     }
    22. }
    Это пример, как можно унреально обращаться за пределы 1Мб, хотя вариаций на эту тему можно много напридумывать :))

    ЗЫ: 16 битного компилятора под рукой нету, так что может быть придётся что-нибудь подправить в коде по мелочи чтобы заработало ;)
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    ConstZ
    Я грузил просто tasm .com файл (в 0xFFFF:0100). Все нормально работало без гемора с псп. Большая часть кода загрузчика написана на си в bc45 и он видимо что то хочет от псп. Я же хочу чтобы файлов было меньше, т.е. чтобы программа грузила сама себя. Нужно что то делать с ним. Я пробовал 55h и 50h и т.п. Эффект от зависания до простого непонятного выхода обратно в консоль.
    Pavia
    спасибо, читаю.
    Y_Mur
    проверка файлов происходит перед их использованием :) Потом дос уже ненужен.
    Насчет страничной адресации и unreal mode (итак юзаю для копирования из старших мегабайтов вниз) - тот вариант что вы предлагаете к сожалению мне неподходит по разным причинам.
     
  6. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Непонимаю я что это за мелочки такие :dntknw:
    Функция 4bh мне неподходит потому что я гружу файл сам.
     
  7. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    и еще один вопрос. Как ускорить копирование данных из верхних мегабайтов в нижний с помощью унриал моде? Я бы с радостью сделал rep movsd но сегмент es для этой команды нельзя переназначить. Его не перегрузить потому что я юзаю дос вызовы и вообще си компилятор. Копировать двордами это как то несерьезно.
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    NoName
    Ну во первых копирование двордами невыравненных двордов существенно быстрее чем rep movsd :)) с выравненнными соизмеримо по скорости ;), а во вторых что мешает добавить push\pop es ?
    http://www.wasm.ru/forum/viewtopic.php?pid=86928#p86928
    http://www.wasm.ru/forum/viewtopic.php?pid=219558#p219558
     
  9. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    с памятью HMA я разобрался просто и гениально :)
    Единственный ньюанс что bochs не поддерживает в должной мере эту область (например при запись в нее происходит зависание).
     
  10. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Y_Mur
    Как скопировать теневой регистр из fs в es? Помойму это невозможно без перевхода в защищенный режим, а оно занимает много тактов процессора.
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    NoName
    В той статье про унреал:
    Так что можешь не обращать внимания на теневую часть регистра, которая в твоей задаче совершенно не нужна, а оперировать сегментными регистрами как обычно в дос. Это не позволит перенести начало сегмента за пределы 1Мб, ну и ничего страшного ты же и так можешь адресовать 4Гб + 1Мб :)

    ЗЫ: я уже плохо помню свои опусы в унреале, но вроде бы так тогда и делал.
     
  12. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Здорово конечно, но никто не дает гарантии что так на всех процессорах. Пойду попробую.
     
  13. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    похоже что на geode такая тема не катит
     
  14. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Гружу правильно (начиная с адреса FFFF:0100) com подпрограмму в HMA (64кб сверху). Она состовляет основную программу, я просто копирую одну процедуру, т.к. она базо независима. Передаю управление, она выполняется корректно (звуковой цикл, типо мелодии). Управление ей передаю с помощью
    Код (Text):
    1. push FFFFh
    2. push 100
    3. retf
    Затем из нее передаю управление в другой модуль с помощью
    Код (Text):
    1. push edx
    2. retf
    Управление передается, но модуль функционирует неправильно. Происходит либо перезагрузка либо жесткое зависание.

    Тогда я делаю в подпрограмме вызов:
    Код (Text):
    1. org 100h
    2. ...
    3. push 0FFFFh
    4. push offset go_beep
    5. retf
    "go_beep Near DGROUP:012C"

    И она виснет!!!
    Винт отключен, флешка отключена. Загрузка происходит из внутренней памяти. После записи подпрограммы происходит проверка правильно ли она записана, так что искажение кода тут врятли. Видимо при каких то условиях переходы перестают работать.
    Пробовал не грузить в сегментные регистры ss,ds,es последний сегмент, эффект остается. Это из за загрузки в cs?
    Можно ли это как то победить?
    Не думал что так получится :dntknw:

    В доках на gx1 слово hma вообще не встречается.
     
  15. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    нашел ошибку, компилятор смещение неправильное подставляет.
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Когда я давно игрался с унреалом у меня даже инета не было и действовал методом научного тыка - нельзя, но очень хочется - щас попробую - ура получилось :))
    И только потом я узнал, что это был подарок от моего bios который после post выходил в unreal.
    Теперь у меня bios таких подарков не делает, но пошаманив над кодом из той статьи вроде удалось получить практически тоже самое - сегментные регистры ds, es, fs, gs можно свободно менять как обычно в dos, при этом их унреальная функциональность полностью сохраняется, а любое значение занесённое в них как и положено *16 и прибавляется к смещению не зависимо от того 16 или 32 битное это смещение.
    Единственная тонкость - таблицу GDT нельзя затирать, поэтому если разделить переход в унреал и его использование по разным программам, то придётся позаботиться об её сохранности (или пусть каждая программа создаёт и регистрирует свою GDT, тогда затирание чужой уже не вредит унреалу ;).

    Прога (на tasm) переходит в унреал, заливает экран через LFB синим цветом, используя rep stosd, затем es восстанавливается из стека и продолжает использоваться как обычно в dos :)


    ЗЫ: кто ещё захочет поэкспериментировать - не забываем что унреал любит настоящее железо, а не эмулированное, особенно виндой :))
     
  17. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Все почти работает.
    У меня есть старый загрузчик которым я гружу такой же автономный модуль что и новым.
    Старый не использует HMA. Я добавляю в него для проверки очистку всех регистров кроме sp,bp,ss,ds,cs. Грузится нормально. Я включаю в нем a20, грузится нормально (там довольно сложная система в загружаемом коде). Как только я делаю стек в hma с теми же параметрами то ловлю красный экран с мигающими линиями.
    При передаче управления с помощью
    Код (Text):
    1. db 09ah
    2. offset dw ?; жестко прописанные
    3. segment dw ?;адреса
    Точка входа индентична точке входа которую показывает старый загрузчик. Параметры передаются гарантированно правильно (есть проверочный мини модуль который отрабатывает передачу управления нормально, показывает все параметры и делает возврат обратно, там звуковой сигнал в hma, он тоже отрабатывает; он только меньше по размеру и функциональности). Результат передачи управления новым загрузчиком - зависон (есть индикация что управление передалось но где то в самом начале работы произошло нечто необъяснимое).
    Буду рад за идеи. Мне сложно понять в чем дело.
     
  18. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    покажи как переносишь стек в hma - думаю дело в нём
     
  19. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Код (Text):
    1. in al,92h
    2. or al,2
    3. out 92h,al
    4. mov ax,0xFFFF
    5. mov ss,ax
    6. mov sp,0FFF0h
    7. mov bp,sp
    Естественно прерывания запрещены. Также я делаю стек в новом загрузчике перед передачей управления в hma. Во втором загрузчике правда a20 открывается гораздо раньше.
     
  20. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    вот еще забыл написать. Если я вызываю новым загрузчиком его подпрограмму запуска в hma и делаю там сразу retf то потом происходит возврат в дос и с ним все нормально внешне, т.е. команды выполняет, все работает.