| Artículos | 01 MAR 1995

Programación en DPMI: ideas básicas

Tags: Histórico
Herramienta que se ofrece con código fuente en C y ensamblador
Jaime Peña.

Muchos de los programas actuales que trabajan sobre DOS, son capaces de superar la barrera de los 640 KB. Windows es un ejemplo notorio y también lo son los juegos más espectaculares. El estándar DPMI es el responsable de este pequeño milagro.

El sistema operativo DOS fue diseñado para trabajar en el denominado modo real. Eso siempre ha supuesto serios inconvenientes para poder utilizar masivas cantidades de memoria. Su singularidad de direccionamiento segmentado, en fragmentos de 64 KB, obliga a un esfuerzo extra por parte de los programadores, ya que se ha de especificar una dirección de memoria por pares de valores segmento:desplazamiento.

Dado que se trabajó inicialmente con procesadores de 16 bits (el original 8088 y el 8086), se puede direccionar una cantidad total de memoria de 1 MB, pero parte se reserva para datos de la BIOS, memoria de video, etc., lo que reducía el ámbito útil a 640 KB. La situación trató de paliarse con el empleo de gestores de memoria expandida (EMS, Expanded Memory Specification) y extendida (XMS, EXtended Memory Specification). Realmente fue un avance singular, entre otras razones porque podían cargarse programas en la memoria superior (zonas libres entre 640 KB y 1 MB de capacidad total de direccionamiento directo del DOS).

Un paso más adelante (en verdad una novedad reseñable) se introdujo con Windows 3.x y OS/2 1.x, ya que se diseñaron para trabajar en modo Protegido, utilizando direccionamiento de 32 bits y, por tanto, pudiendo referenciarse localizaciones de memoria de hasta 4 GB. Por si eso fuera poco, el procesador puede trabajar en forma de máquinas virtuales, ya que se trabaja con áreas de memoria física (real) que se intercambian con áreas de memoria virtual (ficticia), lo que da la imagen de mayores disponibilidades de memoria física de la que puede estar actualmente instalada en nuestro ordenador. De ahí, por ejemplo, el uso de un archivo de intercambio en modo mejorado 386 de Windows.

La diferencia que existe entre la memoria física (real) y la virtual está, esencialmente, en que cada máquina virtual es un reflejo de una máquina trabajando con un procesador 8088, con sus áreas de memoria de vídeo e interrupciones, pero se restringe el acceso directo al hardware, a través de un sistema de permisos de accesos. Obviamente, esto permite proteger el funcionamiento de programas que, inesperadamente, se puedan volver erráticos y no afecten a la totalidad del sistema.

¿Qué es la programación bajo DPMI?

La programación en DPMI (DOS Protected Mode Interface) es posible en ordenadores con un procesador 286 o superior. En realidad, hay dos modos de trabajo: DPMI 16-bits para procesadores 286 o superiores y DPMI 32-bits, para procesadores 386, 486 y Pentium. Inicialmente, la especificación DPMI fue desarrollada por Microsoft para dar soporte multitarea (parcial) para Windows.

En el modo Protegido de 16 bits (DPMI 16-bit), al igual que la programación en modo Real, las direcciones de memoria se designan por un segmento y un desplazamiento. La diferencia estriba en que en modo Real se refiere a memoria física y dispone de un tamaño de direccionamiento de 20 bits, lo que proporciona una capacidad de 220 = 1.048.580 bytes = 1 MB. En el caso de DPMI 16-bits, los descriptores de direcciones de memoria son de 24 bits, lo que proporciona una capacidad de direccionamiento de 224 = 16.772.200 bytes = 16 MB. Para acceder a esa dirección lógica de memoria se emplea un selector y un desplazamiento. Ese cálculo lo realiza automáticamente el microprocesador mediante las tablas de descriptores (local, global y de interrupciones).

En el modo DPMI 32-bits, se emplea un modo de definición de memoria plana (sin segmentaciones), en la que sólo se especifica un desplazamiento dentro del único segmento lineal base. Su capacidad de direccionamiento emplea los 32 bits, por lo que las dimensiones de memoria son de: 232 = 4.294.683.296 bytes = 4.096 MB = 4 GB (gigabytes).

Las bases de la norma

Actualmente se suele usar DPMI versión 0.9, aunque ya está muy avanzada la especificación 1.0 Borland, a través de su Run-Time Manager (RTM), se adapta a la norma versión 0,9, pero con ciertos añadidos, en ocasiones importantes.

La especificación DPMI es un estándar comúnmente aceptado; inicialmente se encarga de gestionar el cambio del modo de trabajo Real a Protegido (y viceversa), reservar memoria estándar y extendida (XMS), controlar el sistema de interrupciones y, en definitiva, intercambiar áreas de memoria de máquinas virtuales con la memoria física del DOS.

Siendo ya bastante, la mayor parte de las compañías que implementan hosts DPMI, extienden sus servicios para cubrir aspectos como dar soporte a interrupciones del DOS (int 21h, fundamentalmente) y de la BIOS. Si tomamos como ejemplo las extensiones DPMI de Borland (disponibles para BC++ 4.02, a través del paquete complementario denominado DOS PowerPack, y para Borland Pascal 7.0), trabajan con un conjunto de pares de componentes. Por una parte, RTM.EXE y DPMI16BI.OVL, que actúan de gestor en tiempo de ejecución y de servidor, respectivamente, para el modo Protegido de 16 bits. Y, por otra, 32RTM.EXE y DPMI32VM.OVL, con esas mismas funcionalidades para el modo Protegido de 32 bits.

La aplicaciones que se ejecutan en modo Protegido DPMI, usan el mismo formato de fichero ejecutable que los archivos EXE y DLL de Windows 3.x y OS/2 1.x (el denominado Portable Executable). El gestor en tiempo de ejecución (RTM, Run-Time Manager) se carga encima del host propiamente dicho, dándole servicios adicionales propios de cada constructor.

Por otra parte, y eso nos interesará mucho, sirve para dotar de compatibilidad con gran cantidad de funciones del API de Win16 y Win32 (actualmente, el propio de Windows NT), según los casos. Esa compatibilidad a nivel binario hace que, en el caso de los compiladores de Borland, podamos desarrollar librerías de enlace dinámico (DLL) válidas para Windows y para DOS-DPMI. En muchos aspectos, una aplicación DPMI no es más que una aplicación tipo consola (con apariencia clásica de aplicación DOS cargada desde la línea de comandos) de Windows 3.x, OS/2 1.x o Windows NT.

Las diferencias a la hora de programar son, sin embargo, dependientes del soporte del sistema operativo; por ejemplo, la entrada se realiza en la función WinMain() para las aplicaciones Windows, mientras que se realiza en la función main() en las aplicaciones DOS-DPMI. Por otra parte, la programación en Windows está basada en eventos (transmitidos por medio de mensajes), mientras que la DOS-DPMI es la clásica programación secuencial de una aplicación DOS, sin más diferencias para el programador que una serie de consideraciones acerca de direccionamientos y reservas de memoria.

Puntos esenciales de la programación bajo DPMI

Para casi todos los casos, la disponibilidad de la librería de tiempo de ejecución para emular el API Win16 y Win32, conjuntamente con casi todas las funciones C/C++ estándar, los programadores no tendrán que preocuparse más que de unas cuantas normas generales. Sin embargo, la especificación DPMI sí dispone de funciones propias. Veremos seguidamente qué podemos (y debemos) tomar de cada una de las posibilidades que se nos proporcionan.

Por supuesto, acudir a las funciones de más alto nivel posible. Si empleamos directamente las funciones proporcionadas por las interrupciones 31h y, en ocasiones, 2Fh, nos tocará llevar a cabo las tediosas labores de pasar de modo Real a modo protegido, ejecutar las aplicaciones en dicho modo y retornar al modo Real.. Nada aconsejable, salvo en rarísimas ocasiones en que deseemos una programación en ensamblador, por razones de velocidad crítica en los procesos.

Si, como será lo más habitual, acudimos a lenguajes como Symantec C++, Microsoft Visual C++, Borland C++ o Borland

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información