• No se han encontrado resultados

8.4 MEMORIA EXPANDIDA EMS.

In document El Universo Digital Ibm Pc at y Ps2 (página 178-182)

Capítulo VIII: LA GESTIÓN DE MEMORIA DEL DOS

8.4 MEMORIA EXPANDIDA EMS.

La memoria expandida, como se comentó al principio del capítulo, es una técnica de paginación para solventar la limitación de 640 Kb de memoria de los PC. Hasta la versión 3 del controlador de memoria expandida, esta extensión consiste en un segmento de memoria de 64 Kb (en la dirección 0D0000h o 0E0000h, a veces otras como 0C8000h, etc.) dividido en cuatro páginas adyacentes de 16 Kb. Ese segmento se denomina

marco de página de la memoria expandida. Las cuatro páginas son las páginas físicas numeradas entre 0 y 3.

Cuando un programa solicita memoria expandida, se le asigna un handle de control (un número de 16 bits) que la referencia, así como cierto número de páginas lógicas asociado al mismo. A partir de ese momento, cualquier página lógica puede ser mapeada sobre una de las cuatro páginas físicas. De este modo, es factible acceder simultáneamente a cuatro páginas lógicas entre todas las disponibles. Por ello es posible incluso asignar la misma página lógica a más de una página física, aunque es un tanto absurdo. La principal utilidad de la memoria expandida es de cara a almacenar grandes estructuras de datos evitando en lo posible un acceso a disco. La memoria expandida se implementa con una extensión del hardware, aunque algunos equipos 286 ya la tienen integrada en la placa base. En los 386 y superiores, la CPU puede ser colocada en modo virtual 86, una variante del modo protegido en la que la memoria expandida puede ser emulada por las técnicas de memoria virtual de este microprocesador, sin necesidad de una extensión hardware. Algunos sistemas de memoria expandida real (no emulada) pueden soportar incluso una reinicialización del PC sin perder el contenido de esa memoria. │ │ ─ DFFFF ├─────────────┤ ┌─────────────┐ 16 Kb │ 3 │ ½─ ┐ │ ├─┐ ─ DC000 ├─ ─┤ │ ┌ ½─ ─ A└─┬───────────┘ ├─┐ │ 2 │ ½─ ┤ │ ½─ ─ B└─┬───────────┘ ├─┐ D8000 ├─ ─┤ │½──────────────┤ ½─ ─ C└─┬───────────┘ ├─┐ │ 1 │ ½─ ┤ │ ½─ ─ D└─┬───────────┘ ├─┐ D4000 ├─ ─┤ │ │ ½─ ─ E└─┬───────────┘ ├─┐ │ 0 │ ½─ ┘ │ ½─ ─ F└─┬───────────┘ D0000 ├─────────────┤ └ ½─ ─ G└─────────────┘ MARCO DE PÁGINA DE MEMORIA EXPANDIDA PÁGINAS DE MEMORIA EXPANDIDA ASIGNABLES (PÁGINAS FÍSICAS) (PÁGINAS LÓGICAS)

En este ejemplo se ha solicitado al EMM 8 páginas (numeradas en el gráfico A-G) y cualquiera de ellas puede ser «colocada» (paginada) en cualquiera de las 4 páginas físicas, a elegir.

Para utilizar la memoria expandida hay que invocar la interrupción 67h. Para detectar la presencia del controlador hay dos métodos. El primero consiste en buscar un dispositivo "EMMXXXX0", ya que el gestor de memoria expandida se carga desde el CONFIG.SYS y define un controlador de dispositivo de caracteres con ese nombre. Es tan sencillo como intentar abrir un fichero con ese nombre y comprobar si existe. Desde la línea de comandos del DOS se puede hacer así:

IF EXIST EMMXXXX0 ECHO HAY CONTROLADOR EMS

gracioso haya creado!: para cerciorarse, hay unas funciones de control IOCTL en el DOS para asegurar que se trata de un dispositivo y no de un fichero. Sin embargo, no es recomendable este método para detectar el EMM en los programas residentes y en los controladores de dispositivo: existe otro medio más conveniente para esos casos, que también puede ser empleado de manera general en cualquier otra aplicación. Consiste en buscar la cadena "EMMXXXX0" en el offset 10 del segmento apuntado por el vector 67h (despreciando el offset de dicho vector) ¡así de sencillo!.

Las funciones del EMM se invocan colocando en AH el número de función y ejecutando la INT 67h: a la vuelta, AH normalmente valdrá 0 para indicar que todo ha ido bien. En un apéndice al final del libro se listan y documentan todas las funciones EMS. Estas funciones se numeran a partir de 40h, aunque desde la 4Fh sólo están disponibles a partir de la versión 4.0 del controlador, si bien en muchos casos no son necesarias. Las principales funciones (soportadas por EMS 3.2) son:

40h - Obtener el estado del controlador (ver si es operativo y la memoria EMS puede funcionar bien). 41h - Obtener el segmento del marco de página (no tiene por qué se 0D000h ni 0E000h).

42h - Preguntar el número de páginas libres que aún no están asignadas.

43h - Asignar páginas (esta función devuelve un handle de control, igual que cuando se abre un fichero). 44h - Mapear páginas (colocar una cierta página lógica 0..N en una de las físicas 0..3).

45h - Liberar las páginas asignadas, para que puedan usarlas futuros programas (¡es vital!). 46h - Preguntar la versión del controlador de memoria expandida.

47h - Salvar el contexto del mapa de páginas (usado por los TSR para no alterar el marco de página). 48h - Restaurar el contexto del mapa de páginas (usado por los TSR para no alterar el marco de página). 4Dh - Obtener información de todos los handles que hay y las páginas que tienen asignadas.

La memoria expandida, lejos de ser sólo un invento obsoleto para superar los 640K en los viejos ordenadores, es una de las memorias más versátiles disponibles bajo DOS. Muchos programas pueden ver incrementado notablemente el rendimiento si se desarrollan empleando esta memoria en lugar de la XMS. La razón es que, con la memoria extendida, hay que traerla (copiarla) a la memoria convencional, procesarla y volverla a copiar a la memoria extendida. Sin embargo, con la memoria expandida EMS, una rapidísima función coloca en el espacio de direcciones del 8086 la memoria que va a ser accedida: allí mismo puede ser procesada sin necesidad de movimiento físico. Esto es debido a que la conmutación páginas de memoria expandida se hace, dicho entre comillas, seleccionando el chip de RAM que se utiliza, sin existir movimiento físico de datos. En algunos casos, sin embargo, la EMS no aumenta el rendimiento: por ejemplo, al construir un disco virtual, habrá que transferir datos desde la memoria convencional a la XMS ó la EMS; en cualquier caso se va a producir un movimiento físico (¿qué mas da que sea hacia la EMS que hacia la XMS?).

En los modernos sistemas operativos, la memoria expandida soportada a partir de las versiones 4.0 del EMM (Expanded Memory Manager) cubre un amplio espectro del espacio de direcciones dentro del megabyte gestionado por el MS-DOS. Aquí, las páginas no han de ser necesariamente consecutivas; son más de 4 y tampoco tienen que ser necesariamente de 16 Kb. Sin embargo, por defecto -y por razones de compatibilidad- las cuatro primeras páginas físicas están colocadas adyacentemente por encima de los 640K y son de 16 Kb, no siendo recomendable modificar esta especificación. Por ejemplo, en el sistema 386 en que se escribieron las primeras versiones de este libro, con un EMM 4.0, las páginas físicas 0 a la 3 estaban ubicadas a partir de la dirección 0C8000h; las páginas 4 a la 27h estaban ubicadas entre la dirección 10000h a la 9FFFFh, cubriendo también los primeros 640 Kb (excepto los primeros 64 Kb).

Si alguien está pensando en desviar la interrupción 67h desde un programa residente, para interceptar y manipular las llamadas de los programas de aplicación a esa interrupción, ya puede ir olvidándose. La razón es que los 386 y superiores están en modo virtual 86 con los controladores EMS instalados. Esto significa que cuando un programa invoca una interrupción, como la INT 67h, la CPU -de la manera que está programada- pasa inmediatamente a continuación a ejecutar una rutina en modo protegido fuera del espacio de direcciones del MS-DOS. Con algunos gestores de memoria, como el EMM386 del DR-DOS 6.0, no sucede nada: ese programa supervisor retorna a la tarea virtual y ejecuta el código ubicado en el espacio de direcciones del MS- DOS. Sin embargo, con QEMM386, el controlador de memoria está ubicado fuera de ese espacio de direcciones, y ya no vuelve a él. Si se mira con el DEBUG a donde apunta la INT 67h en una máquina con QEMM (por ejemplo, traceando una llamada a la interrupción), se verá que este vector apunta al siguiente

código:

INT 28h

IRET

Evidentemente, ¡ese no es el controlador de memoria!. Para acceder a él hay que ejecutar una interrupción de verdad. Supongo que a través de la especificación VCPI (Virtual Control Program Interface) que regula el acceso a los modos extendidos del 386, habrá algún medio de poder acceder al código del controlador EMS, o interceptar las llamadas. Sin embargo, no es tan fácil como cambiar un vector...

In document El Universo Digital Ibm Pc at y Ps2 (página 178-182)