stringtranslate.com

Gestión de memoria DOS

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

En la informática compatible con IBM PC , la gestión de memoria 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 para IBM PC y compatibles cercanos; otras máquinas que ejecutaban MS-DOS tenían límites diferentes, por ejemplo, la Apricot PC podía tener hasta 768 KiB y la Sirius Victor 9000, 896 KiB. La gestión de memoria en la familia IBM se volvió compleja por la necesidad de mantener la compatibilidad con el diseño original de PC [1] y el DOS en modo real , al tiempo que permitía a los usuarios de computadoras aprovechar grandes cantidades de memoria de bajo costo y nuevas generaciones de procesadores. Dado que DOS ha dado paso a Microsoft Windows y otros sistemas operativos de 32 bits que no están restringidos por el límite arbitrario original de 640 KiB de IBM PC, la gestión de la memoria de una computadora personal ya no requiere que el usuario manipule manualmente las configuraciones y parámetros internos del sistema.

El límite de 640 KiB impuso una gran complejidad al hardware y al software destinado a evitarlo; 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 (no lo mismo que la memoria superior), memoria extendida y memoria expandida, todas manejadas 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 (220 bytes ) de memoria. Se asignaron diferentes áreas de este espacio de direcciones a diferentes 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 programas de aplicación. La primera parte de esta memoria se instalaba en la placa base del sistema (en las primeras máquinas, 64 KiB, luego revisada a 256 KiB). Se podía agregar memoria adicional con tarjetas enchufadas en las ranuras de expansión; cada tarjeta contenía correas o interruptores para controlar qué parte del espacio de direcciones accede a la memoria y los dispositivos de esa tarjeta.

En la 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 iniciarse. El segmento 0, los primeros 64 KiB de memoria convencional, también se denomina á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 hubiera un espacio sin asignar entre la memoria de la placa base y la memoria de expansión, DOS no detectaría automáticamente la memoria como utilizable.

Área de 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 heredado. La región de 128 KiB entre 0xC0000 y 0xDFFFF estaba reservada para ROM opcionales de dispositivos , incluyendo BIOS de video . Los 64 KiB del espacio de direcciones de 0xE0000 a 0xEFFFF estaban reservados para la BIOS o ROM opcionales . La IBM PC reservó los 64 KiB superiores del espacio de direcciones de 0xF0000 a 0xFFFFF para la BIOS y la memoria de solo lectura (ROM) Cassette BASIC . [2]

Por ejemplo, el área de memoria del adaptador de video monocromático iba desde 704 hasta 736 KiB (0xB0000–0xB7FFF). Si solo se utilizaba un adaptador de pantalla monocromático, el espacio de direcciones entre 0xA0000 y 0xAFFFF se podía utilizar para 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 porque la dirección de inicio de la CPU está fijada por el diseño del procesador. La dirección de inicio se carga en el contador de programa de la CPU después de un reinicio de hardware y debe tener un valor definido que perdure después de que se interrumpa la alimentación del sistema. Al reiniciar o encender, 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 prueba automática de encendido del sistema y, finalmente, cargar un sistema operativo.

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

Memoria expandida

A medida que los precios de la memoria bajaron, los programas de aplicación, como las hojas de cálculo y los borradores asistidos por computadora, se modificaron para aprovechar cada vez más la memoria física del sistema. La memoria virtual en el 8088 y el 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 al procesador; cuando los datos de esa parte de la memoria se actualizaban, 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 de propósito especial 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 al 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 tenía que llevar un registro de qué banco de memoria expandida contenía un determinado fragmento de datos y, cuando se requería el acceso a esos datos, la aplicación tenía que solicitar (a través de un programa controlador) a la placa de memoria expandida que asignara esa parte de la memoria al espacio de direcciones del procesador. Aunque las aplicaciones podían utilizar la memoria expandida con relativa libertad, muchos otros componentes de software, como los controladores y los programas residentes en modo de terminación y permanencia (TSR), seguían estando normalmente limitados a residir dentro del área de "memoria convencional" de 640 K, que pronto se convirtió en un recurso extremadamente escaso.

El 80286 y el área de memoria alta

Cuando se introdujo el IBM PC/AT , la arquitectura de memoria segmentada de los procesadores de la familia Intel tuvo como consecuencia que se pudiera direccionar un poco más de 1 MiB de memoria en el modo "real". Como el 80286 tenía más de 20 líneas de dirección, ciertas combinaciones de segmento y desplazamiento podían apuntar a la 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 "enrollándose". Como 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 DOS ya no funcionarían. Para mantener la compatibilidad con el comportamiento de PC y XT, el AT incluyó una puerta de línea A20 (Gate A20) que hacía que las direcciones de memoria en el AT se envolvieran a la memoria baja como lo habrían hecho en un procesador 8088. Esta puerta podría ser controlada, inicialmente a través del controlador de teclado , para permitir que los programas en ejecución que fueron diseñados para esto accedieran a 65,520 bytes adicionales (64 KiB) de memoria en modo real . En el momento del arranque , el 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 en el proceso de arranque, a menudo antes de que el control haya sido 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 una IBM PC/AT o una microcomputadora compatible.

Originalmente, la puerta lógica era una puerta conectada al controlador de teclado Intel 8042. Controlarla era un proceso relativamente lento. Desde entonces se han añadido otros métodos para permitir una multitarea más eficiente de los programas que requieren esta integración con programas que acceden a toda la memoria del sistema. Al principio había una variedad de métodos, pero finalmente la industria se decidió por el método PS/2 de usar un bit en el puerto 92h para controlar la línea A20.

Desconectar A20 no envolvería todos los accesos a la memoria por encima de 1 MiB, solo aquellos en los rangos de 1 MiB, 3 MiB, 5 MiB, etc. El software de modo real solo se preocupaba por el área ligeramente por encima de 1 MiB, por lo que la Puerta A20 era suficiente.

El modo virtual 8086 , introducido con el Intel 80386 , permite simular el cambio de dirección de 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 en el primer megabyte de memoria virtual pueda asignarse nuevamente en el segundo megabyte de memoria virtual. El sistema operativo puede interceptar cambios en la Puerta A20 y realizar cambios correspondientes en el espacio de direcciones de memoria virtual, lo que también hace irrelevante la eficiencia de la alternancia de Puerta-A20.

El primer usuario de HMA entre los productos de Microsoft 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 de MS-DOS (1991), también se podían cargar partes del sistema operativo en HMA, liberando hasta 46 KiB de memoria convencional . Otros componentes, como controladores de dispositivo y TSR, se podían cargar en el área de memoria superior (UMA).

80286 introdujo un agujero de memoria MMIO (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/cerrar A20. El propio DOS podía utilizar el área para algunas de sus necesidades de almacenamiento, liberando así más memoria 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

Los procesadores Intel 80486 y Pentium añadieron un pin especial llamado A20M# , que cuando se activa en modo bajo obliga al bit 20 de la dirección física a ser cero para todos los accesos a la memoria caché en chip o a la memoria externa. Esto era necesario porque el 80486 introdujo una memoria caché en chip y, por lo tanto, ya no era posible enmascarar este bit en la lógica externa. El software todavía necesita manipular la puerta y debe seguir lidiando con los periféricos externos (el chipset ) para ello. [4]

Procesadores 80386 y posteriores

Los procesadores Intel a partir del modelo 386 permitían un modo 8086 virtual , lo que simplificaba el hardware necesario para implementar memoria expandida para aplicaciones DOS. Los administradores 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 placas de memoria especiales.

En los procesadores 386 y posteriores, los administradores 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 punto de acceso que fuera capaz de acceder al código residente en la 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 que normalmente se utilizaban para E/S asignadas a memoria. Muchos de estos trucos implicaban suposiciones sobre el funcionamiento de los controladores y otros componentes. En efecto, los administradores de memoria podían aplicar 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 administradores de memoria también incorporaban sistemas muy elaborados de opciones configurables y disposiciones para la recuperación en caso de que una opción seleccionada dejara la PC sin poder arrancar (algo que sucedía con frecuencia).

Instalar y configurar un administrador de memoria puede implicar horas de experimentación con opciones, reinicios repetidos de la máquina y pruebas de resultados. Pero la memoria convencional era tan valiosa que los propietarios de PC pensaban 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 DOS que se ejecutan en el denominado "modo real" de los procesadores 80286 y posteriores. Esta memoria sólo es accesible en los modos protegidos o virtuales 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. ^ ab 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.

Enlaces externos