Какие шаги выполняет MS-DOS для загрузки COM файла или EXE файла в память? Есть ли еще ссылки в Интернете о том, как это происходит? Лучшее, о чем я могу думать, возможно, относится к источнику dosbox.
Как DOS загружает программу в память?
Ответ 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) читается и дальние указатели настраиваются в памяти
- значения регистра установки
- AL, AH статус буквы письма
- DS, ES → сегмент PSP (см. http://en.wikipedia.org/wiki/Program_Segment_Prefix)
- SS: SP → указатель стека (определенный в заголовке exe)
- перейти к 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
- http://www.cs.cmu.edu/~ralf/files.html
- Int 21/AH = 4Bh http://www.delorie.com/djgpp/doc/rbinter/id/51/29.html
- Int 21/AH = 4Bh http://www.ctyme.com/intr/rb-2939.htm
и пример использования:
- Art of Assembly/19.1.1.1 Load and Execute http://webster.cs.ucr.edu/AoA/DOS/ch19/CH19-1.html#HEADING1-10
и формат заголовка dos exe:
(это основано на некоторых поисковых системах, поэтому, пожалуйста, не стесняйтесь добавлять предложения)