Un programa residente (conocido comúnmente como TSR ) es un programa informático que se ejecuta bajo DOS y que utiliza una llamada al sistema para devolver el control a DOS como si hubiera finalizado, pero permanece en la memoria del ordenador para poder reactivarse posteriormente. [ 1 ] Esta técnica superó parcialmente la limitación de DOS de ejecutar solo un programa o tarea a la vez. Los TSR se utilizan únicamente en DOS, no en Windows .
Algunos programas de reprogramación (TSR) son utilidades que un usuario puede ejecutar varias veces al día, mientras trabaja en otro programa, mediante una combinación de teclas . Borland Sidekick fue un ejemplo temprano y popular de este tipo. Otros funcionan como controladores de dispositivos para hardware que el sistema operativo no admite directamente.
Usar
Normalmente, DOS solo puede ejecutar un programa a la vez. Cuando un programa finaliza, devuelve el control a DOS mediante la llamada al sistema INT 21h/4Ch de la API de DOS . [ 2 ] La memoria y los recursos del sistema utilizados se marcan como no utilizados. Esto hace imposible reiniciar partes del programa sin tener que recargarlo por completo. Sin embargo, si un programa finaliza con la llamada al sistema INT 27h o INT 21h/31h , el sistema operativo no reutiliza una parte específica de su memoria.
La llamada original, INT 27h , se denomina "terminar pero permanecer residente", de ahí el nombre "TSR". Mediante esta llamada, un programa puede hacer que hasta 64 KB de su memoria sean residentes. MS-DOS versión 2.0 introdujo una llamada mejorada, INT 21h/31h ("Mantener proceso"), que eliminó esta limitación y permitió que el programa devolviera un código de salida . Antes de realizar esta llamada, el programa puede instalar uno o varios manejadores de interrupción que apunten a sí mismo, de modo que pueda ser llamado de nuevo. Instalar un vector de interrupción de hardware permite que dicho programa reaccione a eventos de hardware. Instalar un vector de interrupción de software permite que sea llamado por el programa que se está ejecutando actualmente. Instalar un manejador de interrupción de temporizador permite que un TSR se ejecute periódicamente (utilizando un temporizador de intervalo programable ).
El método típico para usar un vector de interrupción consiste en leer su valor actual (la dirección), almacenarlo en la memoria del TSR y reemplazarlo con una dirección en su propio código. La dirección almacenada se llama desde el TSR, formando así una lista enlazada simple de manejadores de interrupción , también llamados rutinas de servicio de interrupción (ISR). Este procedimiento de instalación de ISR se denomina encadenamiento o conexión de una interrupción o un vector de interrupción.
Los TSR se pueden cargar en cualquier momento, ya sea durante la secuencia de inicio de DOS (por ejemplo, desde AUTOEXEC.BAT ) o a petición del usuario (por ejemplo, Sidekick y Turbo Debugger de Borland , QuickPay de Quicken o Personal Calendar de FunStuff Software). Algunas partes de DOS utilizan esta técnica, especialmente en las versiones 5.0 y posteriores. Por ejemplo, el editor de línea de comandos DOSKEY y otras utilidades se instalan ejecutándolas desde la línea de comandos (manualmente, desde AUTOEXEC.BAT o desde CONFIG.SYS ) en lugar de cargarlas como controladores de dispositivo mediante instrucciones en CONFIG.SYS.INSTALLDEVICE
Algunos TSR no tienen forma de descargarse, por lo que permanecerán en memoria hasta que se reinicie el sistema. Sin embargo, es posible descargarlos externamente, utilizando utilidades como la combinación MARK.EXE / RELEASE.EXE de TurboPower Software o TSR de reinicio suave que capturarán una combinación de teclas específica y liberarán todos los TSR cargados posteriormente. Dado que la cadena de ISR está enlazada individualmente, y un TSR puede almacenar el enlace a su predecesor donde desee, no existe una forma general para que un TSR se elimine de la cadena. Por lo tanto, normalmente debe quedar un fragmento en memoria al descargar un TSR, lo que provoca fragmentación de memoria. Este problema dio origen a marcos de cooperación de TSR como TesSeRact y AMIS. [ 3 ]
Ver un TSR inspiró a Andy Hertzfeld a crear Switcher para MacOS clásico . [ 4 ]
Interrumpir el intercambio
Para gestionar los problemas que surgen cuando varios TSR comparten la misma interrupción, Ralf D. Brown propuso un método llamado Especificación de Interrupción Multiplex Alternativa (AMIS) como una mejora respecto a los servicios utilizados anteriormente a través de INT 2Fh. AMIS proporciona formas de compartir interrupciones de software de manera controlada. Está basado en el Protocolo de Compartición de Interrupciones de IBM, originalmente inventado para compartir interrupciones de hardware de un procesador x86. Los servicios AMIS están disponibles a través de Int 2Dh. [ 5 ]
La propuesta nunca logró una amplia aceptación entre los programadores de la época. Existía junto con otras especificaciones competidoras de diversa sofisticación. [ 6 ]
Fallos
Si bien son muy útiles, e incluso esenciales para superar las limitaciones de DOS , los TSR tienen fama de ser problemáticos. Muchos secuestran el sistema operativo de diversas maneras, documentadas o no, lo que a menudo provoca que los sistemas se bloqueen al activarse o desactivarse cuando se utilizan con ciertas aplicaciones u otros TSR.
Al encadenar los vectores de interrupción, los TSR pueden tomar el control total del ordenador. Un TSR puede tener uno de dos comportamientos:
- Tome el control total de una interrupción al no llamar a otros TSR que hayan modificado previamente el mismo vector de interrupción .
- Se puede crear una cadena con otros programas de servicio de interrupción (TSR) llamando al vector de interrupción anterior. Esto se puede hacer antes o después de que ejecuten su código. De esta forma, los TSR pueden formar una cadena donde cada uno llama al siguiente.
La mayoría de los virus DOS y otros programas maliciosos utilizan el método de terminación permanente , pudiendo tomar el control del PC o permanecer en segundo plano. Este malware reacciona a las operaciones de entrada/salida del disco o a los eventos de ejecución, infectando archivos ejecutables (.EXE o .COM) al ejecutarse y archivos de datos al abrirlos.
Además, sin el uso de un extensor de DOS , todos los programas en DOS deben cargarse en los primeros 640 KB de RAM (la memoria convencional ), incluso en ordenadores con gran cantidad de RAM física . Los TSR no son una excepción y ocupan bloques de esos 640 KB que, por lo tanto, no están disponibles para otras aplicaciones. Esto significaba que escribir un TSR era un desafío para lograr el tamaño más pequeño posible y comprobar su compatibilidad con muchos productos de software de diferentes proveedores, una tarea a menudo muy frustrante. Debido a que se llaman directamente desde el entorno DOS, los TSR no pueden utilizar extensores de DOS en la práctica y, por lo tanto, deben ubicarse en la memoria convencional.
A finales de los años 80 y principios de los 90, muchos videojuegos para PC se acercaban peligrosamente a este límite, dejando cada vez menos espacio para los TSR (registros de servicio de tiempo), incluso para los esenciales como los controladores de CD-ROM . Organizar el sistema para que hubiera suficiente RAM libre para ejecutar los juegos, manteniendo los TSR necesarios, se volvió muy complicado. Muchos jugadores tenían varios discos de arranque con diferentes configuraciones para distintos juegos. En versiones posteriores de MS-DOS, los scripts del "menú de arranque" permitían seleccionar diversas configuraciones mediante una sola entrada de menú. A mediados y finales de los 90, aunque muchos juegos seguían programados para DOS, el límite de 640 KB se superó finalmente colocando partes de los datos del juego por encima del primer MB de memoria y utilizando el código por debajo de los 640 KB para acceder a la memoria extendida mediante la técnica de superposición (EMS) . Un enfoque alternativo posterior consistió en activar el modo protegido de la CPU mediante extensores de DOS y ejecutar el programa en dicho modo. Esto último permitía tener código y datos en el área de memoria extendida.
Debido a que programar con muchas superposiciones es un desafío en sí mismo, una vez que el programa era demasiado grande para caber completamente en aproximadamente 512 KB, el uso de memoria extendida casi siempre se hacía mediante un extensor de DOS de terceros que implementaba VCPI o DPMI , porque resulta mucho más fácil y rápido acceder a la memoria por encima del límite de 1 MB, y es posible ejecutar código en esa área, cuando el procesador x86 cambia del modo real al modo protegido . Sin embargo, dado que DOS y la mayoría de los programas de DOS se ejecutan en modo real (VCPI o DPMI hacen que un programa en modo protegido parezca un programa en modo real para DOS y el resto del sistema al alternar entre los dos modos), los TSR de DOS y los controladores de dispositivos también se ejecutan en modo real, por lo que cada vez que uno obtiene el control, el extensor de DOS tiene que volver al modo real hasta que cede el control, lo que conlleva una penalización de tiempo (a menos que utilicen técnicas como DPMS o CLOAKING ).
Devolver
Con la llegada de las tarjetas de memoria expandida y, especialmente, de los procesadores Intel 80386 en la segunda mitad de la década de 1980, fue posible utilizar memoria superior a 640 KB para cargar TSR. Esto requirió soluciones de software complejas, denominadas gestores de memoria expandida . Algunos gestores de memoria son QRAM y QEMM de Quarterdeck , 386 MAX de Qualitas , CEMM de Compaq y, posteriormente, EMM386 de Microsoft . Las áreas de memoria utilizables para cargar TSR superiores a 640 KB se denominan " bloques de memoria superiores " (UMB) y la carga de programas en ellas se denomina carga alta . Posteriormente, los gestores de memoria comenzaron a incluir programas como Optimize de Quarterdeck o MEMMAKER de Microsoft , que intentan maximizar el espacio disponible en los primeros 640 KB determinando la mejor manera de asignar los TSR entre la memoria baja y la alta.
Rechazar
Con el desarrollo de juegos que utilizaban extensores de DOS (un ejemplo temprano fue Doom ), que sorteaban la barrera de los 640 KB, muchos de los problemas relacionados con los TSR desaparecieron. Además, con la adopción generalizada de Microsoft Windows , especialmente Windows 95 (seguido de Windows 98 ) , que hizo innecesaria la mayoría de los TSR y algunos los hizo incompatibles , los TSR cayeron en desuso, aunque las aplicaciones de Win16 pueden realizar trucos similares a los de los TSR, como parchear la tabla de descriptores de interrupción (IDT), porque Windows lo permitía. Windows Me no permite que un equipo arranque en un núcleo de DOS al apagar Windows Me; por lo tanto, los TSR se volvieron inútiles en Windows Me.
La serie Windows NT (que incluye Windows 2000 , Windows XP y versiones posteriores) reemplazó por completo a DOS y se ejecuta en modo protegido o modo extendido (solo en versiones posteriores de 64 bits) de forma permanente, lo que impide cambiar al modo real, necesario para el funcionamiento de los TSR. En su lugar, estos sistemas operativos cuentan con modernos marcos de controladores y servicios con protección de memoria y multitarea preventiva , lo que permite ejecutar varios programas y controladores de dispositivos simultáneamente sin necesidad de técnicas de programación especiales; el núcleo y sus módulos se encargan exclusivamente de modificar la tabla de interrupciones.
Véase también
Referencias
- ↑ Maybury, Rick (1998). "Vence al bicho: virus informáticos" . Consejos principales para PC . Archivado del original el 28 de septiembre de 2009. Consultado el 9 de febrero de 2012 .
- ↑ Referencia de HelpPC. "INT 21,0 - Finalización del programa" . Consultado el 7 de julio de 2025 .
- ↑ "una lista de bibliotecas TSR" . Archivado del original el 17 de agosto de 2007.también conocidos como marcos de trabajo.
- ↑ "Interfaz gráfica de usuario de Mac :: Cambiar entre aplicaciones de Mac" . macgui.com . Consultado el 15 de febrero de 2019 .
- ↑ "int 2D" . Archivado del original el 1 de diciembre de 2017. Consultado el 14 de noviembre de 2019 .
- ↑ "Bibliotecas TSR" . 19 de junio de 2016. Archivado del original el 19 de junio de 2016. Consultado el 14 de noviembre de 2019 .
Enlaces externos
- Un TSR temprano
- Preguntas frecuentes de comp.os.msdos.programmer: ¿Cómo puedo escribir una utilidad TSR (Terminar y permanecer residente)?
- De la A a la Z de C ; un libro gratuito sobre programación DOS en C; Capítulo 27 – "Programación TSR" (PDF) . (80 KB)
- Protocolo de compartición de interrupciones de IBM , archivo zip, 6,5 KB ( Simtel )
- Especificación de interrupción de multiplexación alternativa (AMIS), v.3.5 (archivo zip)
- AMISLIB : una biblioteca de funciones para escribir TSRs removibles y de carga automática en lenguaje ensamblador (archivo zip).
- Tecnología DOS
- Gestión de memoria de DOS