La Macintosh Toolbox implementa muchas de las características de alto nivel del Mac OS clásico , incluyendo un conjunto de interfaces de programación de aplicaciones para el desarrollo de software en la plataforma. La Toolbox consta de una serie de "administradores", componentes de software como QuickDraw , responsable de dibujar gráficos en pantalla, y el Administrador de menús, que mantiene las estructuras de datos que describen la barra de menú. Como el Macintosh original fue diseñado sin memoria virtual o protección de memoria , era importante clasificar el código según cuándo debería cargarse en la memoria o mantenerse en el disco, y cómo debería accederse a él. La Toolbox consta de subrutinas lo suficientemente esenciales como para mantenerse permanentemente en la memoria y ser accesibles mediante una instrucción de máquina de dos bytes ; sin embargo, excluye la funcionalidad básica del "núcleo", como la gestión de memoria y el sistema de archivos . Tenga en cuenta que la Toolbox no dibuja el menú en pantalla: los menús fueron diseñados para tener una apariencia personalizable, por lo que el código de dibujo se almacenó en un recurso , que podría estar en un disco.
La implementación original de la familia Motorola 68000 del sistema operativo Macintosh ejecuta llamadas del sistema utilizando el mecanismo de manejo de excepciones de código de operación ilegal de ese procesador. Motorola especificó que las instrucciones que comenzaran con 1111 y 1010 nunca se utilizarían en futuros procesadores de la familia 68000, liberándolos así para su uso como tales por un sistema operativo. Además, cada uno tenía su propio vector de interrupción dedicado , separado del manejador de código de operación ilegal genérico. Como 1111 estaba reservado para el uso de coprocesadores como el FPU 68881 , Apple eligió 1010 ( A en hexadecimal ) como prefijo para las llamadas del sistema operativo. El manejo de instrucciones ilegales se conoce como trampa , por lo que estas instrucciones especiales se llamaron trampas A. [1] Cuando el procesador encuentra una instrucción de este tipo, transfiere el control al sistema operativo, que busca la tarea adecuada y la realiza. Este mecanismo tenía dos ventajas:
El sistema se optimizó aún más asignando algunos bits de la instrucción A-trap para almacenar parámetros para las funciones más comunes. Por ejemplo, la asignación de memoria es una tarea muy común, por lo que debe expresarse en la menor cantidad posible de bytes de código. A veces, el programador desea limpiar el bloque de memoria a cero, por lo que la función de asignación debe tomar un parámetro booleano o debe haber dos funciones de asignación. Pasar un parámetro requeriría una instrucción adicional de dos bytes, lo que sería ineficiente. Tener dos funciones requeriría al menos cuatro bytes adicionales de RAM utilizados para la dirección en la tabla de búsqueda de funciones. La solución más eficiente es asignar múltiples A-traps a la misma subrutina, que luego usa la A-trap como parámetro. Esto es cierto para las subrutinas más utilizadas. Sin embargo, la Toolbox estaba compuesta por las subrutinas menos utilizadas. La Toolbox se definió como el conjunto de subrutinas que no tomaban parámetros dentro de la A-trap y estaban indexadas a partir de una tabla de despacho de 1024 entradas y 4 kilobytes . [2] (Las máquinas enviadas con menos de un megabyte de RAM utilizan una única tabla de 512 entradas, que corresponde a la tabla de despacho del sistema operativo de 256 entradas de las revisiones de ROM posteriores. [3] )
En 1994, Apple lanzó los Macintosh que utilizaban la arquitectura PowerPC , que carecía de soporte de hardware para el mecanismo A-trap disponible en los sistemas 68k. Sin embargo, debido a su uso en la aplicación de parches de software, las tablas de despacho se conservaron. El código de la biblioteca API subyacente a cualquier rutina de Toolbox no hace nada más que hacer referencia a la tabla de despacho. La tabla de despacho se vincula únicamente al código de la familia 68000 emulada. Las funciones de Toolbox implementadas en código PowerPC nativo tienen que desactivar primero el emulador utilizando el Administrador de modo mixto. En aras de la uniformidad y la extensibilidad, incluso se siguieron añadiendo nuevas entradas de función a Toolbox después de la transición a PowerPC.
Sin embargo, existía un mecanismo alternativo en el Administrador de Fragmentos de Código, que se utilizaba para cargar y vincular dinámicamente programas nativos de PowerPC. La función de llamada al sistema de PowerPC, análoga al mecanismo A-trap, se utilizaba para interactuar con el nanokernel de Mac OS , que ofrecía pocos servicios directamente útiles para las aplicaciones.
La caja de herramientas se compone de funciones de uso común, pero no de las más utilizadas. Como resultado, se convirtió en una mezcolanza de diferentes bibliotecas API . [3] La caja de herramientas abarca la mayor parte de la funcionalidad básica que distinguía al Mac OS clásico. Las referencias de Apple “Inside Macintosh: Macintosh Toolbox Essentials” e “Inside Macintosh: More Macintosh Toolbox”, igualmente vagas en su alcance, también documentan la mayor parte de la caja de herramientas.
Debido a que gran parte de Toolbox está implementado en ROM, junto con el firmware de la computadora , era conveniente usarlo como un entorno de cargador de arranque . Junto con los recursos almacenados en el chip ROM, Toolbox puede convertir la pantalla en gris, mostrar un cuadro de diálogo con el saludo característico "Bienvenido a Macintosh" y mostrar el cursor del mouse. Al usar Toolbox para ayudar a arrancar la máquina, se puede inicializar un entorno rudimentario similar al de Mac antes de cargar la maleta System desde el disco (de hecho, antes de que se ejecutaran las ROM en las tarjetas NuBus), que es cuando se debe tomar la decisión de usar direccionamiento de 24 bits o 32 bits. (El soporte de System 7 para direccionamiento de 32 bits requiere ROM limpias de 32 bits , ya que las ROM Mac antiguas no tienen soporte para esto). La necesidad de diagnósticos como en el residente BIOS para placas compatibles con IBM PC no es necesaria ya que Macintosh tiene la mayoría de sus diagnósticos en POST y automáticamente informa errores a través de los códigos " Sad Mac ".
Sin embargo, la similitud entre el entorno de arranque y el sistema operativo real no debe confundirse con que sean idénticos. Aunque el proceso de arranque del "Mac OS clásico" es complicado y en gran parte indocumentado, no es más limitado que un BIOS compatible con IBM PC . Al igual que el registro de arranque maestro de una PC , una Mac basada en ROM lee y ejecuta código de los primeros bloques ("bloques de arranque") de la partición de disco seleccionada como dispositivo de arranque . Luego, los bloques de arranque verifican que exista un entorno rudimentario adecuado y lo utilizan para cargar la maleta del sistema. Un sistema operativo diferente con un sistema de archivos diferente puede arrancar simplemente usando su propio código en los bloques de arranque. [4] Sin embargo, este sistema no se utilizó para PowerPC Linux, porque Open Firmware en las máquinas ROM del Nuevo Mundo requiere un cargador de arranque dentro de un sistema de archivos HFS, una razón que no tiene nada que ver con la Caja de herramientas o las Mac "anticuadas" en general. Más concretamente, el panel de control del Disco de arranque en el Mac OS clásico y macOS posteriores solo permite al usuario seleccionar un sistema de archivos montado con restricciones muy particulares.
En Mac OS X , la Toolbox no se utiliza en absoluto, aunque el entorno clásico carga el archivo ROM de la Toolbox en su máquina virtual. Gran parte de la Toolbox se reestructuró e implementó como parte de la API de programación Carbon de Apple , lo que permite a los programadores familiarizados con la Toolbox trasladar su código de programa más fácilmente a Mac OS X.