You are on page 1of 10

BLOQUES DE MEMORIA.

Vamos ahora a conocer con profundidad la manera en que el sistema operativo DOS gestiona la memoria; un tema poco tratado, ya que esta informaci n no est oficialmente documentada por Microsoft. Los bloques de memoria en el DOS son agrupaciones de bytes siempre m ltiplos enteros de 16 bytes: en realidad son agrupaciones de p rrafos. La memoria de un PC -siempre bajo DOS- est , por tanto, dividida en grupos de p rrafos. Por tanto, una palabra de 16 bits permite almacenar la direcci n del p rrafo de cualquier posici n de memoria dentro del megabyte direccionable por el 8086. Todo bloque de memoria tiene asociado un propietario, que bien puede ser el DOS o un programa residente que haya solicitado al DOS el control de dicho bloque. Cuando se ejecuta un programa, el sistema crea dos bloques para el mismo: el bloque de memoria del programa y el bloque de memoria del entorno. 8.2.1. - El bloque de memoria del programa. Cuando se ejecuta un programa, el DOS busca el mayor bloque de memoria disponible (convencional o superior, seg n sea el caso) y se lo asigna -y no el bloque m s cercano a la direcci n 0, como algunos afirman-. Este rea recibe el nombre de bloque de programa o segmento de programa. La direcci n del primer p rrafo del mismo es de suma importancia y se denomina PID (Process ID, identificador de proceso). En los primeros 256 bytes de este rea el DOS crea el PSP ya conocido -256 bytes- formado por varios campos de informaci n relacionada con el programa. Tras el PSP viene el c digo del programa ejecutable. Para los objetivos de este cap tulo basta con conocer dos campos del PSP: el primero est en su offset 0 y son dos bytes (por tanto, los primeros dos bytes del PSP) que contienen la palabra 20CDh ( 27CDh en algunos casos). Esto se corresponde con el c digo de operaci n de la instrucci n ensamblador INT 20h (o INT 27h); esto es as por razones hist ricas heredadas del CP/M. Por ello, cuando un programa finaliza, puede hacerlo con un salto al inicio del PSP (un JMP 0 en los programas COM) donde se ejecuta el

INT 20h, aunque normalmente el programador ejecuta directamente el INT 20h que es m s seguro. El otro campo del PSP que nos interesa es el offset 2Ch: en l hay una palabra que indica el p rrafo donde comienza el bloque de entorno asociado al programa. 8.2.2. - El bloque del entorno. El espacio de entorno del COMMAND.COM es el bloque de entorno del COMMAND.COM (que podemos considerar como un programa residente). Es una zona de memoria donde se almacenan las variables de entorno definidas con el mandato SET del sistema, as como con algunos comandos como PATH, PROMPT, etc. Por ejemplo, la orden PATH C:\DOS es an loga a SET PATH=C:\DOS. Las variables de entorno pueden consultarse con SET (sin par metros). las variables de entorno sirven para crear informaci n que puedan usar m ltiples programas, aunque se usan poco en la realidad. Cuando un programa es cargado, adem s del bloque de memoria del programa se crea el bloque del entorno. Se trata de una vulgar copia del espacio de entorno del COMMAND.COM; de esta manera, el programa en ejecuci n tiene acceso a las variables de entorno del sistema aunque no las puede modificar (estar a modificando una mera copia). Las variables de entorno se almacenan en formato ASCIIZ ordinario (esto es, terminadas por un byte a cero) y tienen una sintaxis del tipo VARIABLE=SU VALOR. Tras la ltima de las variables hay otro byte m s a cero para indicar el final. Despu s de esto, y s lo a partir del DOS 3.0, viene una palabra que indica el n mero de cadenas ASCIIZ especiales que vienen a continuaci n: normalmente 1, que contiene una informaci n muy til: la especificaci n completa del nombre del programa que est siendo ejecutado -incluida la unidad y ruta de directorios- lo que permite a los programas saber su propio nombre y desde qu directorio est n siendo ejecutados y, por tanto, d nde deben abrir sus ficheros (por educaci n no es conveniente hacerlo en el directorio ra z o en el actual). En el espacio de entorno del COMMAND, este a adido del DOS 3.0 y posteriores parece no estar definido.

8.2.3. - Los bloques de control de memoria (MCB's). Todos los bloques de memoria (tanto programa como entorno) vienen precedidos por una cabecera de un p rrafo (16 bytes) que almacena informaci n relativa al mismo. Esta cabecera recibe el nombre t cnico de MCB (Memory Control Block) y tiene la siguiente estructura: En el offset 0 se sit a el byte de marca (4Dh si no es el ltimo MCB de la cadena de MCB's en memoria, 5Ah si es el ltimo), en el offset 1 hay una palabra que indica el PID del programa propietario del bloque, en el offset 3 otra palabra indica el tama o (como siempre, p rrafos) del bloque, sin incluir este p rrafo del MCB. Los bytes que van del 5 al 7 est n reservados. Entre el 8 y el 15 se sit a el nombre del programa propietario, aunque esta informaci n s lo existe en los bloques de programa y con MSDOS 4.0 posterior (tambi n en DR-DOS 5.0/6.0, aunque este operativo es aparentemente un DOS 3.31). El nombre acaba con un cero si tiene menos de 8 caracteres (en DR-DOS 5.0 acaba siempre con un cero, trunc ndose el 8 car cter si lo hab a; esta errata ha sido corregida en DR-DOS 6.0). 8.2.4. - La cadena de los bloques de memoria. Cuando un programa finaliza su ejecuci n, normalmente el DOS libera su bloque de memoria y de entorno. Sin embargo, los programas residentes permanecen con el bloque de memoria y de entorno en la RAM del sistema, hasta que se les desinstale o se reinicialice el equipo. Los buenos programas residentes suelen liberar el bloque de memoria del entorno antes de terminar, con objeto de economizar una memoria que normalmente no usan (entre otras razones porque tiene un tama o variable e impredecible). Como m nimo existen dos programas residentes en todo momento: el n cleo (kernel) del sistema operativo y el COMMAND.COM, aunque los usuarios suelen a adir el KEYB y, en muchos casos, el PRINT, APPEND, GRAPHICS, GRAFTABL, NLSFUNC, SHARE, etc. Como todos los bloques de memoria est n ubicados unos tras otros, y adem s se conoce el tama o de los mismos, es factible hacer un programita que recorra la cadena de bloques de

memoria hasta que se encuentre uno cuyo byte de marca valga 5Ah ( ltimo MCB), pudi ndose identificar los programas residentes cargados y la memoria que emplean. La direcci n del primer MCB era al principio un secreto de Microsoft, aunque hoy casi todo el mundo sabe que las siguientes l neas:
MOV AH,52h INT 21h MOV AX,ES:[BX-2]

devuelven en AX la direcci n del primer MCB de la cadena, utilizando la funci n indocumentada 52h del sistema operativo. 8.2.5. - Relaci n entre bloque de programa y de entorno. El siguiente esquema aclarar la relaci n existente entre el bloque de programa y el de entorno. Los valores num ricos que figuran son arbitrarios (pero correctos).

8.2.6. - Tipos de bloques de memoria. B sicamente existen cinco tipos de bloques de memoria: bloques de programa, de entorno, del sistema, bloques de datos y bloques libres. Los dos primeros ya han sido ampliamente explicados. Los bloques del sistema se corresponden con el kernel o n cleo del sistema operativo o los dispositivos instalables; normalmente tienen su PID como 0008. En los nuevos sistemas operativos y en las m quinas donde la cadena de bloques de memoria puede avanzar por encima de los 640 Kb, las zonas correspondientes a RAM de v deo y extensiones BIOS suelen tener un PID 0007 en DR-DOS (que indica rea excluida) 0008 (MS-DOS 5.0) y son consideradas como bloques de memoria ordinarios, aunque s lo sea para saltarlos de alguna manera. Los bloques libres tienen un PID 0000. El PID 0006 (s lo aparece en DR-DOS) indica que se trata de un bloque de memoria superior XMS. Los bloques de datos aparecen en raras ocasiones, debido al uso de las funciones del sistema operativo para localizar bloques de memoria. Cuando un programa se ejecuta, tiene asignada la mayor parte de la memoria para s , pero es perfectamente factible que solicite al DOS una reducci n de la

memoria asignada (funci n 4Ah) y, con los Kb que haya liberado, puede volver a llamar al DOS para crear bloques de memoria (funci n 48h) o destruirlos (con la funci n 49h). A la hora de recorrer la cadena de bloques de memoria, si se sigue el siguiente orden de evaluaci n el resultado ser siempre correcto: en primer lugar, si aparece un PID 0000 significa que es un bloque libre. Si el PID no apunta a un PSP (no apunta a un rea que empieza por 20CDh 27CDh) se trata entonces de un bloque del sistema. Si el PID apunta al MCB+1, se trata de un bloque del programa (recu rdese que el MCB lo precede inmediatamente). Si el PID apunta a un PSP en cuyo offset 2Ch una palabra apunta al MCB+1, se trata del bloque del entorno de ese PSP. Si no es ninguno de estos ltimos bloques, por eliminaci n ha de ser un bloque de datos. 8.2.7. - Liberar el espacio de entorno en programas residentes. Resulta triste ver como algunos sofisticados programas residentes llegan incluso a autorrelocalizarse en memoria machacando parte del PSP con objeto de economizar algunos bytes; despu s un alto porcentaje de los mismos se olvida de liberar el espacio de entorno, que para nada utilizan y que suele ocupar incluso m s memoria que todo el PSP. La manera de liberar el espacio de entorno antes de que un programa quede residente es la siguiente (necesario DOS 3.0 como m nimo si se obtiene la direcci n del PSP utilizando la funci n 62h):
MOV AH,62h INT 21 ; obtener direcci n del PSP en BX MOV ES,BX MOV ES,ES:[2Ch] ; direcci n del espacio de entorno MOV AH,49h ; funci n para liberar bloque INT 21h ; bloque destruido

Alternativamente, se puede liberar directamente el bloque de memoria del entorno poniendo directamente un 0 en su PID, aunque es menos elegante. Si ES apunta al PSP:
MOV DEC MOV MOV AX,ES:[2Ch] ; direcci n del espacio de entorno AX ; apuntar a su MCB ES,AX WORD PTR ES:[1],0 ; liberar bloque (PID=0)

8.2.8. - Peculiaridades del MS-DOS 4.0 y posteriores. La informaci n siguiente explica las particularidades de los bloques de memoria con MS-DOS 4.0 y posteriores; no es v lida para DR-DOS aunque algunos aspectos concretos puedan ser comunes. Desde el MS-DOS 3.1, el primer bloque de memoria es un segmento de datos del sistema, que contiene los drivers instalados desde el CONFIG.SYS. A partir del DOS 4.0, este bloque de memoria est dividido en subbloques, cada uno de ellos precedidos de un bloque de control de memoria con el siguiente formato: offset 0: Byte, indica el tipo de subsegmento: "D" - controlador de dispositivo "E" - extensi n de controlador de dispositivo "I" - IFS (Installable File System) driver "F" - FILES= ( rea de almacenamiento de estas estructuras, si FILES>5) "X" - FCBS= ( rea de almacenamiento de estas estructuras) "C" BUFFERS= /X ( rea de buffers en memoria expandida) "B" - BUFFERS= ( rea de buffers) "L" - LASTDRIVE= ( rea de almacenamiento de las CDS) "S" - STACKS= (zona de c digo y datos de las pilas del sistema) "T" INSTALL= ( rea transitoria de este mandato) offset 1: Palabra, indica d nde comienza el subsegmento (normalmente a continuaci n) offset 3: Palabra, indica el tama o del subsegmento (en p rrafos) offset 8: 8 bytes: en los tipos "D" e "I", nombre del fichero que carg el driver. Por tanto, desde el DOS 4.0, una vez localizado el primer MCB, puede despreciarse y tomar el que viene inmediatamente a continuaci n (p rrafo siguiente) para recorrer los subsegmentos conectados. En el DOS 5.0 y siguientes, los bloques propiedad del sistema tienen el nombre "SC" (System Code, c digo del sistema o reas de memoria superior excluidas) o bien "SD" (System Data, con controladores de dispositivo, etc.). Desde la versi n 5.0

del DOS, estos bloques "SD" contienen subbloques con las mismas caracter sticas que los del DOS 4.0. Adicionalmente, el DOS 5.0 introdujo los bloques denominados UMB que recorren la memoria superior, en las diferentes reas en que puede estar fragmentada. Acceder a estos bloques de control de memoria es bastante complicado: el segmento donde empiezan est almacenado en el offset 1Fh de la tabla de informaci n sobre buffers de disco, cuya direcci n inicial a su vez se obtiene en el puntero largo que devuelve en ES:BX+12h la funci n indocumentada Get List of Lists (52h): normalmente el resultado es el segmento 9FFFh. En general, es m s sencillo ignorar la memoria superior como una entidad independiente y recorrer toda la memoria sin m s. Sin embargo, para poder acceder a los bloques de memoria superior stos han de estar ligados a los de la memoria convencional: para conectarlos, si no lo est n, puede emplearse la funci n, tradicionalmente indocumentada (aunque recientemente ha dejado de serlo) Get or Set Memory Allocation Strategy (58h) del DOS: es conveniente preservarla antes y volver a restaurar esta informaci n despu s de alterarla. En cualquier caso, el formato de los bloques de control UMB es el siguiente: offset 0: Byte con valor 5Ah para el ltimo bloque y 4Dh en otro caso. offset 1: Palabra con el PID. offset 3: Palabra con el tama o del bloque en p rrafos. offset 8: 8 Bytes: "UMB" si es el primer bloque UMB y "SM" si es el ltimo. 8.2.9. - C mo recorrer los bloques de memoria. La organizaci n de la memoria var a seg n la versi n del sistema operativo instalada. En l neas generales, todo lo comentado hasta ahora -excepto lo del apartado anterior- es v lido para cualquier versi n del DOS. Sin embargo, en las m quinas que tienen memoria superior, las cosas pueden cambiar un poco en esta zona de memoria: si tienen instalado alg n gestor de memoria extra o, este rea puede estar desconectada por completo de los primeros 640 Kb. Con DR-DOS el usuario puede utilizar el comando MEMMAX para habilitar o inhibir el acceso a la memoria superior; desde el MS-DOS 5.0 existen funciones

espec ficas del sistema para estas tareas. El programa de ejemplo listado m s abajo recorre toda la memoria sin adentrarse en las particularidades de ning n sistema operativo. Tan s lo se toma la molestia de intentar detectar si existe memoria superior y, en ese caso, mostrar tambi n su contenido. Este algoritmo puede no ense ar todo lo que podr a ense ar gracias a las ltimas versiones del DOS, pero s gran parte, y funciona en todas las versiones. Para comprobar si existe memoria superior utiliza una t cnica muy sencilla: al alcanzar el ltimo bloque de memoria, se comprueba si el siguiente empezar a en el segmento 9FFFh en vez del A000h como cabr a esperar en una m quina de 640Kb (s lo suelen tener memoria superior las m quinas que al menos tienen 640 Kb). Si esto es as no se considera que el bloque sea el ltimo y se prosigue con el siguiente, saltando la barrera de los 640 Kb. En este caso, obviamente, los 16 bytes que faltan para completar los 640 Kb de memoria son precisamente un MCB. Esta t cnica funciona s lo a partir del MS-DOS 5.0; en DR-DOS 6.0, si la memoria superior est inhibida con MEMMAX -U, no funciona (DR-DOS 6.0 se encarga de machacar el ltimo MCB de la memoria convencional y no deja ni rastro) aunque s con MEMMAX +U. Tambi n se imprime el nombre de los programas, aunque en DOS 3.30 y versiones anteriores salga basura. Adem s, el PID de tipo 6 se interpreta como un bloque de memoria superior XMS -que se estudiar en el siguiente apartado de este mismo cap tulo- bajo DR-DOS 6.0, imprimi ndose tambi n el nombre. La primera acci n de MAPAMEM al ser ejecutado es rebajar la memoria que tiene asignada hasta el m nimo necesario; por ello en el resultado figura ocupando s lo 1440 bytes y teniendo tras de s un gran bloque libre. Es conveniente que los programas rebajen al principio la memoria asignada con objeto de facilitar el trabajo bajo ciertos entornos pseudo-multitarea soportados por el DOS; de hecho, es norma com n en el c digo generado por los compiladores realizar esta operaci n al principio. Sin embargo, no todo el mundo se preocupa de ello y, a fin de cuentas, tampoco es tan importante. Un ejemplo de la salida que puede producir este programa es el siguiente, tomado de una m quina

con memoria superior y bajo los dos sistemas operativos m s comunes (aunque en los ejemplos los espacios de entorno han coincidido junto al bloque de programa, ello no siempre sucede as ). Las diferentes ocupaciones de memoria de los programas en ambos sistemas operativos se deben frecuentemente a que se trata de versiones distintas: DR-DOS 6.0 MS-DOS 5.0
MAPAMEM 2.2 MAPAMEM 2.2 - Informaci n sobre la memoria del sistema. - Informaci n sobre la memoria del sistema. Tipo Ubicaci n Tama o PID Propietario Tipo Ubicaci n Tama o PID Propietario -------- --------- ------- ----- ---------------------- --------- ------- ----- -------------Sistema 0000-003F 1.024 Interrupciones Sistema 0000-003F 1.024 Interrupciones Sistema 0040-004F 256 Datos del BIOS Sistema 0040-004F 256 Datos del BIOS Sistema 0050-023C 7.888 Sistema Operat. Sistema 00500252 8.240 Sistema Operat. Sistema 023E-02FD 3.072 0008 Sistema 0254-045F 8.384 0008 Programa 02FF-031E 512 02FF COMMAND Sistema 04610464 64 0008 Entorno 0320-033F 512 02FF COMMAND Programa 0466050E 2.704 0466 COMMAND Datos 0341-0358 384 02FF COMMAND Libre 05100513 64 0000 <Nadie> Programa 035A-03EE 2.384 035A MATAGAME Entorno 0515-0544 768 0466 COMMAND Entorno 03F0-0408 400 040A KEYRESET Entorno 05460567 544 0569 MAPAMEM Programa 040A-041D 320 040A KEYRESET Programa 0569-05C2 1.440 0569 MAPAMEM Entorno 041F-0437 400 0439 MAPAMEM Libre 05C49FFE 631.728 0000 <Nadie> Programa 0439-0492 1.440 0439 MAPAMEM Sistema A000D800 229.392 0008 Libre 0494-9FFE 636.592 0000 <Nadie> Sistema D802E159 38.272 0008

Sistema A000-DEFF 258.048 0007 Libre E15B-E17F 592 0000 <Nadie> Sistema DF01-E477 22.384 0008 Programa E181-E18D 208 E181 DOSVER Sistema E479-E483 176 0008 Programa E18F-E23C 2.784 E18F NLSFUNC Sistema E485-E48D 144 0008 Programa E23E-E3AF 5.920 E23E GRAPHICS Sistema E48F-E591 4.144 0008 Programa E3B1-E533 6.192 E3B1 SHARE Sistema E593-E7DA 9.344 0008 Programa E535-E637 4.144 E535 DOSKEY Sistema E7DC-E806 688 0008 Programa E639-E7E2 6.816 E639 PRINT Sistema E808-E810 144 0008 Programa E7E4-E840 1.488 E7E4 RCLOCK Sistema E812-E81A 144 0008 Programa E842-E862 528 E842 DISKLED Sistema E81C-E8DE 3.120 0008 Programa E864-ECF0 18.640 E864 DATAPLUS Programa E8E0-EA51 5.920 E8E0 GRAPHICS Programa ECF2-ED59 1.664 ECF2 HBREAK Programa EA53-EA60 224 EA53 CLICK Programa ED5BED7E 576 ED5B ANSIUP Programa EA62-EA6E 208 EA62 DOSVER Programa ED80-ED8C 208 ED80 PATCHKEY Programa EA70-EA7F 256 EA70 ALTDUP Programa ED8E-ED93 96 ED8E TDSK Area XMS EA81-EA8F 240 0006 B1M92VAC Datos ED95F6D4 37.888 ED8E TDSK Programa EA91-EAC0 768 EA91 VSA Libre F6D6F6FF 672 0000 <Nadie> Area XMS EAC2-EB17 1.376 0006 RCLOCK Area XMS EB19-EB30 384 0006 DISKLED Programa EB32-EDB4 10.288 EB32 VWATCH Area XMS EDB6-EEEC 4.976 0006 DATAPLUS Area XMS EEEE-EF4F 1.568 0006 HBREAK Libre EF51-EFFE 2.784 0000 <Nadie> Sistema F000-F5FF 24.576 0007 Sistema F601-F6FF 4.080 0008

Listado de MAPAMEM 2.2

You might also like