COM-файл
Эта статья нуждается в дополнительных цитатах для проверки . ( февраль 2009 г. ) |
Расширение имени файла |
.С |
---|---|
Тип интернет-СМИ | приложение/x-dosexec |
Тип формата | Исполняемый файл |
Распространено на | Исполняемый файл DOS MZ |
— COM-файл это тип простого исполняемого файла . В Digital Equipment Corporation (DEC) VAX операционных системах 1970-х годов: .COM
использовался как расширение имени файла для текстовых файлов, содержащих команды, которые должны быть выданы операционной системе (аналогично пакетному файлу ). [1] С появлением Digital Research ) компании CP/M ( операционной системы для микрокомпьютеров тип файлов, обычно ассоциируемый с расширением COM, изменился на тип исполняемых файлов. Позднее это соглашение было перенесено в DOS . Даже если их дополнить более общим EXE форматом файлов для исполняемых файлов, компактные файлы COM остаются жизнеспособными и часто используются в DOS.
The .COM
Расширение имени файла не имеет никакого отношения к .com имени интернет-домена верхнего уровня (для «коммерческого»). Однако это сходство в названии было использовано авторами вредоносных программ .
Бинарный формат DOS [ править ]
Формат COM — это исходный двоичный формат исполняемого файла, используемый в CP/M (включая SCP и MSX-DOS ), а также в DOS . Это очень просто; у него нет заголовка (за исключением файлов CP/M 3), [2] и не содержит стандартных метаданных , а только код и данные. За эту простоту приходится платить: двоичного файла максимальный размер составляет 65 280 (FF00 h ) байт (256 байт меньше 64 КБ) и весь код и данные хранятся в одном сегменте .
Поскольку ему не хватает информации о перемещении , он загружается операционной системой по заранее установленному адресу, по смещению 0100h, сразу после PSP , где он выполняется (отсюда и ограничение размера исполняемого файла): точка входа фиксируется на 0100h. [номер 1] Это не было проблемой на 8-битных машинах, поскольку они могут адресовать максимум 64 КБ памяти, но 16-битные машины имеют гораздо большее адресное пространство, поэтому этот формат вышел из употребления.
В архитектуре процессора Intel 8080 можно было адресовать только 65 536 байт памяти (диапазон адресов от 0000h до FFFFh). В CP/M первые 256 байт этой памяти, от 0000h до 00FFh, были зарезервированы для использования системой нулевой страницей , и любая пользовательская программа должна была быть загружена точно в 0100h, чтобы быть выполненной. [номер 1] COM-файлы идеально подходят для этой модели. До появления MP/M и Concurrent CP/M не было возможности запуска более одной программы или команды одновременно: запускалась программа, загруженная в 01:00h, и никакая другая.
Хотя формат файлов в DOS и CP/M одинаков, файлы .COM для этих двух операционных систем несовместимы; COM-файлы DOS содержат инструкции x86 DOS и, возможно, системные вызовы , тогда как COM-файлы CP/M содержат инструкции 8080 и системные вызовы CP/M (программы, ограниченные определенными машинами, также могут содержать дополнительные инструкции для 8085 или Z80 ).
Файлы .COM в DOS устанавливают для всех регистров сегмента x86 одинаковое значение, а для регистра SP (указателя стека) — смещение последнего слова, доступного в первом сегменте размером 64 КБ (обычно FFFEh), или максимальный размер памяти, доступной в блоке. программа загружается в оба, программа плюс стек размером не менее 256 байт, в зависимости от того, что меньше, таким образом, стек начинается с самого верха соответствующего сегмента памяти и работает оттуда вниз. [3] [4]
В исходном API DOS 1.x , который был производным от API CP/M, программное завершение файла .COM выполнялось путем вызова функции INT 20h (Завершить программу) или же INT 21h Function 0, которая обслуживала с той же целью, и программист также должен был гарантировать, что регистры сегментов кода и данных содержат одно и то же значение при завершении программы, чтобы избежать потенциального сбоя системы. Хотя это можно было использовать в любой версии DOS, Microsoft рекомендовала использовать INT 21h Function 4Ch для завершения программы, начиная с DOS 2.x, что не требовало установки одного и того же значения для сегмента данных и кода.
Можно создать файл .COM для работы в обеих операционных системах в виде толстого двоичного файла . Настоящей совместимости на уровне инструкций не существует; инструкции в точке входа выбираются так, чтобы они были одинаковыми по функциональности, но разными в обеих операционных системах, и выполнение программы переходит к разделу, соответствующему используемой операционной системе. По сути, это две разные программы с одинаковыми функциями в одном файле, которым предшествует код, выбирающий ту, которую нужно использовать.
В CP/M 3, если первый байт COM-файла равен C9h, заголовок имеет длину 256 байт; [2] поскольку C9h соответствует 8080 инструкции RET
, это означает, что COM-файл будет немедленно завершен, если он будет запущен в более ранней версии CP/M, которая не поддерживает это расширение. (Поскольку наборы инструкций 8085 и Z80 являются расширенными наборами команд 8080, это работает на всех трех процессорах.) C9h — недопустимый код операции на 8088/8086, и он вызовет генерируемое процессором исключение прерывания 6 в v86. режим на чипах x86 386 и более поздних версиях. Поскольку C9h является кодом операции для LEAVE начиная с 80188/80186 следовательно , и , не используется в качестве первой инструкции в допустимой программе, исполняемый загрузчик в некоторых версиях DOS отклоняет COM-файлы, начинающиеся с C9h, избегая сбоя.
Файлы могут иметь имена, заканчивающиеся на .COM, но не в простом формате, описанном выше; на это указывает магическое число в начале файла. Например, файл COMMAND.COM в DR DOS 6.0 на самом деле имеет исполняемый формат DOS, о чем свидетельствуют первые два байта MZ (4Dh 5Ah), инициалы Марка Збиковски .
Большие программы [ править ]
В DOS или среда выполнения не обеспечивают управление памятью для COM-файлов загрузчик . Вся память просто доступна для COM-файла. командная оболочка операционной системы COMMAND.COM После выполнения перезагружается . Это оставляет возможность того, что COM-файл может быть либо очень простым, используя один сегмент , либо сколь угодно сложным, предоставляя свою собственную систему управления памятью. Примером сложной программы является COMMAND.COM, оболочка DOS, предоставляющая загрузчик для загрузки других программ COM или EXE . В системе .COM можно загружать и запускать программы большего размера (в пределах доступного объема памяти), но загрузчик системы предполагает, что весь код и данные находятся в первом сегменте, и программа .COM должна предоставить все необходимые данные. дальнейшая организация. Программы, размер которых превышает доступную память, или большие сегменты данных , могут обрабатываться посредством динамической компоновки , если необходимый код включен в программу .COM. Преимущество использования формата .COM, а не .EXE, заключается в том, что двоичный образ обычно меньше по размеру и его легче программировать с помощью ассемблер . [5] Как только стали доступны компиляторы и компоновщики достаточной мощности, использовать формат .COM для сложных программ стало невыгодно.
Поддержка платформы [ править ]
Формат по-прежнему исполняется на многих современных Windows NT на базе платформах , но он запускается в MS-DOS подсистеме, эмулирующей , NTVDM , которая отсутствует в 64-битных вариантах. COM-файлы также могут выполняться на эмуляторах DOS, таких как DOSBox , на любой платформе, поддерживаемой этими эмуляторами.
Используйте из соображений совместимости [ править ]
Операционные системы на базе Windows NT используют расширение .com для небольшого количества команд, перенесенных со времен MS-DOS, хотя на самом деле в настоящее время они реализованы в виде .exe файлов . Операционная система распознает заголовок файла .exe и правильно выполнит его, несмотря на его технически неправильное расширение .com. (Фактически любой файл .exe можно переименовать в .com и при этом выполняться корректно.) Использование исходных расширений .com для этих команд обеспечивает совместимость со старыми пакетными файлами DOS, которые могут ссылаться на них с их полными исходными именами. Эти команды CHCP
, DISKCOMP
, DISKCOPY
, FORMAT
, MODE
, MORE
и TREE
. [6]
Предпочтение исполнения [ править ]
В DOS, если каталог содержит как COM-файл, так и EXE- файл с одинаковым именем, то, когда расширение не указано, для выполнения предпочтительно выбирается COM-файл. Например, если каталог в системном пути содержит два файла с именем foo.com
и foo.exe
, будет выполнено следующее foo.com
:
C:\>foo
Пользователь, желающий запустить foo.exe
можно явно использовать полное имя файла:
C:\>foo.exe
Воспользовавшись этим поведением по умолчанию, авторы вирусов и другие вредоносные программисты использовали такие имена, как notepad.com
для своих творений, надеясь, что, если он будет помещен в тот же каталог, что и соответствующий EXE-файл, команда или пакетный файл может случайно запустить их программу вместо текстового редактора. notepad.exe
. Опять же, эти файлы .com на самом деле могут содержать исполняемый файл формата .exe.
В Windows NT и ее производных ( Windows 2000 , Windows XP , Windows Vista и Windows 7 ) Переменная PATHEXT используется для переопределения порядка предпочтений (и допустимых расширений) для вызова файлов без указания расширения в командной строке. Значение по умолчанию все еще остается .com
файлы раньше .exe
файлы. Это очень похоже на функцию, ранее встречавшуюся в линейке процессоров расширенной командной строки JP Software 4DOS , 4OS2 и 4NT .
Злонамеренное использование расширения .com [ править ]
Некоторые авторы компьютерных вирусов надеялись воспользоваться вероятным незнанием современных пользователей компьютеров Расширение файла .com и связанный с ним двоичный формат, а также их более вероятное знакомство с именем интернет-домена .com . Электронные письма были отправлены с именами вложений, похожими на «www.example.com». Неосторожные пользователи Microsoft Windows , щелкнув такое вложение, будут ожидать, что начнут просматривать сайт с именем http://www.example.com/
, но вместо этого запустит прикрепленный двоичный командный файл с именем www.example
, давая ему полное разрешение делать со своей машиной все, что задумал его автор. [ нужна ссылка ]
В самом формате файла COM нет ничего вредоносного; это использование случайного конфликта имен между командными файлами .com и коммерческими веб-сайтами .com .
См. также [ править ]
- ДВА API
- CMD-файл (CP/M)
- Сравнение форматов исполняемых файлов
- Жирный двоичный файл
- Исполняемое сжатие
Примечания [ править ]
- ↑ Перейти обратно: Перейти обратно: а б В большинстве версий CP/M начало TPA было по смещению +100h, которому в памяти предшествовала только нулевая страница по смещению +0h. Некоторые версии различались по аппаратным причинам, включая CP/M для Heath H89 , где он начинался со смещением +4300h (для совместимости существовала аппаратная модификация Magnolia Microsystems, позволяющая отображать ПЗУ через +100h после запуска), или CP/M для TRS-80 Model I и TRS-80 Model III , где программы загружались со смещением +0h.
Ссылки [ править ]
- ^ Кристиан, Брайан; Марксон, Том; Скрента, Рич (ред.). «Раздел 5.3». Руководство по PDP-11 (первая редакция). Архивировано из оригинала 01 августа 2018 г. Проверено 01 августа 2018 г. (Примечание. Содержит ссылку на операционную систему RT-11 , работающую на миникомпьютере PDP-11 , где в разделе 5.3 показано, что .COM используется для ссылки на командный файл.)
- ↑ Перейти обратно: Перейти обратно: а б Эллиотт, Джон К.; Лопушинский, Джим (2002) [11 апреля 1998]. «Заголовок COM-файла CP/M 3» . Seasip.info . Архивировано из оригинала 01 августа 2018 г.
- ^ Пол, Матиас Р. (07.10.2002) [2000]. «Re: Запуск COM-файла» . Группа новостей : alt.msdos.programmer . Архивировано из оригинала 3 сентября 2017 г. Проверено 3 сентября 2017 г. [1] (Примечание. Содержит подробную информацию о соглашениях о вызовах программ DOS COM.)
- ^ Лант, Бенджамин «Бен» Д. (2020). «Регистры запуска DOS .COM» . Вечно молодое программное обеспечение . Архивировано из оригинала 12 ноября 2020 г. Проверено 14 декабря 2021 г.
- ^ Скэнлон, Лео Дж. (1991). «Глава 2». Подпрограммы языка ассемблера для MS-DOS (2-е изд.). Книги Виндкреста. п. 16. ISBN 0-8306-7649-Х .
- ^ «Команды Windows» . Майкрософт. 26 апреля 2023 г.