Volver a la portada de Duiops
Volver al Web de Duiops
 
   
Google
 
En Internet En duiops.net
Menú
Secciones destacadas
Artículos y FAQs
Trucos de Windows
Versiones de Windows
y suites de software
Windows Vista
Windows Media Center
Windows XP
Windows 2000
Windows Millenium
Windows 98/98 SE
Windows 95 OSR-2
Internet Explorer
Office
Otros
Tutorial muy básico
   
Portada

 

Apúntate a la lista de correo del Web de Duiops

Portada - Artículos y FAQs - Memoria MS-DOS (parte II)
 
Memoria MS-DOS (parte II)

 

Por Jose Manuel Tella Llop, extraído de microsoft.public.es.windows98

MEMORIA MsDOS (memoria real) PARTE II
-------------------------------------------------

Bien, antes de leer este docmento, es interesante leer la primera parte ya publicada.

En ella introdujimos el concepto de UMB (recordad el parametro DOS=UMB en el config.sys). Repasando un poco, estos son los bloques de memoria que quedan entre las direcciones de segemnto A000 y F000. (debido a que pueden existir placas con bios insertadas en nuestro sistema, y además que las bios ocupen direcciones de memoria no consecutivas y por tanto, pueden existir varios huecos.

Además recordemos que las direcciones de segmento B000-B7FF corresponden al adaptador monocromo de video. Como este NO existe ya, estas dirección e, aunque en principio estan reservadas, ya veremos como podemos utilizarlas y recuperar así...... a ver: tarea para quien esté siguiendo esto: ¿cuanta memoria recuperamos así?

Doy la solucion al final.

TODAVIA 64 Ks MAS de MEMORIA
-----------------------------

Y ahora otra virguería más. Cuando se empezó a superar fisicamente la memoria del mega al surgir un par de años mas tarde el 80286, que en modo virtual ya podia manejar mas del mega, evidentemente las placas madre, que antes tenian justo 20 lineas de direcciones (cables fisicos) para poder dirección ar el mega, pasaron a 24 lineas de direcciones (actualmente son 32 lineas de dirección ).

Bien lo importante es que habia más de 20 lineas de direcciones. Desde la denominada A0 hasta la A23 (por lo menos...). Y la A0 a A19 son las lineas que correspondian por similitud con el viejo 8086.

Las malas lenguas comentan que un ingeniero de intel, le "sopló" a alguien de Microsoft, que existia la posibilidad de seleccionar como operativa por software la linea A20, y que ademas, teoricamente el sultimo segemnto de memoria, no tenia porqué ser el F000, sino que podia ser el FFFF y como luego el offset puede variar desde 0000 a FFFF, podriamos conseguir 64 Kbs mas de memoria real. Vamos a detallarlo: si sumano el segmento anterior con el maxio offset, nos dá:

FFFF ->      FFFF0
                       FFFF
                     ---------
                   10FFEF

Fijemonos que las 20 primeras lineas de direcciones, corresponden a los 5 ultimos cuarteso anteriores (5*4 = 20). Si la linea A20 (fisicamente la 21, ya que se cuenta desde A0), esta activa, estamos dirección ando por encima del MEGA hasta una cantidad FFEF bytes "más", ya que el mega corresponde a 100000 JUSTO !!!!!

Por tanto podemos obtener hasta 64Kbs (menos 15 bytes) más.

Bueno, pues entonces, a esta memoria se la llamó HIGH (recordad el parametro

DOS=HIGH)

HIMEM.SYS
------------

Y ahora, para poder activar la linea A20, se creo el dispositivo HIMEM.SYS (maneja la A20, además de otras cosas: es capaz de poner a trabajar el procesador en modo virtual 386, y dá soporte a la memoria XMS -extendida-. Recordad: memoria "extendida").

El HIMEM.SYS, se carga siempre en Windows,aunque no lo tengamos declarado en el config.sys. Windows, sino lo encuentra, lo carga (puede comprobarse, arrancando paso a paso y vemos que lo carga aunque no lo tengamos en el config).

Debido a que muchos programas pueden no estar preparados para "sumar" correctamente direcciones con el segmento FFFF, se decidio dejar este area en principio reservada unicamente para el sistema operativo, entonces se pueden cargar parte del sistema operativo allí y por tanto dejar libre mas zona de memoria baja. Pero IMPORTANTE: para ello, debe existir el parametro DOS=HIGH en el config.sys.

EMM386
-----------

Y ahora vayamos a ver como podemos utilizar los 32 Kbs de la zona de video, y además utilizar los huecos (UMB) que existen en la memoria por encima de los 640 Ks, al objeto de dejar lo maximo posible en la zona de memoria "contigua" por debajo de los 640 Ks.

Bien, para ello, se creo el EMM386.EXE. Este se debe ejecutar en el config.sys, y ademas, si lo ponemos, es obligatorio añadir "a mano" en HIMEM.SYS.

El EMM386, tiene varias funciones (y admite muchos parametros, pero vamos a ver los mas importantes unicamente). Dentro de dichas funciones están:

1) soporte a los bloque de memoria alta UMB
2) gestion de la memoria expandida: EMS (luego lo explicaré, pero lo
importante es no equivocarla con la "extendida: XMS" vista anteriormente)
3) Posibilidad de incluir (o incluso excluir) bloques de memoria superior
para el MsDOS.

Para el punto 1) es obligatorio dos cosas: el parámetro DOS=UMB en cualquier sitio del config, y que el EMM386, tenga en su linea de parametros, o el parametro RAM o el parametro NOEMS (debido a que el parametro NOEMS implica -> RAM)

Bien si no ponemos NOEMS, por defecto, asume que queremos memoria expandida. Y ¿que es esto?, pues realmente es otra manera de gestionar la memoria. En realidad no es del todo correcto, ya que al principio de los tiempos, se podia gestionar la memoria por encima del mega mediante hardware. ¿como? pues relativamente facil, se deja un marco de pagina en memoria real de 64 Ks. (reservados). Y la memoria por encima del mega, se "pagina" por decirlo de alguna manera, en ese marco. Por tanto si tengo la pagina 23 por ejemplo, de memoria por encima del mega, paginada en ese marco, y suponiendo que es de 64 Ks, cada vez que lea o escriba en el marco (por debajo del mega), es como si estoy leyendo / escribiendo en un area por encima del mega. A peticion, puedo cambiar por hardware para que el marco de pagina, vea otra "pagina" de 64 Ks.... etc... No sé si esto me ha quedado muy claro, pero sin dibujar con papel y lapiz, yo me explico muy mal.....

(realmente aunque el marco de pagina puede ser de hasta 64 Ks, las paginas son de 16, por lo que puede tener hasta 4 paginas.... pero esto es entrar demasiado en detalles).

Bien, pues el EMM386, lo que hizo fué sustituir al hardware inicial encargado de esto. Lo que hace es le mide memoria XMS (extendida) al HIMEM.SYS (por eso necesita de él). Luego reserva un marco de pagina (normalmente en el segmento E000, de 64 Ks), y se encarga de "simular" esa paginacion en el marco de pagina.

NOTA: Este tipo de memoria, está obsoleto, y además no le gusta nada al Windows,pero ciertos programas DOS muy viejos y sobre todo algun juego DOS muy viejo, necesita de esta memoria).

*** Ademas, con el parametro I=B000-B7FF, podemos indicarle al EMM386, que incorpore los 32 Ks adicionales de la memoria de video monocromo. PERO, y siempre hay un PERO, esto NO debe hacerse si utilizamos multimonitor en win98. En este caso, las bios de las tarjetas de video, necesitan ese area de memoria.

Por tanto existen dos maneras basicas de poner el EMM386 en el config.sys

1) device=c:\windows\emm386.exe RAM I=B000-B7FF
2) device=c:\windows\emm386.exe NOEMS I=B000-B7FF

(evidentemente con la opcion 2) tenemos 64 Ks mas de memoria superior ya que no existe el marco de pagina, pero por contra, no dispondremos de memoria EMS, que realmente no es importante, ya que prácticamente nadie la va a necesitar)

Y a partir de este momento, ya podemos utilizar o bien "devicehigh" o "instalhigh" en el config, o bien "lh" en el autoexec, para cargar los dispositivos que necesitemos en las zonas de memoria UMB.

Aunque tanto devicehigh como lh, se pueden especificar con parametros (unos numeros que indican tamaño maximo en inicializacion, tamaño final, y region de memoria), mi consejo es no utilizar esos numeros y que sea el sistema quien lo gestione. Los parametros estaban pensados para el viejo "memmaker" y el viejo DOS 6.22)

***************

SOLUCION AL PROBLEMA PLANTEADO ANTERIORMENTE
-------------------------------------------------------

Las direcciones de segmento B000 realmente corresponden a un segemnto B000 con offset 0000 (es decir B000:0000) y la B7FF es la B800 menus justo un byte. Es decir B800 con offset -1

Recordar que para obtener la dirección dreal se desplaza 4 bites (un cuarteto) cada segmento y se suma al offset. Por tanto tenemos las direcciones:

B7FFF y B0000 por tanto el espacio sería: 7FFF y utiliznado la calculadora de Windows y telceando en hexadecimal y luego convirtiendo a decimal, nos dá justito 32 Kb.


Volver a Artículos y FAQs

 

     
 

Volver arriba Volver arriba

© 1997-2008 Duiops (http://www.duiops.net)
Prohibida la reproducción parcial o total de los textos o las imágenes

Para comentarios, usa las direcciones e-mail de contacto.