Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Tecnología del PC

[Home]  [Inicio]  [Índice]


5.1  Direccionar la Memoria

§1  Sinopsis

El direccionamiento de la memoria puede considerarse desde dos puntos de vista:  Físico y lógico.  El primero se refiere a los medios electrónicos utilizados en el ordenador para acceder a las diversas posiciones de memoria.  El segundo, a la forma en que se expresan y guardan las direcciones.  En este epígrafe nos referiremos exclusivamente a la forma en que son tratadas las direcciones de memoria del PC.  Advirtiendo desde ahora, que este asunto, como muchos otros, ha sufrido mutaciones a lo largo del tiempo, y que arrastra modos que solo tienen una justificación de tipo histórico, en razón de las características del hardware de los primeros PC's.

§2  Notación

El sistema de numeración utilizado por los informáticos para representar las direcciones de memoria en el texto escrito no suele ser la decimal (como parecería razonable), sino el hexadecimal ( E2.2.4b).

La razón es que los números hexadecimales guardan cierta concordancia con las potencias de 2.  Por ejemplo, un bus de direcciones de 8 bits puede acceder a 256 posiciones (en hexadecimal es el rango 00-FFh).  En caso de direcciones de 16 bits, se puede acceder 65.536 posiciones (es el rango 0000-FFFFh).  El bus de direcciones del PC XT, que tiene 20 bits, las posibilidades son 1.048.576 (es el rango 00000-FFFFFh).

Como veremos a continuación, puede utilizarse una doble notación:  Direcciones absolutas, indicadas por un hexadecimal de cinco dígitos, en el rango 00000-FFFFFh, o en direcciones segmentadas, que utiliza dos grupos de cuatro dígitos hexadecimales.

§3  Direccionamiento segmentado

Hemos indicado que el bus de direcciones del PC XT era de 20 bits ( H2), por lo que teóricamente podían manejarse un total de 220 posibilidades (1.048.576).  Sin embargo, el procesador 8088 utilizado tiene registros de 16 bits, por lo que solo puede contener directamente 216 posiciones (65.536).

La solución consistió en expresar las direcciones mediante dos palabras de 16 bits, denominadas desplazamiento y segmento que, por consiguiente, pueden ser representadas mediante un hexadecimal de cuatro cifras en el rango 0000-FFFFh.  Estas dos palabras pueden ser traducidas a una dirección de 20 bits mediante la operación denominada suma con desplazamiento.  Por ejemplo, suponiendo que el desplazamiento y el segmento fuesen respectivamente ABCDh y E1FAh, la forma de obtener la dirección resultante es como sigue:

Una de las palabras, el desplazamiento, se desplaza una posición añadiéndole un cero a la derecha (equivale a multiplicarla por 16, ya que las direcciones se expresan en hexadecimal).  En nuestro caso, si el desplazamiento es ABCDh resulta ABCD0h.  Puesto que inicialmente es un hexadecimal de 4 cifras (ABCD en nuestro caso), el desplazamiento la transforma en un hexadecimal de 5 cifras (ABCD0).  El valor obtenido se suma con el valor del segmento (E1FAh), así que la dirección resultante, sería  B9ECAh.  Para distinguirla de la anterior, esta última forma se denomina dirección absoluta.

Nota:  Es frecuente escribir las direcciones segmentadas en forma de los dos cantidades separadas por dos puntos, poniendo a la izquierda el valor más alto (el desplazamiento) y a la derecha el más bajo (el segmento).  En forma segmentada, la dirección anterior se expresaría  ABCD:E1FA , y es equivalente a la dirección absoluta B9ECAh.

§4  Segmentos y párrafos

Esta forma de representación segmentada de las direcciones es en realidad una imagen de cómo son manejadas internamente en el procesador.

Los procesadores 8088 tienen registros de 16 bits que pueden servir para almacenar los desplazamientos, es decir, cualquier dirección dentro de una zona de 64 KB (que se conoce como segmento).  Disponen además de 4 registros de segmento de 16 bits (CS, SS, DS y ES H3.2), en los que se almacenan las direcciones de inicio del segmento activo en cada momento.  Resulta así, que pueden direccionar un total absoluto de 1MByte, y hasta 64 x 4 = 256 KB sin necesidad de cambiar los registros de segmento.  Esto es lo que se conoce como funcionamiento en modo real (como puede verse, en realidad es una forma de manejar la memoria).


La figura adjunta muestra como se utilizan los registros para señalar las direcciones de inicio de los diversos módulos de un programa cargado en memoria ( E1.3.2) dentro del espacio de memoria direccionable con 20 bits (00000-FFFFFh).

En la figura 1 se muestra una división de este "Mega" en 16 segmentos cuyos desplazamientos son justamente 0h, 1h, 2h ... Fh.

§5  Modelos de memoria DOS

Las 220 posibilidades de direccionamiento antes comentadas, constituyen el famoso límite del "Megabyte" de memoria de los primeros PC's, de los cuales se reservaron los no menos famosos 640 primeros KBytes como máximo disponible para programas de usuario.

Nota:  Como verá a continuación, gran parte del "Sistema" se cargaba en realidad en la memoria supuestamente reservada a usuario, con lo que en realidad el especio para programas de aplicación resultaba siempre muy precario.

Desde entonces, y en referencia a que el sistema operativo era MS-DOS, el primer Megabyte de memoria se conoce como Memoria DOS; los primeros 640 KB como memoria convencional o memoria base. Los 384 KB restantes (1024 - 640) son la memoria superior o "del Sistema" ("Upper memory").  Esta zona superior contenía cosas como adaptadores y memoria de video; chips de la ROM-BIOS;  ROMs de los controladores de disco, y adaptadores de red, aunque existían "agujeros" sin uso que podían ser aprovechados.

En la figura 1 se muestra un mapa aproximado de la distribución de esta memoria en el Sistema MS DOS.

Nota:  Aunque para el programador toda esta memoria RAM es un único espacio lógico, muchas de estas "cosas" están físicamente fuera de lo que es la memoria RAM (si se abre la caja del ordenador).  Por ejemplo, gran parte de la memoria de video está físicamente en las propias placas de los adaptadores de video.

Los programas DOS requieren la existencia de una zona contigua de memoria convencional (preferiblemente de 640 KB), aunque en realidad este espacio debe ser compartido con la tabla de vectores de interrupción; área de datos de la ROM BIOS ( H4) y buena parte del propio Sistema Operativo DOS.  Por ejemplo, controladores de dispositivos (los famosos "device=..." del fichero CONFIG.SYS).  Como consecuencia de la escasez de espacio, se desarrollaron técnicas para permitir que controladores de dispositivos y TSR's [2] se cargaran en otras zonas de memoria.  Generalmente este tipo de instrucciones de carga se sitúan en los ficheros CONFIG.SYS y AUTOEXEC.BAT, y aprovechan que no todo el espacio de memoria superior es utilizado por el Sistema, de modo que existen zonas ociosas en las que podían situarse los citados controladores.

§6  Memoria expandida

Muy pronto se comprobó que el Megabyte de memoria inicialmente previsto era claramente insuficiente, por lo que se arbitraron diversos tipos de soluciones.  Los ingenieros de software, en cooperación con los de hardware, debieron hacer verdaderos juegos malabares para tratar de suplir la cortedad de miras de los diseñadores del PC [1].

Concretamente hubo dos soluciones que fuero muy utilizadas y populares en su época.  La primera, fue resultado de una iniciativa conjunta de Lotus e Intel, que desarrollaron una variedad de la técnica de direccionamiento conocida como conmutación de bancos, a la que llamaron EMS ("Expanded Memory Specification"), que proporcionaba 8 MB de espacio adicional.  Más tarde fue aceptada también por Microsoft con alguna pequeña modificación, pasando a denominarse especificación de memoria expandida LIM (Lotus, Intel Microsoft).

Poco más tarde Quadram, Ahston-Tate y el fabricante de tarjetas de memoria AST publicaron otra más flexible denominada EEMS ("Enhanced EMS"); además, la especificación LIM fue perfeccionada para proporcionar 32 MB adicionales mediante una combinación hardware/software.  El procedimiento consistía en añadir al ordenador una placa adicional de memoria de conmutación de bancos de hasta 32 MB, que era conducida por un "driver" adecuado, el EMM ("Expanded Memory Manager") cargado por el CONFIG.SYS.

El truco consiste en que en un área en desuso de la memoria superior , se sitúa una zona 64 KB, denominada marco de página,  en la que existen 4 secciones de 16 KB (ventanas) que se emplean como punteros a una página más grande en la memoria de conmutación de bancos.  Los programas podían utilizar segmentos de datos muy grandes ( E1.3.2), ya que el gestor de memoria EMM se encargaba de traer automáticamente a la "ventana" la zona necesaria en cada momento.

§7  Modo protegido y memoria extendida

La especificación EMS de Lotus/Intel/Microsoft, permitía manejar grandes cantidades de datos (ahora no nos parecen tan grandes), pero no resolvía el problema de grandes cantidades de código, ya que el segmento de código no podía manejarse de esta forma.  Esto presentaba problemas no solo para programas grandes, sino para cualquier intento de multiprogramación ( 1.7), cuando varios programas deben coexistir en memoria.

Como siempre, la solución vino de la mano de otro avance tecnológico; en este caso, la aparición del procesador Intel 80286, que en 1982 inició la era del PC AT.  Este micro permite un acceso a memoria que recuerda vagamente la especificación EMS, pero de forma nativa, ya que los mecanismos están incluidos en el procesador.  Como la política de Intel ha sido mantener compatibilidad con los micros anteriores, el 80286 podía trabajar en modo real, imitando el funcionamiento del 8088 , mientras que la nueva forma se denominó modo protegido.

El modo protegido utiliza los registros de segmento como punteros a unos nuevos registros de dirección de 24 bits denominados tablas de descripción ("descriptor tables"), que permiten acceder a un máximo de 224 (16 MBytes) de memoria física, de forma que los registros de segmento son selectores que marcan el inicio de una dirección de 24 bits.  La memoria que se hacía accesible mediante este sistema se denominó memoria extendida, para distinguirla de la antigua EMS [3].  La posterior introducción del 80386, con registros de 32 bits, permitió direccionar hasta 232 (4 GBytes) de memoria externa.

Los nuevos micros incluyeron otras mejoras que permitían al Sistema Operativo un funcionamiento más cómodo y seguro de las aplicaciones cuando operaba en modo protegido.  Los mecanismos pertinentes estaban incluidos en el hardware o al menos este proporcionaba recursos al SO para realizarlos cómodamente, aunque desde luego, para sacar provecho de estas mejoras el Sistema debía estar preparado ex profeso.  El DOS no podía utilizarlas, sí en cambio los sistemas más avanzados del momento, como OS/2, Unix o Windows.  Básicamente estas mejoras se referían a dos cuestiones:

  • Manejo de memoria virtual
  • Soporte nativo para multiprogramación
§7.1  Memoria virtual

Esta técnica consiste en hacer creer al programa que dispone de más memoria que la físicamente disponible en RAM.  Este artificio tiene sentido porque en ese momento (y actualmente), la memoria extendida era mayor que la físicamente disponible en muchos sistemas, además el disco duro era estándar en todos los equipos.

Esta RAM ficticia se conoce como memoria virtual; una simulación conocida de antiguo en el mundo de los mainframes, que fue introducida en la informática personal a partir del 80286.   Este procesador ya disponía de un controlador hardware para este menester, de forma que su manejo no significaba una gran sobrecarga para el Sistema.  Su funcionamiento se basa en que cuando una aplicación necesita más espacio y la memoria física está agotada, el controlador de memoria virtual proporciona espacio auxiliar utilizando un fichero de intercambio ("Swap file") situado en memoria externa (disco duro generalmente H2), donde se almacena la información que no cabe en la RAM.

Nota:  Hay ocasiones en que la RAM está demasiado fragmentada y el Sistema no puede asignar suficiente espacio contiguo a una aplicación.  Por ejemplo, el caso en que Windows muestra el conocido mensajito: " No hay suficiente memoria... debe cerrar alguna aplicación en curso... " suele deberse a que no hay suficiente "memoria gráfica" contigua.  Es decir:  memoria RAM asignada a la tarjeta de video.

Además de facilitar la apariencia de más RAM que la físicamente disponible, este mecanismo permite que diversas aplicaciones compartan la misma memoria física.  Aunque para ello se requieran constantes maniobras de carga y descarga ("swapping") de trozos del fichero de intercambio a memoria, por lo que el rendimiento global del sistema se resiente si la desproporción entre el fichero de intercambio y la RAM es muy notable [4].

Nota:  En el caso de los sistemas operativos de Microsoft, la memoria virtual fue introducida de forma más o menos perfeccionada desde la aparición del primer Windows 3.1 en 1987.  En Windows 95, el Sistema comienza a funcionar directamente en modo protegido de 32 bits, proporcionando a cualquier aplicación un espacio de memoria de hasta 4 GB. (siempre que esté disponible el adecuado espacio en disco).  En este Sistema, el fichero de intercambio puede crecer a medida de las necesidades hasta ocupar todo el espacio disponible en disco.

§7.2  Multiprogramación

La posibilidad de ejecución simultanea de varios programas, ya utilizada en los grandes sistemas, era un sueño largamente acariciado en el mundo de la informática personal (no olvidemos que la informática nació en sistemas grandes y después migró al entorno del PC).  Sin embargo, el mantenimiento de zonas de memoria correspondiente a programas distintos, sin que existieran interferencias, era una tarea delicada de resultado a veces catastrófico (supongamos por ejemplo que un puntero descontrolado de una aplicación invade el área destinada a otra).

La correcta solución del problema no pasaba solo por la posibilidad de acceder a grandes cantidades de memoria, algo que resolvía la memoria virtual.  Eran también necesarios algunos dispositivos adicionales de protección, que se implementaron de forma nativa en los procesadores Intel286 y siguientes.

Estos dispositivos incluyen control de límites, y posibilidad de acceso de "solo lectura" y "ejecución" en el segmento utilizado por la aplicación, así como una serie de privilegios que permiten proteger el código del Sistema de las aplicaciones o programas de usuario.  Además, la posibilidad de conmutación hardware entre tareas protege las aplicaciones de usuario unas de otras.

Además de estos mecanismos, partir de la introducción del 80486 en 1989, los procesadores disponen de soporte hardware para implementar sistemas multiprocesador, de forma que se hacía posible una auténtica multiprogramación.

  Inicio.


[1]   Hay que señalar en su descargo, que los "micros" utilizados en la época utilizaban un máximo de 64 KB para sistema y programas, y que el "Sistema" era casi inexistente, por lo que cara al futuro, 640 KB. (diez veces más) podía parecer un margen más que generoso.

[2]  TSR "Terminate and Stay Resident".  Un artificio del DOS precursor de la multiprogramación.  Programas que se cargan y permanecen "Stand by" en memoria; activándose mediante una combinación específica de teclas.  El primero y más famoso, fue SideKick de Borland, que contenía diversas utilidades, incluyendo una tabla de caracteres ASCII; un bloc de notas; una calculadora decimal/hexadecimal/binario y una agenda.

[3]  Vista la similitud de nombres adoptada, más que ayudar a aclarar las cosas parece que en realidad pretendían confundir al personal.

[4]  Por razones de eficacia, en algunos Sistemas se requiere que este fichero de intercambio esté en un espacio de disco contiguo.  En Windows 95 es el fichero WIN386.SWP.  Mientras que en Linux se prefiere utilizar una partición de disco dedicada a este fin específico, conocida como partición "swap".   Los usuarios de este Sistema pueden utilizar las utilidades free y vmstat para inspeccionar ambos tipos de memoria (física y virtual).