Как DOS загружает программу в память?

Какие шаги выполняет MS-DOS для загрузки COM файла или EXE файла в память? Есть ли еще ссылки в Интернете о том, как это происходит? Лучшее, о чем я могу думать, возможно, относится к источнику dosbox.

Ответ 1

Когда command.com будет предложено выполнить файл .com или .exe, он вызовет службу прерывания 21h/AH = 4B, службу EXEC. Для вызывающей программы зависит:

  • постройте блок параметров DOS EXEC (см. http://www.delorie.com/djgpp/doc/rbinter/it/90/15.html) (включает информацию о переменных среды, аргументах командной строки, FCB и значениях регистров при возврате).
  • освободить всю память, вызывающая программа не использует
  • настройки вызывающих аргументов
    • ah = 4Bh (тип сервиса 'EXEC')
    • al = 00h (функция "загрузить и выполнить" )
    • ds: dx → имя программы
    • es: bx → ptr для блока параметров exec
  • прерывание вызова 21h
  • в ответ reset указатель стека и проверка ошибок.

Когда вызывается прерывание 21h (здесь, где он становится туманным для меня):

  • выделен выделенный блок памяти
  • расширение файла игнорируется, вместо этого DOS проверяет первые два байта файла подписи "MZ" или "ZM", если EXE, и нет подписи для COM.

для exe:

  • Заголовок exe считывается для начальных значений регистра
  • раздел кода копирования из exe в память
  • таблица перемещений (см. http://en.wikipedia.org/wiki/Relocation_table) читается и дальние указатели настраиваются в памяти
  • значения регистра установки
  • перейти к CS: IP → точка входа (определенная в заголовке exe, относительно начала программы)

для com:

  • скопировать весь файл .com в память
  • значения регистра установки
    • AL, AH статус буквы письма
    • CS, DS, ES, SS → сегмент PSP
    • SP = смещение последнего слова, доступного в первом сегменте 64k
  • перейти к IP = 100h

Теперь программа должна выполняться.


Примечания:

В документе Microsoft KB "Порядок приоритета при поиске исполняемых файлов" в нем упоминается использование функции MS-DOS EXEC (прерывание 21h service 4Bh) "для выполнения файлов .com и .exe http://support.microsoft.com/kb/35284

Итак, мы можем посмотреть список прерываний Ralph Brown на Int 21/AH = 4Bh

и пример использования:

и формат заголовка dos exe:

(это основано на некоторых поисковых системах, поэтому, пожалуйста, не стесняйтесь добавлять предложения)