
En la gestión de memoria DOS , el área de memoria alta ( HMA ) es el área de RAM que consta de los primeros 65520 bytes por encima del megabyte en una computadora IBM AT o compatible.
En modo real , la arquitectura de segmentación de los procesadores Intel 8086 y posteriores identifica las 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á pensado para direccionar solo 1 megabyte (MB) (2 20 bytes) de memoria, segmento:desplazamiento se dirige a FFFF:0010la memoria de referencia más allá de 1 MB ( FFFF0 + 0010 = 100000). 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 comenzando 16 bytes antes de la marca de 1 MB, FFFF:0000 (0xFFFF0)hasta FFFF:FFFF (0x10FFEF). Los procesadores Intel 8086 y 8088 , con solo 1 MB de memoria y solo 20 líneas de dirección , se envolvían en el bit 20, por lo que esa dirección FFFF:0010era equivalente a 0000:0000. [1]
Para permitir la ejecución de programas DOS existentes que dependían de esta característica para acceder a la memoria baja en sus computadoras IBM PC AT más nuevas, IBM agregó un circuito especial en la placa base para simular el enrollado. Este circuito era una puerta lógica simple que podía desconectar la línea de direccionamiento número 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 quisieran acceder a toda la RAM. [1]
Los denominados controladores A20 podrían controlar el modo de direccionamiento de forma dinámica, [1] permitiendo así que los programas se carguen en la región de 1024–1088 KB y se ejecuten en modo real. [1]
El código adecuado para ser ejecutado en la HMA debe estar codificado para que sea independiente de la posición (usando solo referencias relativas), [2] [1] debe compilarse para funcionar en las direcciones específicas en la HMA (normalmente permitiendo que solo una o como máximo dos piezas de código compartan la HMA), o debe estar diseñado para que sea reubicable en los límites de párrafo o incluso en desplazamientos (con todas las direcciones fijadas durante la carga). [2] [1]
Antes de que la CPU pueda acceder al código (o los datos) en la HMA, el controlador correspondiente debe asegurarse de que la HMA esté mapeada. Esto requiere que dichas solicitudes se tunelicen a través de un stub que permanece en la memoria fuera de la HMA, que invocaría al controlador A20 para habilitar (temporalmente) la compuerta A20 . [2] [1] Si el controlador no exhibe ninguna estructura de datos públicos y solo usa 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]
El primer usuario de la 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 del BIOS y del núcleo del sistema operativo también se podían cargar en la HMA, [3] [5] liberando hasta 46 KB de memoria convencional . [1] Otros componentes, como los controladores de dispositivos y los programas residentes de terminación y permanencia (TSR), al menos se podían cargar en el área de memoria superior (UMA), pero no en la HMA. En DOS 5.0 y versiones superiores, con , el sistema intentaba además mover los búferes de disco a la HMA. [5] Bajo DR DOS 6.0 (1991) y superiores, los buffers de disco (a través de , y posteriormente 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í incluso más memoria convencional y memoria superior para que el software DOS convencional trabaje con ella. [1] TASKMAX parece haber reubicado partes de sí mismo también en el HMA. [6] [7] El 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, una porción compartida de ca. 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] En MS-DOS 6.2 (1993) y versiones superiores, una porción de aproximadamente 5 KB de DBLSPACE.BIN / DRVSPACE.BIN puede coexistir con DOS en la HMA (a menos que se invoque DBLSPACE / DRVSPACE ). [5] [12] En PC DOS 7.0 (1995) y 2000 , DOSKEY se carga en la HMA (si está disponible), [13]HIDOS.SYS /BDOS=FFFF HIDOS=ONDOS=HIGHDOS=HIGHHIBUFFERSBUFFERSHIGH/MH /NOHMAy SHARE también se puede cargar en el HMA (a menos que /NOHMAse dé su opción). [13] En MS-DOS 7.0 (1995) a 8.0 (2000), partes del HMA también se utilizan como un bloc de notas para almacenar una estructura de datos creciente que registra varias propiedades de los controladores de modo real cargados. [7] [14] [15]
Véase también
- Memoria baja (los primeros 64 KB de memoria)
- Memoria extendida (XMS)
- Memoria expandida (EMS)
- Modo irreal
- Rebase
- Reubicación de límites de párrafos
- Reubicación de compensación dentro del segmento
- SHELLHIGH (directiva CONFIG.SYS) parámetro SIZE=xxxx para anular la preasignación HMA predeterminada (solo DR-DOS 7.02 y superior) [16]
- HMAREA (directiva CONFIG.SYS) para especificar el segmento HMA (sólo PTS-DOS), similar al parámetro DR DOS HIDOS.SYS /BDOS=xxxx
- Descodificación de dirección incompleta
Notas
- ^ No es necesario un stub para las extensiones de sistema residentes SHARE y NLSFUNC bajo DR DOS 6.0 y superior, porque solo enganchan la interrupción multiplex INT 2Fh y, por lo tanto, pueden utilizar una interfaz de puerta trasera para engancharse a la cadena de interrupciones en el espacio del núcleo de modo que el controlador de la puerta A20 del núcleo proporcione la funcionalidad del stub.
Referencias
- ^ abcdefghij Paul, Matthias R. (2002-02-02). "Carga dinámica de controladores (reubicación de desplazamiento entre segmentos para cargar TSR en la HMA)" (en alemán). Grupo de noticias : de.comp.os.msdos. Archivado desde el original el 2017-09-09 . Consultado el 2017-07-02 .(NB. Proporciona una descripción general completa de la historia y la "naturaleza" de la HMA y las restricciones de diseño no obvias que se deben observar al desarrollar extensiones de sistema residentes que se cargarán en la HMA. También describe cómo abordar estos problemas utilizando stubs , backdoors y reubicación de desplazamiento dentro del segmento, 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).
- ^ abc Ingenoso, Tony (1998-12-20). "Capítulo 13 - La compuerta A20 y la HMA". Cómo hacer que el código funcione mejor: cómo minimizar el tamaño del código de 80x86 y, a veces, hacerlo más rápido (libro electrónico). Archivado desde el original el 2019-11-18 . Consultado el 2019-11-18 .
- ^ abc Dryfoos, Mike, ed. (1991-09-18) [1991-07-19]. "Informe post-mortem del desarrollo de MS-DOS 5.0" (PDF) (enviar como documento judicial). Microsoft . pág. 10. MS-PCA1179169 (MS-PCA1179159-MS-PCA1179191). MS7020988 (MS7020978-MS7021010). Depo. Ex. 1109. Comes v Microsoft Anexo 3473 del demandante. CA.No.2:96CV645B Anexo 477 del demandante. Archivado (PDF) desde el original el 2019-04-02 . Consultado el 2019-07-22 .
[…] Uno de los estímulos más importantes para agregar características fue la presión competitiva de
DRDOS 5.0
, de la que nos enteramos por primera vez en la primavera de 1990. El conjunto de características de DRDOS nos llevó a agregar soporte
UMB
, intercambio de tareas y recuperación de archivos eliminados. […] Una cantidad considerable de la atención de la gerencia del equipo se desvió a nuevas características como software de transferencia de archivos, recuperación de archivos eliminados e instalación en red […] Finalmente, esta situación llegó a un punto crítico a fines de julio de 1990 y, liderada por
BradS
, la gerencia del equipo pasó una ardua serie de reuniones para definir un cronograma y un proceso para cerrar el proyecto […]
(1+32 páginas)
- ^ 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 (reemplaza a FYI-M-1303). Archivado desde el original el 15 de diciembre de 2021. Consultado el 15 de diciembre de 2021 .
- ^ abc Schulman, Andrew; Brown, Ralf D .; Maxey, David; Michels, Raymond J.; Kyle, Jim (1994) [noviembre de 1993]. Williams, Andrew (ed.). Undocumented DOS: A programmer's guide to reserved MS-DOS functions and data structures - extended to include MS-DOS 6, Novell DOS and Windows 3.1 . La serie de programación de Andrew Schulman (1.ª impresión, 2.ª ed.). Reading, Massachusetts, EE. UU.: Addison Wesley Publishing Company . págs. 42, 349–350, 437–438. ISBN 0-201-63287-X. ISBN 978-0-201-63287-3 . (xviii+856+vi páginas, disquete de 3,5" [1]) Erratas: [2][3]
- ^ "Formato del bloque de memoria HMA (kernel DR DOS 6.0 cargado en HMA)". RBIL . 2000. Archivado desde el original el 18 de febrero de 2020 . Consultado el 18 de febrero de 2020 .
- ^ abc Paul, Matthias R. (10 de abril de 2002). «[fd-dev] Acceso a HMA desde TSR». freedos-dev . Archivado desde el original el 9 de septiembre de 2017 . Consultado el 9 de septiembre de 2017 .
[…]
MS-DOS 7.0+
agrega INT 21h/AX=4A03h e INT 21h/AX=4A04h.
RBIL
61 INT 21h/AH=52h tiene algo de 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 puede cargar grandes partes del
BIOS
y
BDOS
, la parte residente del shell, los
BUFFERS
y los TSR de DR-DOS como
SHARE
,
KEYB
y
NLSFUNC
(y en algunos números partes de TASKMGR y
NWCACHE
) en el HMA, generalmente todavía hay espacio libre disponible, típicamente alrededor de 10 Kb (hasta ca. 20 Kb cuando usa un shell de terceros). También tiene sentido para
MS-DOS 5.0
-
6.22
y
PC DOS
hasta
2000
, que generalmente dejan entre 4 y 7 Kb de la memoria HMA sin usar (SHARE, KEYB y NLSFUNC no se pueden cargar en el HMA, pero
DBLSPACE
y
HIMEM
pueden hasta cierto punto). El espacio disponible en HMA puede ser bastante limitado con
MS-DOS 7.0+
, ya que este problema introdujo una nueva estructura de datos RMD, en su mayor parte no documentada, que normalmente se encuentra en HMA. El núcleo recopila y registra datos de configuración y del controlador de modo real durante el arranque (tipo de controlador, interrupciones enganchadas por el controlador, línea de invocación
CONFIG.SYS
, etc.) y almacena esta información en una […] estructura de datos complicada […] y […] creciente. Es de suponer que esta información está destinada a ser utilizada por el núcleo de Windows para obtener una mejor imagen de los controladores de modo real cargados en lugar de tratar a DOS como un bloque monolítico, o incluso […] intentar desenganchar o descargar algunos de ellos, sin embargo, solo se utiliza en una medida muy limitada (por ejemplo, puede ver parte de la información reflejada en los archivos de registro creados en el inicio de Windows 9x, y algunas partes del administrador de configuración de Windows también la utilizan), lo que deja espacio para la especulación mucho más allá del aspecto técnico, en particular porque nada de lo interesante está documentado… […]
- ^ 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 .(NB.
NWDOSTIP.TXTes un trabajo exhaustivo sobre Novell DOS 7 y OpenDOS 7.01 , que incluye la descripción de muchas características y componentes internos no documentados. Es parte de laMPDOSTIP.ZIPcolección aún más grande del autor mantenida hasta 2001 y distribuida en muchos sitios en ese momento. El enlace proporcionado apunta a una versión anterior del archivo convertida a HTML). [4] - ^ Paul, Matías R. (9 de abril de 2001). "II.4. Undokumentierte Eigenschaften externer Kommandos". NWDOS-TIP: consejos y trucos para Novell DOS 7, con Blick auf desdokumentierte Detalles, errores y soluciones . MPDOSTIP (en alemán) (3 ed.).
- ^ ab 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-9. ISBN 0-201-60835-9 . (xxvi+738+iv páginas, disquete de 3,5" [5][6]) Erratas: [7][8][9]
- ^ Paul, Matthias R. (4 de diciembre de 2002). "[fd-dev] DISPLAY CON?". freedos-dev . Archivado desde el original el 8 de diciembre de 2021.
[…] algunas ediciones de DISPLAY.SYS (de
PC DOS 7
/
2000
, por ejemplo) almacenan las fuentes actualmente no utilizadas en
la memoria XMS
. Algunas ediciones anteriores de MS-DOS/PC DOS DISPLAY.SYS parecen haber tenido una función para almacenarlas en la HMA […]
- ^ Cooper, Jim (2002). Uso de MS-DOS 6.22 (3.ª edición especial). Que Publishing . p. 669. ISBN 0-78972573-8. ISBN 978-0-78972573-8 . Archivado desde el original el 18 de febrero de 2020 . Consultado el 18 de febrero de 2020 .
- ^ ab Brooks, Vernon C. (2014). "Esta es una lista detallada de los cambios que hice en PC DOS 7.0". PC DOS Retro . Archivado desde el original el 18 de febrero de 2020. Consultado el 18 de febrero de 2020.
[…]
DOSKEY.COM
[…] Mueva el código a HMA si está disponible. […]
SHARE.EXE[
…] Mueva el código a HMA si está disponible y agregue la opción /NOHMA para forzar la carga a nivel bajo. […]
- ^ Sweger, Kristofer (2007) [15 de julio de 2002]. "ANSIPLUS y Windows". Archivado desde el original el 28 de noviembre de 2021. Consultado el 28 de noviembre de 2021. [
…] El código de ANSIPLUS no se puede cargar en la HMA en
MS-DOS 7
(solo Windows 9x) porque aparentemente no hay suficiente memoria HMA sin usar disponible. […]
- ^ Paul, 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. Archivado desde el original el 4 de septiembre de 2017 . Consultado el 3 de septiembre de 2017 .
- ^ 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 desde el original el 2003-10-04 . Consultado el 2009-03-29 .[10]
Lectura adicional
- Necasek, Michal (13 de septiembre de 2011). "¿Quién necesita el ajuste de dirección, de todos modos?". Museo OS/2 . Archivado desde el original el 19 de febrero de 2020. Consultado el 19 de febrero de 2020. [
…] 86-DOS , y por lo tanto PC DOS / MS-DOS , usaban un truco inteligente. 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 parte del segmento de la llamada lejana, se diseñó de tal manera que, cuando se combinaba con el desplazamiento, se ajustaría (una característica bien entendida de la CPU 8086 ) y apuntaría a la dirección 0:C0h, que contiene el vector de interrupción 30h. […] la interfaz CALL 5 funciona incluso en emulación DOS bajo Windows NT y OS/2, y esos sistemas ciertamente no pueden funcionar con la línea A20 deshabilitada. ¿Cómo funciona eso entonces? […] En lugar de cortar bits de dirección, el sistema refleja los cinco bytes en 0:C0h en 1000C0h. La misma técnica se había utilizado de hecho en DOS 5 y superior que se ejecutaba 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 desde el original el 16 de octubre de 2006. Consultado el 15 de octubre de 2006 .
- Paul, Matthias R. (11 de abril de 2002). "Re: [fd-dev] ANUNCIO: CuteMouse 2.0 alpha 1". freedos-dev . Archivado desde el original el 21 de febrero de 2020 . Consultado el 21 de febrero de 2020 . […] en caso de
punteros
tan destrozados […] 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 encuadre de inicio/salida más o menos idéntico en todos ellos), y luego cambiar a los diferentes controladores de interrupciones internamente. Por ejemplo: 1234h:0000h […] 1233h:0010h […] 1232h:0020h […] 1231h:0030h […] 1230h:0040h […] todos apuntan exactamente al mismo punto de entrada. Si conecta INT 21h a 1234h:0000h e INT 2Fh a 1233h:0010h, y así sucesivamente, todos pasarían por el mismo "vacío", pero aún podría distinguirlos y ramificarse en los diferentes controladores internamente. Piense 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. […] Compare esto con el enfoque opuesto de tener múltiples puntos de entrada (quizás incluso admitiendo el Protocolo de uso compartido de interrupciones de IBM ), que consume mucha más memoria si conecta 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 cualquier razón. […]