Articulo de referencia

Gestión de memoria de DOS

Áreas de memoria física de la familia IBM PC En la informática compatible con IBM PC , la gestión de memoria de DOS se refiere al software y las técnicas empleadas para dar a la...

Áreas de memoria física de la familia IBM PC

En la informática compatible con IBM PC , la gestión de memoria de DOS se refiere al software y las técnicas empleadas para dar a las aplicaciones acceso a más de 640 kibibytes (640*1024 bytes) (KiB) de "memoria convencional". El  límite de 640 KiB era específico del IBM PC y sus compatibles cercanos; otras máquinas que ejecutaban DOS tenían límites diferentes, por ejemplo, el Apricot PC podía tener hasta 768 KiB y el Sirius Victor 9000, 896  KiB. La gestión de memoria en la familia IBM se complicó por la necesidad de mantener la retrocompatibilidad con el diseño original del PC [ 1 ] y el modo real de DOS, al tiempo que permitía a los usuarios aprovechar grandes cantidades de memoria de bajo coste y las nuevas generaciones de procesadores. Dado que DOS ha dado paso a Microsoft Windows y otros sistemas operativos de 32 bits no restringidos por el  límite arbitrario original de 640 KiB del IBM PC, la gestión de la memoria de un ordenador personal ya no requiere que el usuario manipule manualmente la configuración y los parámetros internos del sistema.

El límite de 640 KiB imponía una gran complejidad al hardware y al software destinados a sortearlo; la memoria física de una máquina podía organizarse como una combinación de memoria base o convencional (incluida la memoria inferior), memoria superior, memoria alta (que no es lo mismo que la memoria superior), memoria extendida y memoria expandida, todas ellas gestionadas de diferentes maneras.

Memoria convencional

El procesador Intel 8088 utilizado en el IBM PC original tenía 20 líneas de dirección y, por lo tanto, podía direccionar directamente 1 MiB (2²⁰ bytes ) de memoria. Diferentes áreas de este espacio de direcciones se asignaban a distintos tipos de memoria utilizados para diferentes propósitos. Comenzando por el extremo inferior del espacio de direcciones, el PC tenía instalada una memoria de acceso aleatorio (RAM) de lectura/escritura, que era utilizada por DOS y los programas de aplicación. La primera parte de esta memoria estaba instalada en la placa base del sistema (en las primeras máquinas, 64  KiB, posteriormente revisada a 256  KiB). Se podía agregar memoria adicional mediante tarjetas que se conectaban a las ranuras de expansión; cada tarjeta contenía interruptores o conmutadores para controlar qué parte del espacio de direcciones accedía a la memoria y los dispositivos de esa tarjeta.

En el IBM PC, todo el espacio de direcciones hasta 640  KiB estaba disponible para la RAM. Esta parte del espacio de direcciones se denomina "memoria convencional", ya que todas las versiones de DOS pueden acceder a ella automáticamente al iniciar el sistema. El segmento 0, los primeros 64  KiB de memoria convencional, también se conoce como área de memoria baja . Normalmente, la memoria de expansión se configura para que sea contigua en el espacio de direcciones a la memoria de la placa base. Si existiera un espacio sin asignar entre la memoria de la placa base y la memoria de expansión, DOS no la detectaría automáticamente como utilizable.

Área de la memoria superior

El área de memoria superior (UMA) se refiere al espacio de direcciones entre 640 y 1024  KiB (0xA0000–0xFFFFF). La  región de 128 KiB entre 0xA0000 y 0xBFFFF estaba reservada para la memoria de pantalla VGA y SMM heredada. La  región de 128 KiB entre 0xC0000 y 0xDFFFF estaba reservada para las ROM de opción del dispositivo , incluida la BIOS de vídeo . La  región de 64 KiB entre 0xE0000 y 0xEFFFF estaba reservada para la BIOS como área inferior de la BIOS. La  región de 64 KiB entre 0xF0000 y 0xFFFFF estaba reservada para la BIOS como área superior de la BIOS. [ 2 ]

Por ejemplo, el área de memoria del adaptador de vídeo monocromo abarcaba desde 704 hasta 736  KiB (0xB0000–0xB7FFF). Si solo se utilizaba un adaptador de pantalla monocromo, el espacio de direcciones entre 0xA0000 y 0xAFFFF podía utilizarse para la RAM, que sería contigua a la memoria convencional. [ 3 ]

Las ROM del BIOS del sistema deben estar en el extremo superior del espacio de direcciones, ya que la dirección de inicio de la CPU está fijada por el diseño del procesador. Esta dirección se carga en el contador de programa de la CPU tras un reinicio del hardware y debe tener un valor definido que se mantenga incluso después de que se interrumpa el suministro eléctrico al sistema. Al reiniciarse o encenderse, la CPU carga la dirección desde la ROM del sistema y luego salta a una ubicación de ROM definida para comenzar a ejecutar la autocomprobación de encendido del sistema y, finalmente, cargar un sistema operativo.

Dado que una tarjeta de expansión, como un adaptador de vídeo, un controlador de disco duro o un adaptador de red, podía utilizar asignaciones de memoria en muchas de las áreas de memoria superiores, la configuración de algunas combinaciones de tarjetas requería una lectura atenta de la documentación o experimentación para encontrar la configuración y las asignaciones de memoria adecuadas. Asignar dos dispositivos para que utilizaran las mismas direcciones de memoria física podía provocar un bloqueo o inestabilidad del sistema. [ 3 ] No todas las direcciones del área de memoria superior se utilizaban en un sistema típico; las direcciones físicas no utilizadas devolvían datos indefinidos y dependientes del sistema si el procesador accedía a ellas.

Memoria expandida

A medida que los precios de la memoria disminuían, los programas de aplicación, como las hojas de cálculo y el diseño asistido por computadora, se modificaron para aprovechar cada vez más la memoria física del sistema. La memoria virtual en los procesadores 8088 y 8086 no era compatible con el hardware del procesador, y la tecnología de disco de la época la hacía demasiado lenta y engorrosa para ser práctica. La memoria expandida era un sistema que permitía a los programas de aplicación acceder a más RAM de la que era directamente visible para el espacio de direcciones del procesador. El proceso era una forma de conmutación de bancos . Cuando se necesitaba RAM adicional, el software del controlador hacía que una parte de la memoria expandida fuera accesible temporalmente para el procesador; cuando se actualizaban los datos en esa parte de la memoria, otra parte podía intercambiarse en el espacio de direcciones del procesador. Para el IBM PC y el IBM PC/XT , con solo 20 líneas de dirección, se fabricaron tarjetas de memoria expandida especiales que contenían quizás un megabyte o más de memoria expandida, con lógica en la placa para hacer que esa memoria fuera accesible para el procesador en partes definidas del espacio de direcciones del 8088.

La asignación y el uso de la memoria expandida no eran transparentes para los programas de aplicación. La aplicación debía llevar un registro de qué banco de memoria expandida contenía un dato específico y, cuando necesitaba acceder a él, debía solicitar (a través de un programa controlador) a la tarjeta de memoria expandida que asignara esa parte de la memoria al espacio de direcciones del procesador. Si bien las aplicaciones podían usar la memoria expandida con relativa libertad, muchos otros componentes de software, como los controladores y los programas residentes en memoria (TSR), normalmente seguían estando restringidos a residir dentro del área de "memoria convencional" de 640 KB, que pronto se convirtió en un recurso crítico y escaso.

El 80286 y el área de memoria alta

Cuando se presentó el IBM PC/AT , la arquitectura de memoria segmentada de los procesadores de la familia Intel permitía direccionar algo más de 1 MiB de memoria en modo "real". Dado que el 80286 tenía más de 20 líneas de dirección, ciertas combinaciones de segmento y desplazamiento podían apuntar a memoria por encima de la ubicación 0x0100000 (2 20 ). El 80286 podía direccionar hasta 16 MiB de memoria del sistema, eliminando así el comportamiento de las direcciones de memoria que se "desbordaban". Dado que ahora existía la línea de dirección requerida, la combinación F800:8000 ya no apuntaría a la dirección física 0x0000000, sino a la dirección correcta 0x00100000.

Como resultado, algunos programas de DOS dejaron de funcionar. Para mantener la compatibilidad con el comportamiento de PC y XT, el AT incluyó una puerta de línea A20 (Puerta A20) que hacía que las direcciones de memoria en el AT se desbordaran a la memoria baja como lo harían en un procesador 8088. Esta puerta podía controlarse, inicialmente a través del controlador del teclado , para permitir que los programas diseñados para ello accedieran a 65 520 bytes (64  KiB) adicionales de memoria en modo real . Al arrancar , la BIOS primero habilita A20 al contar y probar toda la memoria del sistema, y ​​la deshabilita antes de transferir el control al sistema operativo. Habilitar la línea A20 es uno de los primeros pasos que realiza un sistema operativo x86 en modo protegido durante el proceso de arranque, a menudo antes de que el control se haya transferido al núcleo desde el arranque (en el caso de Linux, por ejemplo).

El área de memoria alta ( HMA ) es el área de RAM que consta de los primeros 64  KiB, menos 16 bytes , de la memoria extendida en un IBM PC/AT o un microordenador compatible.

Originalmente, la puerta lógica estaba conectada al controlador de teclado Intel 8042. Su control era un proceso relativamente lento. Posteriormente, se añadieron otros métodos para permitir una multitarea más eficiente de los programas que requieren este bucle con programas que acceden a toda la memoria del sistema. Al principio existían diversos métodos, pero finalmente la industria optó por el método PS/2, que utiliza un bit en el puerto 92h para controlar la línea A20.

Desconectar A20 no bloquearía todos los accesos a memoria superiores a 1 MiB, sino solo aquellos en los rangos de 1 MiB, 3 MiB, 5 MiB, etc. El software del modo real solo tenía en cuenta el área ligeramente superior a 1 MiB, por lo que la puerta A20 era suficiente.

El modo virtual 8086 , introducido con el Intel 80386 , permite simular el desbordamiento de la puerta A20 mediante el uso de las funciones de memoria virtual del procesador: la memoria física puede asignarse a múltiples direcciones virtuales, lo que permite que la memoria asignada al primer megabyte de memoria virtual pueda asignarse nuevamente al segundo megabyte de memoria virtual. El sistema operativo puede interceptar los cambios en la puerta A20 y realizar los cambios correspondientes en el espacio de direcciones de memoria virtual, lo que también hace irrelevante la eficiencia de la conmutación de la puerta A20.

El primer producto de Microsoft en utilizar la HMA fue Windows 2.0 en 1987, que introdujo el controlador de dispositivo HIMEM.SYS . A partir de las versiones 5.0 de DR-DOS (1990) y MS-DOS (1991), partes del sistema operativo también podían cargarse en la HMA, liberando hasta 46  KiB de memoria convencional . Otros componentes, como los controladores de dispositivo y los TSR, podían cargarse en el área de memoria superior (UMA).

El chip 80286 introdujo un hueco de memoria MMIO (de 15 MiB a 16 MiB) para algunos dispositivos ISA .

Manipulador A20

El controlador A20 es un software que controla el acceso al área de memoria alta. Los administradores de memoria extendida suelen proporcionar esta funcionalidad. En DOS, los administradores de área de memoria alta, como HIMEM.SYS, tenían la tarea adicional de administrar A20 y proporcionaban una API para abrir y cerrar A20. El propio DOS podía utilizar esta área para algunas de sus necesidades de almacenamiento, liberando así memoria más convencional para los programas. Esta funcionalidad se habilitaba mediante la directiva " DOS =HIGH" en el archivo de configuración CONFIG.SYS .

Puerta A20 en procesadores posteriores

El Intel 80486 y el Pentium añadieron un pin especial llamado A20M# , que al activarse a nivel bajo fuerza a que el bit 20 de la dirección física sea cero para todos los accesos a la caché integrada o a la memoria externa. Esto era necesario ya que el 80486 introdujo una caché integrada, por lo que enmascarar este bit en la lógica externa ya no era posible. El software aún necesita manipular la puerta lógica y debe seguir interactuando con los periféricos externos (el chipset ) para ello. [ 4 ]

80386 y procesadores posteriores

Los procesadores Intel a partir del 386 permitían un modo virtual 8086 , lo que simplificaba el hardware necesario para implementar memoria expandida para aplicaciones DOS. Los gestores de memoria expandida, como el producto QEMM de Quarterdeck y el EMM386 de Microsoft, admitían el estándar de memoria expandida sin necesidad de tarjetas de memoria especiales.

En los procesadores 386 y posteriores, los gestores de memoria como QEMM podían mover la mayor parte del código de un controlador o TSR a la memoria extendida y reemplazarlo con un pequeño fragmento de código capaz de acceder al código residente en memoria extendida. Podían analizar el uso de la memoria para detectar controladores que requerían más RAM durante el arranque que posteriormente, y recuperar y reutilizar la memoria que ya no era necesaria después del arranque. Incluso podían reasignar áreas de memoria normalmente utilizadas para E/S mapeadas en memoria. Muchos de estos trucos implicaban suposiciones sobre el funcionamiento de los controladores y otros componentes. En efecto, los gestores de memoria podían realizar ingeniería inversa y modificar el código de otros proveedores sobre la marcha. Como era de esperar, estos trucos no siempre funcionaban. Por lo tanto, los gestores de memoria también incorporaban sistemas muy elaborados de opciones configurables y mecanismos de recuperación en caso de que una opción seleccionada impidiera el arranque del PC (algo frecuente).

Instalar y configurar un gestor de memoria podía implicar horas de experimentación con las opciones, reiniciar repetidamente el equipo y probar los resultados. Pero la memoria convencional era tan valiosa que los usuarios de PC consideraban que ese tiempo estaba bien invertido si el resultado era liberar 30 o 40  KiB de espacio de memoria convencional.

Memoria ampliada

En el contexto de los ordenadores compatibles con IBM PC, la memoria extendida se refiere a la memoria en el espacio de direcciones de los procesadores 80286 y posteriores, más allá del límite de 1 megabyte impuesto por las 20 líneas de dirección de los procesadores 8088 y 8086. Dicha memoria no está directamente disponible para las aplicaciones de DOS que se ejecutan en el llamado "modo real" de los procesadores 80286 y posteriores. Esta memoria solo es accesible en los modos protegido o virtual de los procesadores 80286 y superiores.

Véase también

Referencias

  1. Mueller, Scott (1994). "7". Actualización y reparación de PC (4.ª  ed.). Que . ISBN 1-56529-932-9.
  2. "Mapa de memoria (x86) - Wiki de OSDev" . wiki.osdev.org . Consultado el 20 de diciembre de 2020 .
  3. 1 2 Mueller, Scott (1999). "6: Memoria". Actualización y reparación de PC (11.ª ed.). Que Corporation . ISBN  0-7897-1903-7.
  4. Shanley, Tom (1996). Arquitectura de software en modo protegido . Taylor & Francis . pág. 60. ISBN  0-201-55447-X.