Толстый двоичный файл (или двоичный файл с несколькими архитектурами ) — это исполняемая компьютерная программа или библиотека , которая была расширена (или «раздута») кодом, родным для нескольких наборов инструкций , которые, следовательно, могут быть запущены на нескольких типах процессоров. [1] Это приводит к файлу большего размера, чем обычный двоичный файл с одной архитектурой, отсюда и название.
Обычный метод реализации заключается в том, чтобы включить версию машинного кода для каждого набора инструкций, которому предшествует одна точка входа с кодом, совместимым со всеми операционными системами, которая выполняет переход к соответствующему разделу. Альтернативные реализации хранят различные исполняемые файлы в разных ветвях , каждая из которых имеет собственную точку входа, которая напрямую используется операционной системой.
Использование толстых двоичных файлов не распространено в программном обеспечении операционных систем ; существует несколько альтернатив для решения той же проблемы, например, использование программы- установщика для выбора двоичного файла, специфичного для архитектуры, во время установки (например, с несколькими APK-файлами Android ), выбор двоичного файла, специфичного для архитектуры, во время выполнения (например, с объединенными каталогами Plan 9 иGNUstep fat bundles), [2] [3] распространение программного обеспечения в виде исходного кода и его компиляция на месте или использование виртуальной машины (например, Java ) и компиляция «на лету» .
В 1988 году Domain/OS SR10.1 компании Apollo Computer представила новый тип файла «cmpexe» (составной исполняемый файл), который объединял двоичные файлы для исполняемых файлов Motorola 680x0 и Apollo PRISM . [4]
Схема fat-binary сгладила переход Apple Macintosh , начавшийся в 1994 году, с микропроцессоров 68k на микропроцессоры PowerPC . Многие приложения для старой платформы работали прозрачно на новой платформе в рамках развивающейся схемы эмуляции , но эмулируемый код обычно работал медленнее, чем собственный код. Приложения, выпущенные как «fat binary», занимали больше места на диске, но они работали на полной скорости на любой платформе. Это было достигнуто путем упаковки как 68000- скомпилированной версии, так и скомпилированной PowerPC версии одной и той же программы в их исполняемые файлы. [5] [6] Старый код 68K (CFM-68K или классический 68K) продолжал храниться в ветви ресурсов , в то время как новый код PowerPC содержался в ветви данных в формате PEF . [7] [8] [9]
Двоичные файлы Fat были больше, чем программы, поддерживающие только PowerPC или 68k, что привело к созданию ряда утилит, которые удаляли ненужные версии. [5] [6] В эпоху небольших жестких дисков , когда жесткие диски объемом 80 МБ были обычным размером, эти утилиты иногда были полезны, поскольку программный код, как правило, занимал большую часть общего использования диска, а удаление ненужных членов двоичного файла Fat освобождало значительный объем места на жестком диске.
Бинарные файлы Fat были функцией операционной системы NeXT NeXTSTEP / OPENSTEP , начиная с NeXTSTEP 3.1. В NeXTSTEP они назывались «Мультиархитектурными двоичными файлами». Бинарные файлы Multi-Architecture изначально предназначались для того, чтобы позволить программному обеспечению компилироваться для запуска как на оборудовании NeXT Motorola 68k, так и на ПК на базе Intel IA-32, работающих под управлением NeXTSTEP, с одним двоичным файлом для обеих платформ. [10] Позднее он использовался для того, чтобы приложения OPENSTEP могли запускаться на ПК и различных платформах RISC, поддерживаемых OPENSTEP. Бинарные файлы Multi-Architecture находятся в специальном архивном формате, в котором один файл хранит один или несколько подфайлов Mach-O для каждой архитектуры, поддерживаемой двоичным файлом Multi-Architecture. Каждый двоичный файл Multi-Architecture начинается со структуры ( ), содержащей два беззнаковых целых числа. Первое целое число («magic») используется как магическое число для идентификации этого файла как Fat Binary. Второе целое число ( nfat_arch ) определяет, сколько файлов Mach-O Files содержит архив (сколько экземпляров одной и той же программы для разных архитектур). После этого заголовка следует nfat_arch количество структур fat_arch ( ). Эта структура определяет смещение (от начала файла), по которому следует найти файл, выравнивание, размер, а также тип и подтип ЦП, на которые нацелен двоичный файл Mach-O (внутри архива).struct fat_header
struct fat_arch
Версия GNU Compiler Collection , поставляемая с Developer Tools, могла кросс-компилировать исходный код для различных архитектур, на которых NeXTStep мог работать. Например, можно было выбирать целевые архитектуры с несколькими опциями '-arch' (с архитектурой в качестве аргумента). Это был удобный способ распространения программы для NeXTStep, работающей на различных архитектурах.
Также можно было создавать библиотеки (например, с помощью libtool NeXTStep ) с различными целевыми объектными файлами.
Apple Computer приобрела NeXT в 1996 году и продолжила работать с кодом OPENSTEP. Mach-O стал собственным форматом объектных файлов в бесплатной операционной системе Darwin от Apple (2000) и Mac OS X от Apple (2001), а Multi-Architecture Binaries от NeXT продолжали поддерживаться операционной системой. В Mac OS X Multi-Architecture Binaries могут использоваться для поддержки нескольких вариантов архитектуры, например, для оптимизации различных версий 32-битного кода для поколений процессоров PowerPC G3 , PowerPC G4 и PowerPC 970. Его также можно использовать для поддержки нескольких архитектур, таких как 32-битная и 64-битная PowerPC, или PowerPC и x86 , или x86-64 и ARM64 . [11]
В 2005 году Apple объявила о другом переходе — с процессоров PowerPC на процессоры Intel x86 . Apple способствовала распространению новых приложений, которые изначально поддерживали как PowerPC, так и x86, используя исполняемые файлы в формате Multi-Architecture Binary. [12] Apple называет такие программы « универсальными приложениями » и называет формат файла « универсальным двоичным », возможно, чтобы отличить этот новый переход от предыдущего перехода или других вариантов использования формата Multi-Architecture Binary.
Универсальный двоичный формат не был необходим для прямой миграции уже существующих собственных приложений PowerPC; с 2006 по 2011 год Apple поставляла Rosetta , динамический двоичный транслятор PowerPC (PPC)-to-x86 , для выполнения этой роли. Однако Rosetta имела довольно высокие накладные расходы на производительность, поэтому разработчикам было предложено предлагать как двоичные файлы PPC, так и Intel, используя универсальные двоичные файлы. Очевидная стоимость универсального двоичного файла заключается в том, что каждый установленный исполняемый файл больше, но за годы, прошедшие с момента выпуска PPC, место на жестком диске значительно превзошло размер исполняемого файла; в то время как универсальный двоичный файл может быть вдвое больше одноплатформенной версии того же приложения, ресурсы свободного пространства обычно затмевают размер кода, что становится незначительной проблемой. Фактически, часто универсальное двоичное приложение будет меньше, чем два одноархитектурных приложения, поскольку программные ресурсы могут использоваться совместно, а не дублироваться. Если требуются не все архитектуры, можно использовать приложения командной строки lipo и ditto для удаления версий из образа двоичного файла с несколькими архитектурами, тем самым создавая то, что иногда называют тонким двоичным файлом .
Кроме того, исполняемые файлы Multi-Architecture Binary могут содержать код как для 32-разрядных, так и для 64-разрядных версий PowerPC и x86, что позволяет поставлять приложения в форме, поддерживающей 32-разрядные процессоры, но использующей большее адресное пространство и более широкие пути передачи данных при запуске на 64-разрядных процессорах.
В версиях среды разработки Xcode с 2.1 по 3.2 (работающих на Mac OS X 10.4 — Mac OS X 10.6 ) Apple включила утилиты, которые позволяли нацеливать приложения как на архитектуру Intel, так и на PowerPC; универсальные двоичные файлы в конечном итоге могли содержать до четырех версий исполняемого кода (32-бит PowerPC, 32-бит x86, 64-бит PowerPC и 64-бит x86 ). Однако поддержка PowerPC была удалена из Xcode 4.0 и поэтому недоступна разработчикам, работающим на Mac OS X 10.7 или выше.
В 2020 году Apple объявила об очередном переходе , на этот раз с процессоров Intel x86 на Apple Silicon (архитектура ARM64). Чтобы сгладить переход, Apple добавила поддержку двоичного формата Universal 2 ; двоичные файлы Universal 2 представляют собой двоичные файлы Multi-Architecture, содержащие исполняемый код как x86-64, так и ARM64, что позволяет двоичному коду работать изначально как на 64-разрядных процессорах Intel, так и на 64-разрядных процессорах Apple Silicon. Кроме того, Apple представила динамическую двоичную трансляцию Rosetta 2 для набора инструкций x86 в Arm64, чтобы пользователи могли запускать приложения, не имеющие универсальных двоичных вариантов.
В 2006 году Apple перешла с PowerPC на процессоры Intel и заменила Open Firmware на EFI . Однако к 2008 году некоторые из их Mac использовали 32-битный EFI, а некоторые — 64-битный EFI. По этой причине Apple расширила спецификацию EFI «толстыми» двоичными файлами, которые содержали как 32-битные, так и 64-битные двоичные файлы EFI. [13]
Исполняемые файлы CP/M-80 , MP/M-80 , Concurrent CP/M , CP/M Plus , Personal CP/M-80 , SCP и MSX-DOS для семейств процессоров Intel 8080 (и Zilog Z80 ) используют то же расширение файла .COM , что и совместимые с DOS операционные системы для двоичных файлов Intel 8086. [примечание 1] В обоих случаях программы загружаются по смещению +100h и выполняются путем перехода к первому байту в файле. [14] [15] Поскольку коды операций двух семейств процессоров несовместимы, попытка запустить программу в неправильной операционной системе приводит к некорректному и непредсказуемому поведению.
Чтобы избежать этого, были разработаны некоторые методы для создания толстых двоичных файлов, которые содержат как программу CP/M-80, так и программу DOS, которым предшествует начальный код, который правильно интерпретируется на обеих платформах. [15] Методы либо объединяют две полностью функциональные программы, каждая из которых построена для своей соответствующей среды, либо добавляют заглушки , которые заставляют программу корректно завершать работу, если она запущена на неправильном процессоре. Чтобы это работало, первые несколько инструкций (иногда также называемые заголовками гаджетов [16] ) в файле .COM должны быть допустимым кодом как для процессоров 8086, так и для процессоров 8080, что приведет к тому, что процессоры будут разветвляться в разных местах внутри кода. [16] Например, утилиты в эмуляторе Симеона Крэна MyZ80 начинаются с последовательности кодов операций EBh, 52h, EBh . [17] [18] 8086 видит это как переход и считывает следующую инструкцию со смещения +154h, тогда как 8080 или совместимый процессор проходит напрямую и считывает следующую инструкцию со смещения +103h. Похожая последовательность, используемая для этой цели, — EBh, 03h, C3h . [19] [20] FATBIN Джона К. Эллиотта [21] [22] [23] — это утилита для объединения CP/M-80 и файла DOS .COM в один исполняемый файл. [17] [24] Его производная от оригинального PMsfx модифицирует архивы, созданные PMarc Ёсихико Мино, чтобы они были самораспаковывающимися как в CP/M-80, так и в DOS, начиная с EBh, 18h, 2Dh, 70h, 6Dh, 73h, 2Dh, а также включает сигнатуру "-pms-" для самораспаковывающихся архивов PMA , [25] [17] [24] [18] тем самым также представляя форму исполняемого кода ASCII .
Другой метод предотвращения ошибочного выполнения .COM-программ в DOS-совместимой операционной системе для машин CP/M-80 и MSX-DOS [15] заключается в запуске кода 8080 с C3h, 03h, 01h , который декодируется как инструкция "RET" процессорами x86, тем самым изящно выходя из программы, [nb 2] в то время как он будет декодирован как инструкция "JP 103h" процессорами 8080 и просто перейдет к следующей инструкции в программе. Аналогично, ассемблер CP/M Z80ASM+ от SLR Systems будет отображать сообщение об ошибке при ошибочном запуске в DOS. [17]
Некоторые файлы CP/M-80 3.0 .COM могут иметь один или несколько оверлеев RSX, прикрепленных к ним GENCOM . [26] Если это так, они начинаются с дополнительного заголовка размером 256 байт (одна страница ). Чтобы указать это, первый байт в заголовке устанавливается в магический байт C9h , который работает как сигнатура, идентифицирующая этот тип файла COM для исполняемого загрузчика CP/M 3.0 , а также как инструкция "RET" для 8080-совместимых процессоров, которая приводит к корректному выходу, если файл выполняется в старых версиях CP/M-80. [nb 2]
C9h никогда не подходит в качестве первого байта программы для любого процессора x86 (он имеет разное значение для разных поколений, [примечание 3] но никогда не является значимым первым байтом); исполняемый загрузчик в некоторых версиях DOS отклоняет COM-файлы, которые начинаются с C9h , избегая некорректной работы.
Аналогичные перекрывающиеся последовательности кодов были также разработаны для комбинированных двоичных файлов Z80/ 6502 , [ 17] 8086/68000 [17] или x86/ MIPS / ARM . [16]
CP/M-86 и DOS не имеют общего расширения файла для исполняемых файлов. [nb 1] Таким образом, обычно невозможно спутать исполняемые файлы. Однако ранние версии DOS имели так много общего с CP/M с точки зрения архитектуры, что некоторые ранние программы DOS были разработаны для совместного использования двоичных файлов, содержащих исполняемый код. Одной из известных программ, которая делала это, была WordStar 3.2x , которая использовала идентичные файлы оверлея в своих портах для CP/M-86 и MS-DOS , [27] и использовала динамически исправленный код для адаптации к различным соглашениям о вызовах этих операционных систем во время выполнения . [27]
GSX от Digital Research для CP/M-86 и DOS также использует идентичные 16-битные драйверы. [28]
Драйверы устройств DOS (обычно с расширением файла .SYS ) начинаются с заголовка файла, первые четыре байта которого по соглашению равны FFFFFFFFh , хотя это не является обязательным требованием. [29] Это динамически фиксируется операционной системой при загрузке драйвера (обычно в BIOS DOS, когда он выполняет операторы DEVICE в CONFIG.SYS ). Поскольку DOS не отклоняет файлы с расширением .COM для загрузки на DEVICE и не проверяет на FFFFFFFFh, можно объединить программу COM и драйвер устройства в один файл [30] [29], поместив инструкцию перехода в точку входа встроенной программы COM в первых четырех байтах файла (обычно достаточно трех байтов). [29] Если встроенная программа и разделы драйвера устройства разделяют общую часть кода или данных, необходимо, чтобы код имел дело с загрузкой по смещению +0100h как программа в стиле .COM и по смещению +0000h как драйвер устройства. [30] Для общего кода, загруженного по «неправильному» смещению, но не спроектированного так, чтобы быть независимым от позиции , это требует внутренней корректировки адреса [30], аналогичной той, которая в противном случае уже была бы выполнена перемещающимся загрузчиком , за исключением того, что в этом случае это должна делать сама загруженная программа; это похоже на ситуацию с самоперемещающимися драйверами , но с программой, уже загруженной в целевое местоположение загрузчиком операционной системы.
В DOS некоторые файлы, по соглашению, имеют расширения файлов, которые не отражают их фактический тип файла. [nb 4] Например, COUNTRY.SYS [31] не является драйвером устройства DOS, [nb 5] а представляет собой двоичный файл базы данных NLS для использования с директивой CONFIG.SYS COUNTRY и драйвером NLSFUNC . [31] Аналогично, системные файлы PC DOS и DR-DOS IBMBIO.COM и IBMDOS.COM являются специальными двоичными образами, загружаемыми загрузчиками , а не программами в стиле COM. [nb 5] Попытка загрузить COUNTRY.SYS с помощью оператора DEVICE или выполнение IBMBIO.COM или IBMDOS.COM в командной строке приведет к непредсказуемым результатам. [nb 4] [nb 6]
Иногда этого можно избежать, используя методы, подобные описанным выше. Например, DR-DOS 7.02 и выше включают функцию безопасности, разработанную Маттиасом Р. Полом: [32] Если эти файлы вызываются ненадлежащим образом, крошечные встроенные заглушки просто отобразят некоторую информацию о версии файла и благополучно завершатся. [33] [32] [34] [31] Кроме того, сообщение специально создано так, чтобы следовать определенным «магическим» шаблонам, распознаваемым внешней утилитой идентификации файлов NetWare & DR-DOS VERSION . [31] [32] [nb 7]
Аналогичная функция защиты была у 8080 инструкции C7h ("RST 0") в самом начале программ "Z3ENV" типа 3 и типа 4 Джея Сейджа и Джо Райта для Z-System [35] [36] , а также файлов наложения языка "Z3TXT", [37], которые могли привести к горячей загрузке (вместо сбоя) под CP/M-80, если были загружены неправильно. [35] [36] [37] [примечание 2]
В отдаленно похожей манере многие (двоичные) форматы файлов по соглашению включают байт 1Ah ( ASCII ^Z ) около начала файла. Этот управляющий символ будет интерпретироваться как маркер "мягкого" конца файла (EOF), когда файл открывается в недвоичном режиме, и, таким образом, во многих операционных системах (включая монитор PDP-6 [38] и RT-11 , VMS , TOPS-10 , [39] CP/M, [40] [41] DOS, [42] и Windows [43] ), он предотвращает отображение "двоичного мусора" при случайном выводе файла на консоль.
FatELF [44] был реализацией толстого двоичного кода для Linux и других Unix-подобных операционных систем. Технически двоичный файл FatELF был конкатенацией двоичных файлов ELF с некоторыми метаданными, указывающими, какой двоичный файл использовать на какой архитектуре. [45] В дополнение к абстракции архитектуры ЦП ( порядок байтов , размер слова , набор инструкций ЦП и т. д.) существует преимущество двоичных файлов с поддержкой нескольких ABI ядра и версий.
По словам разработчиков, FatELF имеет несколько вариантов использования: [44]
Доступен образ Ubuntu 9.04 для проверки концепции . [47] По состоянию на 2021 год [обновлять]FatELF не был интегрирован в основное ядро Linux. [ необходима цитата ] [48] [49]
Хотя формат Portable Executable , используемый Windows, не позволяет назначать код платформам, все равно можно создать программу-загрузчик, которая будет выполнять диспетчеризацию на основе архитектуры. Это связано с тем, что настольные версии Windows на ARM поддерживают 32-битную эмуляцию x86 , что делает ее полезной «универсальной» целью машинного кода. Fatpack — это загрузчик, демонстрирующий эту концепцию: он включает в себя 32-битную программу x86, которая пытается запустить исполняемые файлы, упакованные в ее разделы ресурсов, один за другим. [50]
При разработке Windows 11 ARM64 компания Microsoft представила новый способ расширения формата Portable Executable под названием Arm64X. [51] Двоичный файл Arm64X содержит весь контент, который был бы в отдельных двоичных файлах x64/Arm64EC и Arm64, но объединенный в один более эффективный файл на диске. Набор инструментов Visual C++ был обновлен для поддержки создания таких двоичных файлов. А когда создание двоичных файлов Arm64X технически сложно, разработчики могут вместо этого создавать чистые DLL-файлы пересылки Arm64X. [52]
Следующие подходы аналогичны толстым двоичным файлам в том, что в одном файле предоставляется несколько версий машинного кода одного и того же назначения.
С 2007 года некоторые специализированные компиляторы для гетерогенных платформ создают файлы кода для параллельного выполнения на нескольких типах процессоров, например, компилятор CHI ( C для гетерогенной интеграции) из пакета разработки Intel EXOCHI (Exoskeleton Sequencer) расширяет концепцию прагмы OpenMP для многопоточности , чтобы создавать толстые двоичные файлы, содержащие разделы кода для различных архитектур наборов инструкций (ISA), из которых загрузчик среды выполнения может динамически инициировать параллельное выполнение на нескольких доступных ядрах ЦП и ГП в гетерогенной системной среде. [53] [54]
Представленная в 2006 году, параллельная вычислительная платформа Nvidia CUDA (Compute Unified Device Architecture) представляет собой программное обеспечение для выполнения вычислений общего назначения на графических процессорах ( GPGPU ). Ее компилятор на основе LLVM NVCC может создавать двоичные файлы fat на основе ELF, содержащие так называемую виртуальную сборку PTX (в виде текста), которую драйвер среды выполнения CUDA может позже скомпилировать just-in-time в некоторый исполняемый двоичный код SASS (Streaming Assembler) для фактически существующего целевого графического процессора. Исполняемые файлы также могут включать так называемые двоичные файлы CUDA (они же файлы cubin ), содержащие выделенные разделы исполняемого кода для одной или нескольких конкретных архитектур графического процессора, из которых среда выполнения CUDA может выбирать во время загрузки. [55] [56] [57] [58] [59] [60] Двоичные файлы fat также поддерживаются GPGPU-Sim , симулятором графического процессора, также представленным в 2007 году. [61] [62]
Multi2Sim (M2S), гетерогенная системная симуляционная структура OpenCL (первоначально только для процессоров MIPS или x86, но позже расширенная для поддержки процессоров ARM и графических процессоров, таких как AMD / ATI Evergreen и Southern Islands , а также семейства Nvidia Fermi и Kepler ) [63] также поддерживает двоичные файлы fat на основе ELF. [64] [63]
GNU Compiler Collection (GCC) и LLVM не имеют толстого двоичного формата, но у них есть толстые объектные файлы для оптимизации времени компоновки (LTO). Поскольку LTO подразумевает задержку компиляции до времени компоновки, объектные файлы должны хранить промежуточное представление (IR), но с другой стороны, может потребоваться также хранить машинный код (для скорости или совместимости). Объект LTO, содержащий как IR, так и машинный код, называется толстым объектом . [65]
Даже в программе или библиотеке, предназначенной для той же архитектуры набора инструкций , программист может захотеть использовать некоторые новые расширения набора инструкций, сохраняя совместимость со старым ЦП. Этого можно достичь с помощью многоверсионности функций (FMV): версии одной и той же функции записываются в программу, и фрагмент кода решает, какую из них использовать, определяя возможности ЦП (например, через CPUID ). Компилятор Intel C++ , GCC и LLVM имеют возможность автоматически генерировать многоверсионные функции. [66] Это форма динамической диспетчеризации без каких-либо семантических эффектов.
Многие математические библиотеки содержат написанные вручную процедуры сборки, которые автоматически выбираются в соответствии с возможностями ЦП. Примерами являются glibc , Intel MKL и OpenBLAS . Кроме того, загрузчик библиотек в glibc поддерживает загрузку из альтернативных путей для определенных функций ЦП. [67]
Похожий, но гранулярный на уровне байтов подход, изначально разработанный Маттиасом Р. Полом и Акселем К. Фринкэ, заключается в том, чтобы позволить небольшому самоотбрасывающемуся, расслабляющемуся и перемещающемуся загрузчику, встроенному в исполняемый файл вместе с любым количеством альтернативных фрагментов двоичного кода, условно построить оптимизированный по размеру или скорости образ времени выполнения программы или драйвера, необходимый для выполнения (или невыполнения) определенной функции в определенной целевой среде во время загрузки посредством формы динамического устранения мертвого кода (DDCE). [68] [69] [70] [71]
COUNTRY.SYS
файлов, поддерживаемые семействами операционных систем MS-DOS / PC DOS и DR-DOS, содержат похожие данные, но организованы по-разному и несовместимы. Поскольку точки входа в структуры данных находятся в разных смещениях в файле, можно создавать «толстые» COUNTRY.SYS
базы данных, которые можно использовать в обоих семействах DOS. [b] Однако DR-DOS 7.02 и его NLSFUNC 4.00 (и выше) включают улучшенный парсер, способный читать оба типа форматов (и варианты), даже одновременно, так что файлы с заголовком Janus не нужны. [c] [d] Тем не менее, поставляемые файлы являются «толстыми», поскольку включают крошечную исполняемую заглушку, которая просто отображает встроенное сообщение при неправильном вызове. [d] [b][…] Функция защиты DOS […] Идея основана на утилитах в эмуляторе MYZ80 Симеона Крэна; заголовок защиты DOS в них идет еще дальше, не изменяя никаких регистров
Z80
. Волшебная последовательность — EB 52 EB: […] XCHG […] MOV D,D […] XCHG […] но это означает, что код DOS оказывается довольно далеко от начала программы. […] Больше удовольствия можно получить с самораспаковывающимися архивами
PMArc
. Начните один с […] defb 0EBh, 018h, '-pms-' […] и он будет обработан утилитами PMA как допустимый архив, отправив процессоры
8086
на 011Ah, а процессоры Z80 на 0130h. […]
[…] последовательность байт […] EB 03 C3 yy xx […] Если вы создадите
файл .COM
с этими 5 байтами в качестве первых […], вы увидите «JMP SHORT 3», за которыми следуют 3 мусорных байта. […] Если вы посмотрите на дизассемблированный
код Z80
[…], который транслируется как «EX DE,HL; INC BC;» […] Третий байт — «JUMP», за которым следует 16-битный адрес, указанный как yy xx […] у вас будет файл .COM, работающий в
MS-DOS
и […]
CP/M
[…](Примечание. Хотя автор говорит о Z80, эта последовательность также работает на 8080 и совместимых процессорах.)
[…] FATBIN 1.00 — объединяет файл
CP/M
.COM
и файл
DOS
.COM для создания одного, работающего на обеих платформах. […] Он использовался для создания: […] MSODBALL 2.05 — преобразует дискеты между форматом
Amstrad
706k и форматом DOS 706k. […] Обе программы работают под управлением CP/M-80 и DOS. […]
[…] DSKWRITE.Z80 содержит исходный код для версии
CP/M
. […] DSKWRITE.ASM содержит исходный код для версии
DOS
. […] Чтобы получить один
файл .COM
, вам нужно использовать FBMAKE: […][7] (Примечание. Упоминается FBMAKE из пакета FATBNSEA.COM.)
[…]
Самораспаковывающиеся архивы
— это
файлы .COM
, содержащие несколько меньших файлов. Когда вы запускаете один, он создает свои меньшие файлы […] Программы самораспаковывающихся архивов будут работать под
DOS
(2 или более поздней версии) или
CP/M
с идентичными эффектами. Чтобы извлечь их под
Unix
, вы можете использовать ZXCC […] FATBNSEA.COM […] FATBIN объединяет файл CP/M-80 .COM и файл DOS .COM, чтобы создать один, который будет работать в обеих системах. […] M3C4SEA.COM […] M3CONV версии 4 — преобразует снимки
Spectrum
в формате .Z80 или .SNA в
формат
Multiface 3 или из него (Multiface 3 ->
Z80
только на ПК). […] PMSFX21X.COM […]
PMSFX
— это программа, которая использовалась для создания этих самораспаковывающихся архивов. Эта версия (2.11) может создавать архивы, которые распаковываются в CP/M или DOS. Для использования PMSFX вам понадобится
PMARC
. Новое: в DOS он поддерживает точные размеры файлов. […] SP2BMSEA.COM […] Преобразует файл Stop Press Canvas в файл
Windows
.BMP […][8]
[…] Я написал версию
PMSFX
, которая создает
файлы .COM
, распаковываемые под
DOS
и
CP/M
(первые три байта являются как допустимым
кодом
Z80 , так и допустимым кодом
8086
и допустимым
заголовком
PMA ) […] в виде
самораспаковывающегося архива
. […]
[…] Причина подозревать такую разницу в том, что версия 3.2x также поддерживала
CP/M-86
(
оверлеи
идентичны для
DOS
и CP/M-86, отличается только главный исполняемый файл) […] файлы
.OVR
на 100% идентичны для DOS и CP/M-86, с флагом (ясно показанным в руководстве
WordStar 3.20
), переключающим между ними во время выполнения […] интерфейс ОС в WordStar довольно узкий и хорошо абстрагированный […] оверлеи WordStar 3.2x на 100% идентичны для версий DOS и CP/M-86. Существует переключатель времени выполнения, который выбирает между вызовом INT 21h (DOS) и INT E0h (CP/M-86). WS.COM не одинаков для DOS и CP/M-86, хотя, вероятно, и не сильно отличается. […]
[…] FreeKEYB — это […] настоящий драйвер .COM и .SYS (крошечная модель) в одном. Вы можете безопасно перезаписать первый JMP, это часть того, что я имел в виду под «хитрым заголовком». […] вы можете заменить FFFFh:FFFFh на 3-байтовый переход и ожидающий DB FFh. Он работает с MS-DOS, PC DOS, DR-DOS и, скорее всего, с любой другой проблемой DOS. […]
[…] Добавьте заголовок драйвера устройства SYS в драйвер, чтобы CTMOUSE мог быть как в одной, обычной
TSR
, так и в драйвере устройства - аналогично нашему расширенному драйверу клавиатуры FreeKEYB. […] Это на самом деле не нужно в
DR DOS
, поскольку
INSTALL
= поддерживается с DR DOS 3.41+, а DR DOS сохраняет порядок директив
[D]CONFIG.SYS
[…] но это […] улучшит […] гибкость в системах
MS-DOS
/
PC DOS
, которые […] всегда выполняют директивы
DEVICE
= перед любыми операторами INSTALL=, независимо от их порядка в файле. […] программное обеспечение может потребовать, чтобы драйвер мыши присутствовал в качестве драйвера устройства, поскольку драйверы мыши всегда были драйверами устройств в старые времена. Эти драйверы мыши имели определенные имена драйверов устройств в зависимости от используемого ими протокола («
PC$MOUSE
» для
режима систем мыши
, например), и некоторое программное обеспечение может искать эти драйверы, чтобы узнать правильный тип используемой мыши. […] Другим преимуществом было бы то, что драйверы устройств обычно потребляют меньше памяти (нет
среды
, нет
PSP
) […] Это в основном сложный заголовок файла, другой код для разбора командной строки, другая точка входа и строка выхода, и некоторая магия сегментов для преодоления разницы ORG 0 / ORG 100h.
Самостоятельная загрузка
драйвера устройства немного сложнее, поскольку вам нужно оставить заголовок драйвера там, где он есть, и только переместить остальную часть драйвера […]
Для обновления для Calderas OpenDOS 7.01 я должен использовать стартовый код на
IBMBIO.COM
, чтобы его модифицировать, поэтому он становится нестандартным для нормальной программы. Если эта функция Sicherheitsfunktion в официальной версии Einzug Halten Wird, ist jedoch noch nicht abzusehen.(Примечание. NWDOSTIP.TXT — это комплексная работа по Novell DOS 7 и OpenDOS 7.01, включающая описание многих недокументированных функций и внутренних компонентов. Она является частью еще более обширной
MPDOSTIP.ZIP
коллекции автора, которая поддерживалась до 2001 года и распространялась на многих сайтах в то время. Приведенная ссылка указывает на более старую версию файла, преобразованную в HTML NWDOSTIP.TXT
.) [9][…] был код операции "RST 0", выполнение которого привело бы к
горячей загрузке
. Файл, содержащий модуль
Z3TXT,
никогда не должен выполняться, но за один байт мы могли бы защитить себя от этой внешней случайности. Заголовок также содержал строку символов "Z3TXT", за которой следовал нулевой (0) байт. Многие модули
Z-System
включают такие идентификаторы. В эту категорию входят резидентные пакеты команд (RCP), пакеты потоковых команд (FCP) и модули дескрипторов среды (
Z3ENV
). Программы, такие как […] JETLDR.COM Бриджера Митчелла, которые загружают эти модули из файлов в память, могут использовать строку идентификатора для проверки файла, то есть для того, чтобы убедиться, что это тот тип модуля, который указал пользователь. Таким образом, можно обнаружить ошибки пользователя и поврежденные файлы. […] Таким образом, заголовок теперь выглядит следующим образом: […] rst […] db 'Z3TXT',0 ; идентификатор с завершающим нулем […] ; 12345678 ; должно быть 8 символов, […] db 'PROGNAME' ; дополнить пробелами […] ; 123 ; должно быть 3 символа […] db 'ENG' ; название языка […] dw LENGTH ; длина модуля […][15][16]
[…] Конец файла
ASCII
обозначается символом
control-Z
(1AH) или реальным концом файла, возвращаемым операцией чтения
CP/M
. Однако символы Control-Z, встроенные в файлы машинного кода (например,
файлы COM
), игнорируются, а условие конца файла, возвращаемое CP/M, используется для завершения операций чтения. […](56 страниц)
[…] CP/M отмечает конец файла ASCII , помещая символ CONTROL-Z в файл после последнего символа данных. Если файл содержит точное кратное 128 символам, в этом случае добавление CONTROL-Z приведет к потере 127 символов, CP/M этого не делает. Использование символа CONTROL-Z в качестве маркера конца файла возможно, поскольку CONTROL-Z редко используется в качестве данных в файлах ASCII. Однако в файле, отличном от ASCII, CONTROL-Z может встретиться так же часто, как и любой другой символ. Поэтому его нельзя использовать в качестве маркера конца файла. CP/M использует другой метод для обозначения конца файла, отличного от ASCII. CP/M предполагает, что он достиг конца файла, когда прочитал последнюю запись (базовую единицу дискового пространства), выделенную для файла. Запись каталога диска для каждого файла содержит список записей на диске, выделенных для этого файла. Этот метод поиска конца файла основан на его размере, а не на его содержимом. […][17][18]
[…] FreeKEYB создает образ среды выполнения драйвера во время инициализации в зависимости от типа машины, на которую он загружается, типа клавиатуры, раскладки, страны и используемой кодовой страницы, типа установленного(ых) адаптера(ов) мыши и видео, других загруженных в эту систему драйверов, операционной системы и используемых методов загрузки и перемещения, включенных отдельных функций и параметров конфигурации, указанных в командной строке. Из-за большого количества поддерживаемых ключей и параметров командной строки […] (около пятидесяти ключей […] с несколькими возможными настройками) существует большое количество комбинаций функций с неисчислимыми зависимостями […], что приводит к […] бесконечному количеству […] различных целевых образов. Методика устранения динамического мертвого кода FreeKEYB позволяет разрешить […] эти […] зависимости и […] удалить мертвый код и данные […] не ограничивается […] включением или исключением ограниченного числа модулей или целых подпрограмм и исправлением некоторых таблиц диспетчеризации, как в классическом программировании TSR, но […] работает […] на […] уровне байтов […] способна удалять […] отдельные инструкции в середине более крупных подпрограмм […] распределенных по всему коду для обработки конкретного случая или поддержки определенной функции […] специальные инструменты используются для анализа кода […] и создания […] таблиц исправлений […] автоматизированных […] с использованием условных определений […] для объявления различных случаев […] не только необязательными во время сборки, но и во время инициализации […] без […] накладных расходов, связанных с наличием хотя бы некоторого количества мертвого кода в образе среды выполнения […] для отслеживания всех зависимостей между […] этими условными операторами, динамически создавать и перемещать образ среды выполнения, исправлять все ссылки между этими небольшими, изменяющимися и движущимися двоичными частями […] по-прежнему позволяя использовать крошечную модель стиля .COM/.SYS […] выполняется во время инициализации […]
[…] […] уникальная функция […] мы называем
динамическим устранением мертвого кода
, поэтому вы можете во время установки […] указать, какие компоненты драйвера вам нужны, а какие нет. Это доходит до динамической загружаемой модуляризации и позднего связывания, которые я пока не видел в DOS. Если вам не нравится заставка, макросы, калькулятор или поддержка мыши, или <почти что-либо еще>, вы можете указать это в командной строке, и FreeKEYB, принимая во внимание все зависимости между процедурами, полностью удалит все фрагменты кода, которые имеют дело с этой функцией и не являются необходимыми для предоставления запрошенной функциональности, прежде чем драйвер переместит изображение в целевое местоположение и сделает себя резидентным. […]
[…] Brandneue[s] Feature, der
dynamischen Dead-Code-Elimination
, die die die jeweils notwendigen Bestandteile des Treibers erst zum Installationszeitpunkt zusammenbastelt und reloziert, so daß keine ungenutzten Code- или Datenbereiche mehr sid bleiben (zB wenn jemand ein bestimmtes FreeKEYB- Функция nicht benötigt). […]