Как DOS загружает программу в память? - PullRequest
13 голосов
/ 15 сентября 2010

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

1 Ответ

19 голосов
/ 16 сентября 2010

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

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

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

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

для exe:

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

для ком:

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

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


Примечания:

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

Итак, мы можем посмотреть список прерываний Ральфа Брауна в Int 21 / AH = 4Bh

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

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

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

...