Un binario pesado (o binario multiarquitectura ) es un programa o biblioteca ejecutable por computadora que se ha ampliado (o "engordado") con código nativo de múltiples conjuntos de instrucciones que, en consecuencia, se pueden ejecutar en múltiples tipos de procesadores. [1] Esto da como resultado un archivo más grande que un archivo binario normal de una arquitectura, de ahí el nombre.
El método habitual de implementación consiste en incluir una versión del código máquina para cada conjunto de instrucciones, precedida por un único punto de entrada con código compatible con todos los sistemas operativos, que ejecuta un salto a la sección correspondiente. Las implementaciones alternativas almacenan diferentes ejecutables en diferentes bifurcaciones , cada una con su propio punto de entrada que es utilizado directamente por el sistema operativo.
El uso de binarios gruesos no es común en el software del sistema operativo ; Existen varias alternativas para resolver el mismo problema, como el uso de un programa de instalación para elegir un binario específico de la arquitectura en el momento de la instalación (como con Android con varios APK ), seleccionar un binario específico de la arquitectura en tiempo de ejecución (como con Plan 9 directorios sindicales yLos paquetes gordos de GNUstep ), [2] [3] distribuir software en forma de código fuente y compilarlo en el lugar, o el uso de una máquina virtual (como con Java ) y compilación justo a tiempo .
En 1988, Domain/OS SR10.1 de Apollo Computer introdujo un nuevo tipo de archivo, "cmpexe" (ejecutable compuesto), que incluía archivos binarios para los ejecutables Motorola 680x0 y Apollo PRISM . [4]
Un esquema binario gordo suavizó la transición del Apple Macintosh , a partir de 1994, de los microprocesadores de 68k a los microprocesadores PowerPC . Muchas aplicaciones para la plataforma antigua se ejecutaban de forma transparente en la nueva plataforma bajo un esquema de emulación en evolución , pero el código emulado generalmente se ejecuta más lento que el código nativo. Las aplicaciones lanzadas como "binarios gordos" ocupaban más espacio de almacenamiento, pero se ejecutaban a toda velocidad en cualquiera de las plataformas. Esto se logró empaquetando una versión compilada en 68000 y una versión compilada en PowerPC del mismo programa en sus archivos ejecutables. [5] [6] El código 68K más antiguo (CFM-68K o 68K clásico) continuó almacenado en la bifurcación de recursos , mientras que el código PowerPC más nuevo estaba contenido en la bifurcación de datos , en formato PEF . [7] [8] [9]
Los binarios gordos eran más grandes que los programas que soportaban sólo PowerPC o 68k, lo que llevó a la creación de una serie de utilidades que eliminarían la versión innecesaria. [5] [6] En la era de los discos duros pequeños , cuando los discos duros de 80 MB eran un tamaño común, estas utilidades a veces eran útiles, ya que el código de programa representaba generalmente un gran porcentaje del uso total del disco y eliminaba los miembros innecesarios de un El binario gordo liberaría una cantidad significativa de espacio en un disco duro.
Los binarios gruesos eran una característica del sistema operativo NeXTSTEP / OPENSTEP de NeXT , comenzando con NeXTSTEP 3.1. En NeXTSTEP, se les llamó "binarios de arquitectura múltiple". Los binarios de arquitectura múltiple originalmente estaban destinados a permitir que el software se compilara para ejecutarse tanto en el hardware basado en Motorola 68k de NeXT como en las PC basadas en Intel IA-32 que ejecutan NeXTSTEP, con un único archivo binario para ambas plataformas. [10] Posteriormente se utilizó para permitir que las aplicaciones OPENSTEP se ejecutaran en PC y en las diversas plataformas RISC compatibles con OPENSTEP. Los archivos binarios de arquitectura múltiple están en un formato de archivo especial, en el que un solo archivo almacena uno o más subarchivos Mach-O para cada arquitectura admitida por el binario de arquitectura múltiple. Cada binario de arquitectura múltiple comienza con una estructura ( ) que contiene dos enteros sin signo. El primer número entero ("mágico") se utiliza como número mágico para identificar este archivo como Fat Binary. El segundo número entero ( nfat_arch ) define cuántos archivos Mach-O contiene el archivo (cuántas instancias del mismo programa para diferentes arquitecturas). Después de este encabezado, hay un número nfat_arch de estructuras fat_arch ( ). Esta estructura define el desplazamiento (desde el inicio del archivo) en el que se encuentra el archivo, la alineación, el tamaño y el tipo y subtipo de CPU al que se dirige el binario Mach-O (dentro del archivo).struct fat_header
struct fat_arch
La versión de GNU Compiler Collection enviada con Developer Tools pudo realizar una compilación cruzada del código fuente para las diferentes arquitecturas en las que NeXTStep podía ejecutarse. Por ejemplo, era posible elegir las arquitecturas de destino con múltiples opciones '-arch' (con la arquitectura como argumento). Esta fue una forma conveniente de distribuir un programa para NeXTStep que se ejecuta en diferentes arquitecturas.
También era posible crear bibliotecas (por ejemplo, utilizando libtool de NeXTStep ) con diferentes archivos de objetos de destino.
Apple Computer adquirió NeXT en 1996 y continuó trabajando con el código OPENSTEP. Mach-O se convirtió en el formato de archivo de objetos nativo en el sistema operativo gratuito Darwin de Apple (2000) y Mac OS X de Apple (2001), y los binarios de arquitectura múltiple de NeXT continuaron siendo compatibles con el sistema operativo. En Mac OS X, los binarios de arquitectura múltiple se pueden utilizar para admitir múltiples variantes de una arquitectura, por ejemplo, para tener diferentes versiones de código de 32 bits optimizadas para las generaciones de procesadores PowerPC G3 , PowerPC G4 y PowerPC 970 . También se puede utilizar para admitir múltiples arquitecturas, como PowerPC de 32 y 64 bits , PowerPC y x86 , o x86-64 y ARM64 . [11]
En 2005, Apple anunció otra transición, de los procesadores PowerPC a los procesadores Intel x86 . Apple promovió la distribución de nuevas aplicaciones que soportan tanto PowerPC como x86 de forma nativa mediante el uso de archivos ejecutables en formato binario de arquitectura múltiple. [12] Apple llama a estos programas " aplicaciones universales " y llama al formato de archivo " binario universal " como quizás una forma de distinguir esta nueva transición de la transición anterior, u otros usos del formato binario de arquitectura múltiple.
El formato binario universal no era necesario para la migración hacia adelante de aplicaciones PowerPC nativas preexistentes; De 2006 a 2011, Apple suministró Rosetta , un traductor binario dinámico de PowerPC (PPC) a x86 , para desempeñar esta función. Sin embargo, Rosetta tenía una sobrecarga de rendimiento bastante pronunciada, por lo que se animó a los desarrolladores a ofrecer binarios PPC e Intel, utilizando binarios universales. El costo obvio del binario universal es que cada archivo ejecutable instalado es más grande, pero en los años transcurridos desde el lanzamiento del PPC, el espacio en el disco duro ha superado con creces el tamaño del ejecutable; Si bien un binario universal puede tener el doble de tamaño que una versión de plataforma única de la misma aplicación, los recursos de espacio libre generalmente eclipsan el tamaño del código, lo que se convierte en un problema menor. De hecho, a menudo una aplicación binaria universal será más pequeña que dos aplicaciones de arquitectura única porque los recursos del programa pueden compartirse en lugar de duplicarse. Si no se requieren todas las arquitecturas, las aplicaciones de línea de comandos lipo y ditto se pueden usar para eliminar versiones de la imagen binaria de arquitectura múltiple, creando así lo que a veces se llama un binario delgado .
Además, los ejecutables binarios de arquitectura múltiple pueden contener código para versiones de PowerPC y x86 de 32 y 64 bits, lo que permite que las aplicaciones se envíen en un formato que admita procesadores de 32 bits pero que utilice un mayor espacio de direcciones y rutas de datos más amplias cuando se ejecuta en procesadores de 64 bits.
En las versiones del entorno de desarrollo Xcode desde la 2.1 hasta la 3.2 (que se ejecuta en Mac OS X 10.4 hasta Mac OS X 10.6 ), Apple incluyó utilidades que permitían que las aplicaciones estuvieran dirigidas a la arquitectura Intel y PowerPC; Los binarios universales podrían eventualmente contener hasta cuatro versiones del código ejecutable (PowerPC de 32 bits, x86 de 32 bits, PowerPC de 64 bits y x86 de 64 bits ). Sin embargo, la compatibilidad con PowerPC se eliminó de Xcode 4.0 y, por lo tanto, no está disponible para los desarrolladores que ejecutan Mac OS X 10.7 o superior.
En 2020, Apple anunció otra transición , esta vez de los procesadores Intel x86 al silicio de Apple (arquitectura ARM64). Para suavizar la transición, Apple agregó soporte para el formato binario Universal 2 ; Los archivos binarios Universal 2 son archivos binarios de arquitectura múltiple que contienen código ejecutable x86-64 y ARM64, lo que permite que el binario se ejecute de forma nativa tanto en Intel de 64 bits como en Apple Silicon de 64 bits. Además, Apple introdujo la traducción binaria dinámica Rosetta 2 para el conjunto de instrucciones x86 a Arm64 para permitir a los usuarios ejecutar aplicaciones que no tienen variantes binarias universales.
En 2006, Apple cambió de PowerPC a CPU Intel y reemplazó Open Firmware con EFI . Sin embargo, en 2008, algunas de sus Mac usaban EFI de 32 bits y otras usaban EFI de 64 bits. Por esta razón, Apple amplió la especificación EFI con binarios "gordos" que contenían binarios EFI de 32 y 64 bits. [13]
Los ejecutables CP/M-80 , MP/M-80 , CP/M concurrente , CP/M Plus , Personal CP/M-80 , SCP y MSX-DOS para las familias de procesadores Intel 8080 (y Zilog Z80 ) utilizan los mismos . Extensión de archivo COM como sistemas operativos compatibles con DOS para binarios Intel 8086 . [nb 1] En ambos casos, los programas se cargan en el desplazamiento +100 h y se ejecutan saltando al primer byte del archivo. [14] [15] Como los códigos de operación de las dos familias de procesadores no son compatibles, intentar iniciar un programa con el sistema operativo incorrecto conduce a un comportamiento incorrecto e impredecible.
Para evitar esto, se han ideado algunos métodos para construir binarios gruesos que contienen tanto un programa CP/M-80 como un programa DOS, precedidos por un código inicial que se interpreta correctamente en ambas plataformas. [15] Los métodos combinan dos programas completamente funcionales, cada uno de ellos creado para su entorno correspondiente, o agregan códigos auxiliares que hacen que el programa salga correctamente si se inicia en el procesador incorrecto. Para que esto funcione, las primeras instrucciones (a veces también llamadas encabezados de gadget [16] ) en el archivo .COM deben ser un código válido para los procesadores 8086 y 8080, lo que provocaría que los procesadores se bifurquen en diferentes ubicaciones dentro del código. [16] Por ejemplo, las utilidades en el emulador MyZ80 de Simeon Cran comienzan con la secuencia de código de operación EBh, 52h, EBh . [17] [18] Un 8086 ve esto como un salto y lee su siguiente instrucción desde el desplazamiento +154h, mientras que un 8080 o un procesador compatible pasa directamente y lee su siguiente instrucción desde +103h. Una secuencia similar utilizada para este propósito es EBh, 03h, C3h . [19] [20] FATBIN de John C. Elliott [21] [22] [23] es una utilidad para combinar un archivo CP/M-80 y un archivo .COM de DOS en un solo ejecutable. [17] [24] Su derivado del PMsfx original modifica los archivos creados por PMarc de Yoshihiko Mino para que sean autoextraíbles tanto en CP/M-80 como en DOS, comenzando con EBh, 18h, 2Dh, 70h, 6Dh, 73h, 2Dh. incluir también la firma "-pms-" para archivos PMA autoextraíbles , [25] [17] [24] [18], lo que también representa una forma de código ASCII ejecutable .
Otro método para evitar que un sistema operativo compatible con DOS ejecute erróneamente programas .COM para máquinas CP/M-80 y MSX-DOS [15] es iniciar el código 8080 con C3h, 03h, 01h , que se decodifica como un "RET " instrucción por procesadores x86, saliendo así elegantemente del programa, [nb 2] mientras que será decodificada como instrucción "JP 103h" por procesadores 8080 y simplemente saltará a la siguiente instrucción en el programa. De manera similar, el ensamblador CP/M Z80ASM+ de SLR Systems mostraría un mensaje de error cuando se ejecutara erróneamente en DOS. [17]
Algunos archivos CP/M-80 3.0 .COM pueden tener una o más superposiciones RSX adjuntas por GENCOM . [26] Si es así, comienzan con un encabezado adicional de 256 bytes (una página ). Para indicar esto, el primer byte del encabezado se establece en el byte mágico C9h , que funciona como firma que identifica este tipo de archivo COM en el cargador ejecutable CP/M 3.0 , así como como instrucción "RET" para 8080. -procesadores compatibles lo que conduce a una salida elegante si el archivo se ejecuta con versiones anteriores de CP/M-80. [nota 2]
C9h nunca es apropiado como primer byte de un programa para ningún procesador x86 (tiene diferentes significados para diferentes generaciones, [nb 3] pero nunca es un primer byte significativo); El cargador de ejecutables en algunas versiones de DOS rechaza los archivos COM que comienzan con C9h , evitando un funcionamiento incorrecto.
También se han ideado secuencias de códigos superpuestos similares para binarios combinados Z80/ 6502 , [ 17 ] 8086/68000 [ 17 ] o x86/ MIPS / ARM . [dieciséis]
CP/M-86 y DOS no comparten una extensión de archivo común para ejecutables. [nb 1] Por lo tanto, normalmente no es posible confundir ejecutables. Sin embargo, las primeras versiones de DOS tenían tanto en común con CP/M en términos de arquitectura que algunos de los primeros programas de DOS se desarrollaron para compartir archivos binarios que contenían código ejecutable. Un programa conocido por hacer esto fue WordStar 3.2x , que usó archivos superpuestos idénticos en sus puertos para CP/M-86 y MS-DOS , [27] y usó código arreglado dinámicamente para adaptarse a las diferentes convenciones de llamada de estos sistemas operativos. sistemas en tiempo de ejecución . [27]
GSX de Digital Research para CP/M-86 y DOS también comparte controladores binarios idénticos de 16 bits. [28]
Los controladores de dispositivos DOS (normalmente con extensión de archivo .SYS ) comienzan con un encabezado de archivo cuyos primeros cuatro bytes son FFFFFFFFh por convención, aunque esto no es un requisito. [29] Esto lo soluciona dinámicamente el sistema operativo cuando se carga el controlador (normalmente en el BIOS de DOS cuando ejecuta declaraciones DEVICE en CONFIG.SYS ). Dado que DOS no rechaza archivos con extensión .COM para cargar por DISPOSITIVO y no prueba FFFFFFFFh, es posible combinar un programa COM y un controlador de dispositivo en el mismo archivo [30] [29] colocando una instrucción de salto al punto de entrada del programa COM integrado dentro de los primeros cuatro bytes del archivo (normalmente tres bytes son suficientes). [29] Si el programa integrado y las secciones del controlador del dispositivo comparten una porción común de código o datos, es necesario que el código se cargue en el desplazamiento +0100h como un programa de estilo .COM, y en +0000h como un controlador de dispositivo. [30] Para el código compartido cargado en el desplazamiento "incorrecto" pero no diseñado para ser independiente de la posición , esto requiere una corrección de dirección interna [30] similar a lo que de otro modo ya habría llevado a cabo un cargador en reubicación , excepto por que en este caso lo tiene que hacer el propio programa cargado; Esto es similar a la situación con los controladores que se reubican automáticamente, pero con el programa ya cargado en la ubicación de destino mediante el cargador del sistema operativo.
En DOS, algunos archivos, por convención, tienen extensiones que no reflejan su tipo de archivo real. [nb 4] Por ejemplo, COUNTRY.SYS [31] no es un controlador de dispositivo DOS, [nb 5] sino un archivo de base de datos NLS binario para usar con la directiva CONFIG.SYS COUNTRY y el controlador NLSFUNC . [31] Asimismo, los archivos de sistema PC DOS y DR-DOS IBMBIO.COM e IBMDOS.COM son imágenes binarias especiales cargadas mediante cargadores de arranque , no programas de estilo COM. [nb 5] Intentar cargar COUNTRY.SYS con una instrucción DEVICE o ejecutar IBMBIO.COM o IBMDOS.COM en el símbolo del sistema provocará resultados impredecibles. [nota 4] [nota 6]
A veces es posible evitar esto utilizando técnicas similares a las descritas anteriormente. Por ejemplo, DR-DOS 7.02 y superiores incorporan una característica de seguridad desarrollada por Matthias R. Paul: [32] Si estos archivos se llaman de manera inapropiada, pequeños códigos auxiliares incrustados simplemente mostrarán información sobre la versión del archivo y saldrán correctamente. [33] [32] [34] [31] Además, el mensaje está diseñado específicamente para seguir ciertos patrones "mágicos" reconocidos por la utilidad de identificación de archivos externa NetWare y VERSIÓN DR-DOS . [31] [32] [nota 7]
Una característica de protección similar fue la instrucción 8080 C7h ("RST 0") al comienzo de los programas Z-System tipo 3 y tipo 4 "Z3ENV" de Jay Sage y Joe Wright [35] [36], así como "Z3TXT " archivos de superposición de idioma, [37] que darían como resultado un arranque en caliente (en lugar de un bloqueo) en CP/M-80 si se cargan de manera inapropiada. [35] [36] [37] [nb 2]
De manera muy similar, muchos formatos de archivos (binarios) por convención incluyen un byte de 1 Ah ( ASCII ^Z ) cerca del comienzo del archivo. Este carácter de control se interpretará como un marcador "suave" de fin de archivo (EOF) cuando un archivo se abre en modo no binario y, por lo tanto, en muchos sistemas operativos (incluido el monitor PDP-6 [38] y RT- 11 , VMS , TOPS-10 , [39] CP/M, [40] [41] DOS, [42] y Windows [43] ), evita que se muestre "basura binaria" cuando un archivo se imprime accidentalmente en el consola.
FatELF [44] era una implementación binaria gruesa para Linux y otros sistemas operativos similares a Unix . Técnicamente, un binario FatELF era una concatenación de binarios ELF con algunos metadatos que indicaban qué binario usar en qué arquitectura. [45] Además de la abstracción de la arquitectura de la CPU ( orden de bytes , tamaño de palabras , conjunto de instrucciones de la CPU , etc.), existe la ventaja de los binarios con soporte para múltiples ABI y versiones del kernel.
FatELF tiene varios casos de uso, según los desarrolladores: [44]
Está disponible una imagen de prueba de concepto de Ubuntu 9.04 . [47] A partir de 2021 [actualizar], FatELF no se ha integrado en el kernel principal de Linux. [ cita necesaria ] [48] [49]
Aunque el formato ejecutable portátil utilizado por Windows no permite asignar código a plataformas, aún es posible crear un programa de carga que se distribuya según la arquitectura. Esto se debe a que las versiones de escritorio de Windows en ARM son compatibles con la emulación x86 de 32 bits , lo que las convierte en un objetivo de código de máquina "universal" útil. Fatpack es un cargador que demuestra el concepto: incluye un programa x86 de 32 bits que intenta ejecutar los ejecutables empaquetados en sus secciones de recursos uno por uno. [50]
Al desarrollar Windows 11 ARM64, Microsoft introdujo una nueva forma de ampliar el formato ejecutable portátil llamado Arm64X. [51] Un binario Arm64X contiene todo el contenido que estaría en binarios x64/Arm64EC y Arm64 separados, pero fusionados en un archivo más eficiente en el disco. El conjunto de herramientas de Visual C++ se ha actualizado para admitir la producción de dichos archivos binarios. Y cuando la creación de archivos binarios Arm64X es técnicamente difícil, los desarrolladores pueden crear archivos DLL de reenviador puro Arm64X. [52]
Los siguientes enfoques son similares a los binarios pesados en el sentido de que se proporcionan múltiples versiones de código de máquina con el mismo propósito en el mismo archivo.
Desde 2007, algunos compiladores especializados para plataformas heterogéneas producen archivos de código para ejecución paralela en múltiples tipos de procesadores, es decir, el compilador CHI ( C para integración heterogénea) de la suite de desarrollo Intel EXOCHI (Exoskeleton Sequencer) amplía el concepto pragma OpenMP para producir subprocesos múltiples . binarios gruesos que contienen secciones de código para diferentes arquitecturas de conjuntos de instrucciones (ISA) desde las cuales el cargador de tiempo de ejecución puede iniciar dinámicamente la ejecución paralela en múltiples núcleos de CPU y GPU disponibles en un entorno de sistema heterogéneo. [53] [54]
Introducida en 2006, la plataforma de computación paralela CUDA (Compute Unified Device Architecture) de Nvidia es un software que permite la computación de propósito general en GPU ( GPGPU ). Su compilador NVCC basado en LLVM puede crear archivos binarios basados en ELF que contienen el llamado ensamblaje virtual PTX (como texto) que el controlador de tiempo de ejecución CUDA puede compilar posteriormente justo a tiempo en algún código ejecutable binario SASS (Streaming Assembler) para el presente. GPU de destino. Los ejecutables también pueden incluir los llamados binarios CUDA (también conocidos como archivos cubin ) que contienen secciones de código ejecutable dedicadas para una o más arquitecturas de GPU específicas entre las cuales el tiempo de ejecución de CUDA puede elegir en el momento de la carga. [55] [56] [57] [58] [59] [60] Los binarios Fat también son compatibles con GPGPU-Sim , un simulador de GPU introducido también en 2007. [61] [62]
Multi2Sim (M2S), un marco de simulador de sistema heterogéneo OpenCL (originalmente solo para CPU MIPS o x86, pero luego se amplió para admitir también CPU y GPU ARM como AMD / ATI Evergreen & Southern Islands, así como las familias Nvidia Fermi & Kepler ) [ 63] también admite binarios de grasas basados en ELF. [64] [63]
GNU Compiler Collection (GCC) y LLVM no tienen un formato binario grueso, pero sí tienen archivos de objetos gruesos para la optimización del tiempo de enlace (LTO). Dado que LTO implica retrasar la compilación hasta el momento del enlace, los archivos objeto deben almacenar la representación intermedia (IR), pero, por otro lado, es posible que también sea necesario almacenar el código de máquina (por motivos de velocidad o compatibilidad). Un objeto LTO que contiene IR y código de máquina se conoce como objeto gordo . [sesenta y cinco]
Incluso en un programa o biblioteca destinado a la misma arquitectura de conjunto de instrucciones , es posible que un programador desee utilizar algunas extensiones de conjunto de instrucciones más nuevas manteniendo la compatibilidad con una CPU más antigua. Esto se puede lograr con el control de versiones múltiples de funciones (FMV): las versiones de la misma función se escriben en el programa y un fragmento de código decide cuál usar al detectar las capacidades de la CPU (por ejemplo, a través de CPUID ). Intel C++ Compiler , GCC y LLVM tienen la capacidad de generar automáticamente funciones con múltiples versiones. [66] Esta es una forma de despacho dinámico sin ningún efecto semántico.
Muchas bibliotecas matemáticas cuentan con rutinas de ensamblaje escritas a mano que se eligen automáticamente según la capacidad de la CPU. Los ejemplos incluyen glibc , Intel MKL y OpenBLAS . Además, el cargador de bibliotecas en glibc admite la carga desde rutas alternativas para funciones específicas de la CPU. [67]
Un enfoque similar, pero granular a nivel de bytes, ideado originalmente por Matthias R. Paul y Axel C. Frinke, consiste en permitir que un pequeño cargador autodescartable, relajante y reubicado incrustado en el archivo ejecutable junto con cualquier número de fragmentos de código binario alternativos construya condicionalmente un Imagen en tiempo de ejecución de tamaño o velocidad optimizada de un programa o controlador necesario para realizar (o no realizar) una función particular en un entorno de destino particular en el momento de la carga a través de una forma de eliminación dinámica de código muerto (DDCE). [68] [69] [70] [71]
COUNTRY.SYS
formatos de archivo admitidos por las familias de sistemas operativos MS-DOS / PC DOS y DR-DOS contienen datos similares pero están organizados de manera diferente y son incompatibles. Dado que los puntos de entrada a las estructuras de datos se encuentran en diferentes desplazamientos en el archivo, es posible crear COUNTRY.SYS
bases de datos "gordas", que podrían usarse en ambas familias de DOS. [b] Sin embargo, DR-DOS 7.02 y su NLSFUNC 4.00 (y superiores) incluyen un analizador mejorado capaz de leer ambos tipos de formatos (y variantes), incluso al mismo tiempo, de modo que los archivos con encabezado Janus no son necesarios. [c] [d] Sin embargo, los archivos enviados son "gordos" por incluir un pequeño código auxiliar ejecutable que simplemente muestra un mensaje incrustado cuando se invoca de manera inapropiada. [d] [b][…] Función de protección de DOS […] La idea se basa en las utilidades del emulador MYZ80 de Simeon Cran; el encabezado de protección de DOS en ellos es aún mejor al no cambiar ningún registro
Z80
. La secuencia mágica es EB 52 EB: […] XCHG […] MOV D,D […] XCHG […] pero eso significa que el código DOS termina bastante lejos del inicio del programa. […] Se puede divertirse más con los archivos
PMArc
autoextraíbles
. Inicie uno con […] defb 0EBh, 018h, '-pms-' […] y las utilidades PMA lo tratan como un archivo válido, envía los procesadores
8086
a 011Ah y los procesadores Z80 a 0130h. […]
[…] secuencia de bytes […] EB 03 C3 yy xx […] Si crea un
archivo .COM
con esos 5 bytes como primeros […] verá 'JMP SHORT 3', seguido de 3 bytes basura. […] Si nos fijamos en un desmontaje
del Z80
[…] eso se traduce como 'EX DE,HL; INC BC;' […] El tercer byte es 'JUMP' seguido de la dirección de 16 bits especificada como yy xx […] tendrás un archivo .COM que se ejecuta en
MS-DOS
y […]
CP/M
[…](NB. Si bien el autor habla sobre el Z80, esta secuencia también funciona en el 8080 y procesadores compatibles).
[…] FATBIN 1.00: combine un
archivo
CP/M
.COM y un archivo
DOS
.COM para crear uno que se ejecute en ambas plataformas. […] Se utilizó para crear: […] MSODBALL 2.05: convierte disquetes entre el formato
Amstrad
706k y el formato DOS 706k. […] Ambos programas se ejecutan bajo CP/M-80 y DOS. […]
[…] DSKWRITE.Z80 contiene la fuente de la versión
CP/M
. […] DSKWRITE.ASM contiene la fuente de la versión
DOS
. […] Para obtener el
archivo .COM
único , debe usar FBMAKE: […][7] (NB. Menciona FBMAKE del paquete FATBNSEA.COM).
[…]
Los archivos autoextraíbles
son
archivos .COM
que contienen varios archivos más pequeños. Cuando ejecute uno, creará archivos más pequeños […] Los programas de archivo autoextraíbles se ejecutarán en
DOS
(2 o posterior) o
CP/M
, con efectos idénticos. Para extraerlos en
Unix
, puede utilizar ZXCC […] FATBNSEA.COM […] FATBIN combina un archivo CP/M-80 .COM y un archivo DOS .COM para producir uno que funcionará en ambos sistemas. […] M3C4SEA.COM […] M3CONV versión 4: convierte instantáneas
de Spectrum
en formato .Z80 o .SNA hacia o desde el formato
Multiface 3
(Multiface 3 ->
Z80
solo en una PC). […] PMSFX21X.COM […]
PMSFX
es el programa que se utilizó para generar estos archivos autodescomprimibles. Esta versión (2.11) puede generar archivos que se descomprimen bajo CP/M o DOS. Necesitará
PMARC
para usar PMSFX. Nuevo: en DOS, admite tamaños de archivo exactos. […] SP2BMSEA.COM […] Convierte un archivo Stop Press Canvas en un archivo .BMP
de Windows
[…][8]
[…] He escrito una versión de
PMSFX
que produce
archivos .COM
que se pueden descomprimir en
DOS
y
CP/M
(los primeros tres bytes son código
Z80
legal , código
8086
legal y encabezado
PMA
legal ) […] como un
sistema autoextraíble. archivo
. […]
[…] La razón para sospechar tal diferencia es que la versión 3.2x también soporta
CP/M-86
(las
superposiciones
son idénticas entre
DOS
y CP/M-86, sólo el ejecutable principal es diferente) […] los archivos
.OVR
son 100% idéntico entre DOS y CP/M-86, con una bandera (que se muestra claramente en el manual
de WordStar 3.20
) que cambia entre ellos en tiempo de ejecución […] la interfaz del sistema operativo en WordStar es bastante estrecha y bien abstracta […] el WordStar 3.2x Las superposiciones son 100% idénticas entre las versiones DOS y CP/M-86. Hay un interruptor de tiempo de ejecución que elige entre llamar a INT 21h (DOS) e INT E0h (CP/M-86). WS.COM no es lo mismo entre DOS y CP/M-86, aunque probablemente tampoco sea muy diferente. […]
[…] FreeKEYB es […] un verdadero controlador .COM y .SYS (modelo pequeño) en uno. Puede sobrescribir de forma segura el primer JMP, eso es parte de lo que quise decir con "encabezado complicado". […] puedes reemplazar el FFFFh:FFFFh por un salto de 3 bytes y una DB FFh pendiente. Funciona con MS-DOS, PC DOS, DR-DOS y probablemente también con cualquier otro problema de DOS. […]
[…] Agregue un encabezado de controlador de dispositivo SYS al controlador, de modo que CTMOUSE pueda ser al mismo tiempo un
TSR
normal y un controlador de dispositivo, similar a nuestro controlador de teclado avanzado FreeKEYB. […] Esto no es realmente necesario en
DR DOS
porque
INSTALL
= es compatible ya que DR DOS 3.41+ y DR DOS preserva el orden de las directivas
[D]CONFIG.SYS
[…] pero mejoraría […] la flexibilidad. en
sistemas
MS-DOS
/
PC DOS , que […] siempre ejecutan directivas
DEVICE
= antes de cualquier instrucción INSTALL=, independientemente de su orden en el archivo. […] el software puede requerir que el controlador del mouse esté presente como controlador de dispositivo, ya que los controladores de mouse siempre han sido controladores de dispositivo en los viejos tiempos. Estos controladores de mouse tenían nombres de controladores de dispositivo específicos dependiendo del protocolo que usaron ("
PC$MOUSE
" para
el modo de sistemas de mouse,
por ejemplo), y algunos programas pueden buscar estos controladores para determinar el tipo correcto de mouse que se usará. . […] Otra ventaja sería que los controladores de dispositivos generalmente consumen menos memoria (sin
entorno
, sin
PSP
) […] Es básicamente un encabezado de archivo complicado, un código diferente para analizar la línea de comando, un punto de entrada y una línea de salida diferentes, y algunos Magias de segmento para superar la diferencia ORG 0 / ORG 100h.
La carga automática
de un controlador de dispositivo es un poco más complicada ya que hay que dejar el encabezado del controlador donde está y solo reubicar el resto del controlador […]
Para una actualización zukünftiges para Calderas OpenDOS 7.01, he modificado el código de inicio de
IBMBIO.COM
, ya que es incorrecto como el programa normal gestado - ohne Absturz zur Kommandozeile zurückkehrt. Si esta función de seguridad está incluida en la versión oficial, se detendrá la función, pero no se abrirá.(NB. NWDOSTIP.TXT es un trabajo completo sobre Novell DOS 7 y OpenDOS 7.01, que incluye la descripción de muchas características e componentes internos no documentados. Es parte de la
MPDOSTIP.ZIP
colección aún más grande del autor mantenida hasta 2001 y distribuida en muchos sitios en ese momento. El enlace proporcionado apunta a una versión anterior del NWDOSTIP.TXT
archivo convertida a HTML). [9][…] había un código de operación de "RST 0" que, si se ejecutaba, daría como resultado un
arranque en caliente
. Un archivo que contenga un módulo
Z3TXT
nunca debería ejecutarse, pero con el coste de un byte podríamos protegernos contra esa posibilidad externa. El encabezado también contenía la cadena de caracteres "Z3TXT" seguida de un byte nulo (0). Muchos módulos
Z-System
incluyen dichos identificadores. En esta categoría se encuentran los paquetes de comandos residentes (RCP), los paquetes de comandos de flujo (FCP) y los módulos descriptores de entorno (
Z3ENV
). Los programas, como […] JETLDR.COM de Bridger Mitchell, que cargan estos módulos desde archivos en la memoria pueden usar la cadena de identificación para validar el archivo, es decir, para asegurarse de que es el tipo de módulo que el usuario ha indicado. ser. De este modo se pueden detectar errores del usuario y archivos dañados. […] El encabezado, por lo tanto, ahora queda como sigue: […] primero […] db 'Z3TXT',0 ; ID terminado en nulo […]; 12345678; debe tener 8 caracteres, […] db 'PROGNAME' ; pad con espacios […]; 123; debe tener 3 caracteres […] db 'ENG' ; nombre del idioma […] dw LONGITUD ; longitud del módulo […][15][16]
[…] El final de un archivo
ASCII
se indica mediante un carácter
de control-Z
(1AH) o un final de archivo real, devuelto por la operación de lectura
CP/M
. Sin embargo
, los caracteres Control-Z incrustados en archivos de código de máquina (por ejemplo,
archivos COM
) se ignoran y la condición de fin de archivo devuelta por CP/M se utiliza para finalizar las operaciones de lectura. […](56 páginas)
[…] CP/M marca el final de un archivo ASCII colocando un carácter CONTROL-Z en el archivo después del último carácter de datos. Si el archivo contiene un múltiplo exacto de 128 caracteres, en cuyo caso agregar CONTROL-Z desperdiciaría 127 caracteres, CP/M no lo hace. El uso del carácter CONTROL-Z como marcador de fin de archivo es posible porque CONTROL-Z rara vez se usa como datos en archivos ASCII. Sin embargo, en un archivo que no es ASCII, es tan probable que aparezca CONTROL-Z como cualquier otro carácter. Por lo tanto, no se puede utilizar como marcador de fin de archivo. CP/M utiliza un método diferente para marcar el final de un archivo que no es ASCII. CP/M supone que ha llegado al final del archivo cuando ha leído el último registro (unidad básica de espacio en disco) asignado al archivo. La entrada del directorio del disco para cada archivo contiene una lista de los registros del disco asignados a ese archivo. Este método se basa en el tamaño del archivo, más que en su contenido, para localizar el final del archivo. […][17][18]
[…] FreeKEYB crea la imagen de tiempo de ejecución del controlador en el momento de la inicialización dependiendo del tipo de máquina en la que se está cargando, el tipo de teclado, diseño, país y página de códigos utilizados, el tipo de mouse y adaptador(es) de video instalados, el otros controladores cargados en ese sistema, el sistema operativo y los métodos de carga y reubicación utilizados, las características individuales incluidas y las opciones de configuración especificadas en la línea de comando. Debido a la gran cantidad de opciones y opciones admitidas en la línea de comandos […] (alrededor de cincuenta opciones […] con múltiples configuraciones posibles) existe una gran cantidad de combinaciones de funciones con incontables dependencias […] lo que resulta en […] un número infinito de [ …] diferentes imágenes de destino. La técnica de eliminación dinámica de códigos muertos de FreeKEYB logra resolver […] estas […] dependencias y […] eliminar códigos y datos muertos […] no se limita a […] incluir o excluir un número algo limitado de módulos o subrutinas completas y arreglar algunas tablas de despacho como en la programación TSR clásica, pero […] funciona […] a […] nivel de bytes […] capaz de eliminar […] instrucciones individuales en medio de rutinas más grandes […] distribuidas por todo el código para manejar un caso particular o admitir una característica específica […] se utilizan herramientas especiales para analizar el código […] y crear […] tablas de reparación […] automatizadas […] utilizando definiciones condicionales […] para declarar los diversos casos […] no sólo es opcional en el momento del ensamblaje sino también en el momento de la inicialización […] sin la […] sobrecarga de tener al menos una cantidad de código inactivo en la imagen en tiempo de ejecución […] para realizar un seguimiento de todas las dependencias entre […] estos condicionales, construyen y reubican dinámicamente la imagen en tiempo de ejecución, arreglan todas las referencias entre estas partes binarias pequeñas, cambiantes y en movimiento […] aún permitiendo usar el pequeño modelo de estilo .COM/.SYS […] […] está listo en el momento de la inicialización […]
[…] una […] característica única […] que llamamos
eliminación dinámica de códigos muertos
, por lo que puede en el momento de la instalación […] especificar qué componentes del controlador desea y cuáles no. Esto llega hasta un punto de modularización cargable dinámica y vinculación tardía que no he visto en DOS hasta ahora. Si no le gusta el protector de pantalla, las macros, la calculadora o la compatibilidad con el mouse, o <casi cualquier otra cosa>, puede especificar esto en la línea de comando y FreeKEYB, teniendo en cuenta todas las dependencias entre las rutinas, lo hará por completo. elimine todos los fragmentos de código, que tratan con esa característica y no son necesarios para proporcionar la funcionalidad solicitada, antes de que el controlador reubique la imagen en la ubicación de destino y se convierta en residente. […]
[…] Brandneue[s] Feature, der
dynamischen Dead-Code-Elimination
, die die jeweils notwendigen Bestandteile des Treibers erst zum Installationszeitpunkt zusammenbastelt und reloziert, so daß keine ungenutzten Code- oder Datenbereiche mehr residente bleiben (zB wenn jemand ein bestimmtes FreeKEYB- Característica no benötigt). […]