На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Переключение между процессами
    Возможно ли сделать в DOS программу-резидент, которая позволяла бы
    переключать между собой хотя бы два параллельных процесса. Я не о
    многозадачности, а просто о переключении, допустим нажатием "Alt-Tab" ?

    Возможно ли сделать это так (после того как нажаты Alt-Tab) :
    1). резидент перехватил комбинацию Alt-Tab;
    2). определил регистры CS:IP (выполняющаяся какая-либо в данный момент
                   программа) и сохранил их;
    3). сохранил где-нибудь код выполняющийся программы, начиная с текущего
        CS:IP до, допустим, CS:[IP+200h];
    4). записал по этому адресу код, выполняющий EXEC, вклющающий корректировку
        стека, выделение памяти программе-потомку и вызов 4bh(21h).
    5). передал управление стандарт.обработчику;
    6). теперь выполняется код, который был записан, т.е. запуск, допстим,
          COMMAND.COM;
    7). идёт обычная работа, если выходим из программы-потомка, то управление
       передаётся прерванной программе:  после того, как восстановим DTA
       и стек программы-родителя, то восстановим из памяти то, что раньше
       сохранили (см. пункт 2 и 3);



    Cкажите, будет ли работать такая фигня или операционная система не позволит ?
    Если нет - то почему, если да - как бы это всё улучшить, оптимизировать ?
    Спасибо !
      На мой взгляд, нереально! За процессор сохранять контекст задачи (все регистры, стек), самому восстанавливать. На мой взгляд даже с контрольной точкой уже будут проблемы. Короче, утопия! Но это на мой взгляд!
        Если заюзать защищённый режим, то запросто.
          Как ?
          Объясните неграмотному, чем здесь может помочь перевод в защищённый
          режим.
          Я знаю пока про защищённый режим только то что
          - это позволяет адресовать больше памяти
          - программам назначаются какие-то уровни доступа (кольца какие-то)
          - ... и всё , дальше я не знаю  :-[ :-[

          Разве это можно всё использовать в данном случае ? А как ?
            Это слишком будет длинный разговор... Лучше почитай книжку Фроловых "Защищенный режим процессоров Intel 80286/80386/80486" (Том 6). В книжке очень много ошибок, но зато проста для понимания.
            А для твоего случая это неприменимо. Твоя программа работает в режиме V86, где очень многие команды защищенного режима недействительны.
            То что ты хочешь сделать, теоретически возможно, но практически вряд ли. Прервать еще как-то можно, поставив контрольную точку int 3 (0ССh), сохранить все регистры, стек в обработчике int 3, затем восстановить все, но это все не так просто и у меня сплошные сомнения... Стоит ли овчинка выделки?
              Нашёл эту книжку.  :) Начало обещает быть хорошим (там есть и примеры на С++
              и на асме  :) ), а я ещё раз убедился в том, что многово не знаю.  :(
              ...хотя меня пока не совсем оставила оставила надежда насчёт "переключения процессов", вряд ли наверное, получится, но хотяб поучусь, как говориться, на
              своих ошибках  :)
                В защищённом режиме можно вообще сотворить несколько абсолютно независимых ДОС-сессий. Эдакие виртуальные машины, между которыми можно переключатся. Как консоли в Линухе.
                  Прочитал полностью книгу про защищённый режим процессоров. Было всё
                  нормально, нонятно, но... знаете как это бывает... большой объём
                  информации сразу и легко запутаться... Вобщем, чё я оправдываюсь,
                  так и скажи, что тормоз. Короче, такой у меня идиотский вопрос:
                  с реальным режимом всё понятно - программа, например, даёт команду
                  JMP <segment:offset>. Далее, например, переводим, процессор в защищённый
                  режим. Теперь программа, наверное, будет выдавать на этом месте команду
                  JMP <selector+TI+RTL :offset>. Но откуда, откуда она возьмёт селектор ?
                  Откуда она должна знать, в каком ей кольце работать, какую таблицу
                  дескрипторов использовать ? Я надеюсь, я хоть правильно сформулировал
                  вопрос. Запутался блин :(
                  Сообщение отредактировано: Ilyia -
                    Не мучайся, Илья, всё гораздо проще!!!

                    Запускаешь свою (TSR) программу.
                    Нажимаешь Hotkey, прога её перехватывает. Дальше Int 28 или Int 8 (с проверкой InDOS Flag) сохраняет регистры, всю память с адреса после своей проги до конца DOS-памяти + видеопамять :) , а затем запускает (или восстанавливает из файла) другую прогу....
                    Только, вот я не знаю, что будет, если придётся переключаться из проги, работающей в защищённом режиме или написанную, например, на TMT Pascal'е..... ;D
                      Это, конечно, будет работать намного глючнее, чем через защищённым режим, но ИМХО проще реализуется (правда, я не пробовал :)).
                        Вот и я уже понял, что здесь TSR & RMode - без перспектив. Так что, Eugene,
                        не всё так просто :)
                          А линух не использует механизмы процессора Intel для переключения задач !!! (то бишь ручками настраивает CS:EIP и др. регистры ). Ну разве что регистр задачи TR и то только для того, чтобы при системном вызове (int 80h) сменить стек 3 кольца на стек 0 кольца. Это работает быстрее, чем JMP или CALL.
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0434 ]   [ 15 queries used ]   [ Generated: 27.04.24, 11:14 GMT ]