Articulo de referencia

Área de memoria alta

Se ha resaltado la zona de alta memoria. En la gestión de memoria de DOS , el área de memoria alta ( HMA ) es el área de RAM que consta de los primeros 65520 bytes por encima de...

Se ha resaltado la zona de alta memoria.

En la gestión de memoria de DOS , el área de memoria alta ( HMA ) es el área de RAM que consta de los primeros 65520 bytes por encima del megabyte en un ordenador IBM AT o compatible.

Función

En modo real , la arquitectura de segmentación de los procesadores Intel 8086 y posteriores identifica ubicaciones de memoria con un segmento de 16 bits y un desplazamiento de 16 bits, que se resuelve en una dirección física mediante (segmento) × 16 + (desplazamiento). Aunque está diseñado para direccionar solo 1 Megabyte (MB) ( 2²⁰ bytes) de memoria, las direcciones de segmento:desplazamiento en y más allá de la memoria de referencia más allá de 1 MB ( ). Por lo tanto, en un procesador 80286 y posteriores, este modo puede direccionar los primeros 65520 bytes de memoria extendida como parte del rango de 64 KB que comienza 16 bytes antes de la marca de 1 MB, hasta . Los procesadores Intel 8086 y 8088 , con solo 1 MB de memoria y solo 20 líneas de dirección , se desbordaban en el bit 20, por lo que esa dirección era equivalente a . [ 1 ] FFFF:0010 FFFF0 + 0010 = 100000    FFFF:0000 (0xFFFF0)FFFF:FFFF (0x10FFEF)  FFFF:00100000:0000

Para permitir la ejecución de programas DOS existentes que dependían de esta función para acceder a la memoria baja en sus computadoras IBM PC AT más recientes, IBM agregó un circuito especial en la placa base para simular el desbordamiento. Este circuito era una simple puerta lógica que podía desconectar la línea de direccionamiento 21 del microprocesador, A20 , del resto de la placa base. Esta puerta podía controlarse, inicialmente a través del controlador del teclado , para permitir la ejecución de programas que necesitaban acceder a toda la RAM. [ 1 ]

Los denominados manejadores A20 podían controlar el modo de direccionamiento dinámicamente, [ 1 ] permitiendo así que los programas se cargaran en la  región de 1024–1088 KB y se ejecutaran en modo real. [ 1 ]

formato de código

El código apto para ejecutarse en el HMA debe estar codificado para ser independiente de la posición (usando solo referencias relativas), [ 2 ] [ 1 ] compilarse para funcionar en las direcciones específicas del HMA (normalmente permitiendo que solo una o como máximo dos piezas de código compartan el HMA ), o debe estar diseñado para ser reubicable en el límite del párrafo o incluso en el desplazamiento (con todas las direcciones fijadas durante la carga). [ 2 ] [ 1 ]

Antes de que el código (o los datos) en el HMA puedan ser direccionados por la CPU , el controlador correspondiente debe asegurarse de que el HMA esté mapeado. Esto requiere que dichas solicitudes se canalicen a través de un stub que permanece en memoria fuera del HMA, el cual invocaría al controlador A20 para habilitar (temporalmente) la puerta A20 . [ 2 ] [ 1 ] Si el controlador no presenta ninguna estructura de datos pública y solo utiliza interrupciones o llamadas ya controladas por el sistema operativo subyacente, podría ser posible registrar el controlador con el sistema de manera que el sistema se encargue de A20 por sí mismo, eliminando así la necesidad de un stub separado. [ 1 ] [ nb 1 ]

Historia

El primer usuario de HMA entre los productos de Microsoft fue Windows/286  2.1 en 1988, que introdujo el controlador de dispositivo HIMEM.SYS . A partir de 1990 con DR DOS 5.0 de Digital Research [ 3 ] (a través de [ 4 ] y CONFIG.SYS ) y desde 1991 con MS-DOS 5.0 [ 3 ] (a través de ), partes de la BIOS y el núcleo del sistema operativo también podían cargarse en HMA, [ 3 ] [ 5 ] liberando hasta 46 KB de memoria convencional . [ 1 ] Otros componentes, como controladores de dispositivos y programas residentes que terminan y permanecen (TSR), podían al menos cargarse en el área de memoria superior (UMA), pero no en HMA. Bajo DOS 5.0 y superior, con , el sistema intentaba además mover los búferes de disco a HMA. [ 5 ] Bajo DR DOS 6.0 (1991) y superior, los búferes de disco (a través de , y más tarde también ), partes del procesador de comandos COMMAND.COM , así como varios controladores especiales de reubicación automática como KEYB , NLSFUNC y SHARE también podían cargarse en el HMA (usando su opción), liberando así aún más memoria convencional y memoria superior para que el software DOS convencional trabajara con ella. [ 1 ] TASKMAX parece haber reubicado partes de sí mismo también en el HMA. [ 6 ] [ 7 ] NLCACHE de Novell de NetWare Lite y las primeras versiones de NWCACHE de Personal NetWare y Novell DOS 7 también podían utilizar el HMA. [ 8 ] [ 9 ] [ 7 ] Bajo MS-DOS/PC DOS, un ca. Una porción compartida de 2 KB de COMMAND.COM puede reubicarse en el HMA, [ 10 ] así como los mapas de bits de DISPLAY.SYS para páginas de códigos preparadas . [ 10 ] [ 11 ] Bajo MS-DOS 6.2 (1993) y superior, un aprox. 5HIDOS.SYS /BDOS=FFFFHIDOS=ONDOS=HIGH DOS=HIGHHIBUFFERSBUFFERSHIGH/MH   La porción KB de DBLSPACE.BIN / DRVSPACE.BIN puede coexistir con DOS en el HMA (a menos que se invoque DBLSPACE / DRVSPACE ). [ 5 ] [ 12 ] Bajo PC DOS 7.0 (1995) y 2000 , DOSKEY se carga en el HMA (si está disponible), [ 13 ] y SHARE también puede cargarse en el HMA (a menos que se le dé su opción). [ 13 ] Bajo MS-DOS 7.0 (1995) a 8.0 (2000), partes del HMA también se utilizan como un bloc de notas para contener una estructura de datos creciente que registra varias propiedades de los controladores de modo real cargados. [ 7 ] [ 14 ] [ 15 ]/NOHMA/NOHMA

Véase también

Notas

  1. No es necesario un stub para las extensiones del sistema residente SHARE y NLSFUNC en DR DOS 6.0 y versiones posteriores, ya que solo interceptan la interrupción multiplexada INT 2Fh y, por lo tanto, pueden utilizar una interfaz de puerta trasera para interceptar la cadena de interrupciones en el espacio del kernel , de modo que el controlador de puerta A20 del kernelproporcione la funcionalidad del stub.

Referencias

  1. 1 2 3 4 5 6 7 8 9 10 Paul, Matthias R. (2002-02-02). "Treiber dynamisch nachladen (Intra-Segment-Offset-Relokation zum Laden von TSRs in die HMA)" [ Carga dinámica de controladores (reubicación de desplazamiento intrasegmento para cargar TSRs en el HMA) ] (en alemán). Grupo de noticias : de.comp.os.msdos . Consultado el 2 de julio de 2017 . {{cite newsgroup}}CS1 maint: servicio de archivo obsoleto ( enlace ) (Nota: Ofrece una descripción general completa de la historia y la "naturaleza" de la HMA y las restricciones de diseño no obvias que deben observarse al desarrollar extensiones de sistema residentes para cargarlas en la HMA. También describe cómo abordar estos problemas utilizando stubs , backdoors y reubicación de desplazamiento intrasegmento, un método utilizado por los controladores DR-DOS capaces de reubicarse en la HMA y similar a un método (más sofisticado) utilizado como base para la eliminación dinámica de código muerto en el controlador FreeKEYB del autor).
  2. 1 2 3 Ingenoso, Tony (1998-12-20). "Capítulo 13 - La puerta A20 y el HMA". Cómo mejorar el funcionamiento del código: cómo minimizar el tamaño del código 80x86 y, a veces, hacerlo más rápido (libro electrónico). Archivado del original el 18-11-2019 . Recuperado el 18-11-2019 .
  3. 1 2 3 Dryfoos, Mike, ed. (1991-09-18) [1991-07-19]. "Informe post mortem del desarrollo de MS-DOS 5.0" (PDF) (enviado por correo como documento judicial). Microsoft . pág. 10. MS-PCA1179169 (MS-PCA1179159-MS-PCA1179191). MS7020988 (MS7020978-MS7021010). Depo. Ex. 1109. Comes v Microsoft Prueba del demandante 3473. CA.No.2:96CV645B Prueba del demandante 477. Archivado (PDF) del original el 2019-04-02 . Recuperado el 2019-07-22 . […] Uno de los estímulos más importantes para añadir funcionalidades fue la presión competitiva de DRDOS 5.0 , del que supimos por primera vez en la primavera de 1990. El conjunto de funcionalidades de DRDOS nos llevó a añadir compatibilidad con UMB , intercambio de tareas y recuperación de archivos. […] Gran parte de la atención de la dirección del equipo se desvió a nuevas funcionalidades como el software de transferencia de archivos, la recuperación de archivos y la instalación en red. […] Finalmente, esta situación llegó a un punto crítico a finales de julio de 1990 y, bajo el liderazgo de BradS , la dirección del equipo dedicó una ardua serie de reuniones a definir un calendario y un proceso para finalizar el proyecto. […] (1+32 páginas)
  4. Banta, K.; Partridge, D. (18 de agosto de 1994). "Administradores de memoria de terceros" . DR DOS 6.0 (Documento de información técnica). Revisión A. Novell . TID800074 (sustituye a FYI-M-1303). Archivado del original el 15 de diciembre de 2021. Recuperado el 15 de diciembre de 2021 .
  5. 1 2 3 Schulman, Andrew; Brown, Ralf D .; Maxey, David; Michels, Raymond J.; Kyle, Jim (1994) [noviembre de 1993]. Williams, Andrew (ed.). Undocumented DOS: Guía del programador para funciones y estructuras de datos reservadas de MS-DOS, ampliada para incluir MS-DOS 6, Novell DOS y Windows 3.1 . The Andrew Schulman Programming Series (1.ª impresión, 2.ª ed.). Reading, Massachusetts, EE. UU.: Addison Wesley Publishing Company . págs. 42, 349–350 , 437–438 . ISBN   0-201-63287-XISBN 978-0-201-63287-3.(xviii+856+vi páginas, disquete de 3,5")) Erratas:
  6. "Formato del bloque de memoria HMA (núcleo DR DOS 6.0 cargado en HMA)" . RBIL . 2000. Archivado del original el 18 de febrero de 2020. Recuperado el 18 de febrero de 2020 .
  7. 1 2 3 Paul, Matthias R. (2002-04-10). " [ fd-dev ] Acceso HMA desde TSR" . freedos-dev . Recuperado el 2017-09-09 . [...] MS-DOS 7.0 + agrega INT 21h/AX=4A03h e INT 21h/AX=4A04h. RBIL 61 INT 21h/AH=52h tiene información sobre la cadena MCB de HMA de MS-DOS 7.0+ […] La reubicación de HMA para TSR tiene mucho sentido para DR-DOS : aunque se pueden cargar grandes partes de la BIOS y BDOS , la parte residente del shell, los BUFFERS y los TSR de DR-DOS como SHARE , KEYB y NLSFUNC (y en algunos problemas partes de TASKMGR y NWCACHE ) en el HMA, normalmente todavía hay espacio libre disponible, normalmente alrededor de 10 Kb (hasta aprox. 20 Kb cuando se usa un shell de terceros). También tiene sentido para MS-DOS 5.06.22 y PC DOS hasta 2000 , que normalmente dejan 4 – 7 Kb de la memoria HMA sin usar (SHARE, KEYB y NLSFUNC no se pueden cargar en el HMA, pero DBLSPACE y HIMEM sí pueden hasta cierto punto). El espacio HMA disponible puede ser bastante limitado con MS-DOS 7.0 o superior, ya que este problema introdujo una nueva estructura de datos RMD, en su mayor parte indocumentada, que normalmente se encuentra en el HMA. El kernel recopila y registra datos de configuración y del controlador en modo real durante el arranque (tipo de controlador, interrupciones interceptadas por el controlador, línea de invocación de CONFIG.SYS , etc.) y almacena esta información en una estructura de datos […] compleja […] y […] en constante crecimiento. Presumiblemente, esta información está destinada a ser utilizada por el núcleo de Windows para obtener una mejor visión de los controladores en modo real cargados en lugar de tratar a DOS como un bloque monolítico, o incluso […] intentar desvincular o descargar algunos de ellos; sin embargo, solo se utiliza de forma muy limitada (por ejemplo, se puede ver parte de la información reflejada en los archivos de registro creados al iniciar Windows 9x, y algunas partes del administrador de configuración de Windows también la utilizan), lo que deja margen para especulaciones que van mucho más allá del aspecto técnico, en particular porque nada de lo interesante está documentado… […]       {{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  8. ^ Paul, Matthias R. (30 de julio de 1997) [1 de mayo de 1994]. "II.4. Undokumentierte Eigenschaften externer Kommandos". NWDOS-TIP : consejos y trucos para Novell DOS 7, con un clic para deshacer detalles, errores y soluciones . MPDOSTIP (en alemán) (3 ed.). Archivado desde el original el 5 de noviembre de 2016 . Consultado el 11 de enero de 2012 . (Nota: NWDOSTIP.TXTSe trata de una obra exhaustiva sobre Novell DOS 7 y OpenDOS 7.01 , que incluye la descripción de numerosas características y aspectos internos no documentados. Forma parte de la extensa MPDOSTIP.ZIPcolección del autor, mantenida hasta 2001 y distribuida en numerosos sitios web en aquella época. El enlace proporcionado dirige a una versión anterior del archivo convertida a HTML).
  9. ^ Pablo, Matías R. (9 de abril de 2001). "II.4. Undokumentierte Eigenschaften externer Kommandos". NWDOS-TIP : consejos y trucos para Novell DOS 7, con un clic para deshacer detalles, errores y soluciones . MPDOSTIP (en alemán) (3 ed.). 
  10. 1 2 Chappell, Geoff (enero de 1994). Schulman, Andrew; Pedersen, Amorette (eds.). DOS Internals . The Andrew Schulman Programming Series (1.ª impresión, 1.ª ed.). Addison Wesley Publishing Company . págs. 4, 21, 100–106 , 127–129 . ISBN   978-0-201-60835-9ISBN 0-201-60835-9.(xxvi+738+iv páginas, disquete de 3,5")) Erratas:
  11. Paul, Matthias R. (2002-12-04). " [ fd-dev ] DISPLAY CON?" . freedos-dev . Archivado del original el 2021-12-08. […] algunas versiones de DISPLAY.SYS (de PC DOS 7 / 2000 , por ejemplo) almacenan las fuentes actualmente no utilizadas en la memoria XMS . Algunas versiones anteriores de MS-DOS/PC DOS DISPLAY.SYS parecen haber tenido una función para almacenarlas en la HMA […]
  12. Cooper, Jim (2002). Uso de MS-DOS 6.22 (3.ª ed. especial). Que Publishing . pág. 669. ISBN   0-78972573-8ISBN 978-0-78972573-8. Archivado del original el 18-02-2020 . Consultado el 18-02-2020 .
  13. 1 2 Brooks, Vernon C. (2014). "Esta es una lista detallada de los cambios que hice en PC DOS 7.0" . PC DOS Retro . Archivado del original el 18 de febrero de 2020. Recuperado el 18 de febrero de 2020. […] DOSKEY.COM […] Mover el código a HMA si está disponible. […] SHARE.EXE […] Mover el código a HMA si está disponible y agregar la opción /NOHMA para forzar la carga baja. […]
  14. Sweger, Kristofer (2007) [15/07/2002]. "ANSIPLUS y Windows" . Archivado del original el 28/11/2021 . Consultado el 28/11/2021 . […] El código de ANSIPLUS no se puede cargar en la HMA bajo MS-DOS 7 (solo Windows 9x) porque aparentemente no hay suficiente memoria HMA sin usar disponible. […]
  15. ^ Pablo, Matías R. (13 de agosto de 2002). "Suche freien Speicherbereich unterhalb von 1 MB, der nicht von OS überschrieben wird" (en alemán). Grupo de noticias : de.comp.lang.assembler.x86 . Consultado el 3 de septiembre de 2017 . {{cite newsgroup}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  16. Paul, Matthias R. (1997-10-02) [1997-09-29]. "Caldera OpenDOS 7.01/7.02 Update Alpha 3 IBMBIO.COM - README.TXT y BOOT.TXT - Una breve descripción de cómo se inicia OpenDOS" . Archivado del original el 4 de octubre de 2003. Recuperado el 29 de marzo de 2009 .

Lecturas adicionales

  • Necasek, Michal (13 de septiembre de 2011). "¿Quién necesita el desbordamiento de direcciones, de todos modos?" . Museo OS/2 . Archivado del original el 19 de febrero de 2020 . Recuperado el 19 de febrero de 2020 . […] 86-DOS , y por lo tanto PC DOS / MS-DOS , usaban un truco ingenioso. El byte en el desplazamiento 5 del PSP contenía un código de operación de llamada lejana (9Ah); la palabra en el desplazamiento 6 del PSP contenía el valor apropiado para indicar el tamaño del segmento del programa, y ​​también la parte de desplazamiento de la llamada lejana. La palabra en el desplazamiento 8, que servía como la parte del segmento de la llamada lejana, estaba diseñada de tal manera que cuando se combinaba con el desplazamiento, se desbordaba (una característica bien conocida de la CPU 8086 ) y apuntaba a la dirección 0:C0h, que contiene el vector de interrupción 30h. […] la interfaz CALL 5 funciona incluso en la emulación de DOS bajo Windows NT y OS/2, y esos sistemas ciertamente no pueden ejecutarse con la línea A20 deshabilitada. ¿Cómo funciona entonces? […] En lugar de recortar bits de dirección, el sistema duplica los cinco bytes en 0:C0h en 1000C0h. De hecho, la misma técnica se había utilizado en DOS 5 y versiones posteriores que se ejecutaban con DOS=HIGH. En ese caso, DOS se asegura de que la dirección lineal 1000C0h contenga la llamada lejana apropiada. […]
  • Kozierok, Charles M. (17 de abril de 2001) [1997]. "Área de memoria alta (HMA)" . The PC Guide . 2.2.0. Archivado del original el 16 de octubre de 2006. Recuperado el 15 de octubre de 2006 .
  • Paul, Matthias R. (2002-04-11). "Re: [ fd-dev ] ANUNCIO: CuteMouse 2.0 alpha 1" . freedos-dev . Archivado del original el 21-02-2020 . Recuperado el 21-02-2020 . [...] en caso de punteros tan dañados [...] hace muchos años Axel y yo estábamos pensando en una forma de usar *un* punto de entrada en un controlador para múltiples vectores de interrupción (ya que esto nos ahorraría mucho espacio para los múltiples puntos de entrada y el código de marco de inicio/salida más o menos idéntico en todos ellos), y luego cambiar a los diferentes manejadores de interrupción internamente. Por ejemplo: 1234h:0000h […] 1233h:0010h […] 1232h:0020h […] 1231h:0030h […] 1230h:0040h […] todos apuntan exactamente al mismo punto de entrada. Si conectas INT 21h a 1234h:0000h y INT 2Fh a 1233h:0010h, y así sucesivamente, todos pasarían por el mismo "agujero", pero aún podrías distinguirlos y ramificarte a los diferentes manejadores internamente. Piensa en un punto de entrada "comprimido" en un stub A20 para la carga de HMA. Esto funciona siempre que ningún programa comience a hacer magia de segmento:desplazamiento. […] Compáralo con el enfoque opuesto de tener múltiples puntos de entrada (quizás incluso soportando el Protocolo de compartición de interrupciones de IBM ), que consume mucha más memoria si conectas muchas interrupciones. […] Llegamos a la conclusión de que esto probablemente no sería seguro en la práctica porque nunca se sabe si otros controladores normalizan o desnormalizan los punteros, por las razones que sean. […]