CARGA TOTAL

Instrucciones no documentadas para Intel 80286 y 80386

LOADALL es el nombre común de dos instrucciones de máquina diferentes y no documentadas de los procesadores Intel 80286 e Intel 80386 , que permiten el acceso a áreas del estado interno del procesador que normalmente están fuera del alcance de la API IA-32 , como los registros de caché de descriptores . El LOADALL para los procesadores 286 está codificado como 0Fh 05h, [1] mientras que el LOADALL para los procesadores 386 es 0Fh 07h. [2]

Ambas variantes, como su nombre lo indica, cargan todos los registros internos de la CPU en una sola operación. LOADALL tenía la capacidad única de configurar la parte visible de los registros de segmento (selector) independientemente de su parte en caché correspondiente, lo que permitía al programador llevar la CPU a estados que de otro modo no estarían permitidos por el modelo de programación oficial.

Uso

Como ejemplo de la utilidad de estas técnicas, LOADALL puede configurar la CPU para permitir el acceso a toda la memoria desde el modo real , sin tener que cambiarla al modo irreal (lo que requiere cambiar al modo protegido , acceder a la memoria y finalmente volver al modo real). Programas como las versiones pre- XMS de RAMDRIVE.SYS (1985), [3] [1] [4] SMARTDRV.SYS (1986) [4] así como HIMEM.SYS (2.03, 1988-08-04; 2.04, 1988-08-17) [4] controladores en MS-DOS , The Extender (1985) y The Connector (1985) de Uniform Software Systems para Lotus 1-2-3 , Above Disk (1986) [5] (un limitador de Above Software (anteriormente Tele-Ware West también conocido como Los Angeles Securities Group) que convertía el espacio del disco duro o la memoria extendida en memoria expandida ), y OS/2 1.0 [3] [1] y 1.1 [6] usaban la instrucción 286 LOADALL. DOS 3.3 y 4.0 reservaban un búfer de 102 bytes a las 0070:0100h (que normalmente estaba ocupado por datos del BIOS de DOS ) de modo que no había necesidad de guardarlo y restaurarlo para LOADALL. EMM386.EXE de Microsoft hace casos especiales tanto para las instrucciones LOADALL 286 como 386 en su manejador de código de operación no válido . [7] El examen del código de monitor de máquina virtual en Windows/386 2.10 muestra que utiliza tanto la 286 [ cita requerida ] como la variante 386 aún menos conocida [ cita requerida ] . La versión 2.06 de HIMEM.SYS de Microsoft [8] también utilizó LOADALL para copiar rápidamente hacia y desde la memoria extendida en sistemas 286.

Otro uso interesante de LOADALL, expuesto en el libro The Design of OS/2 [ 9], habría sido permitir la ejecución de programas de modo real anteriores en modo protegido de 16 bits, como se utiliza en Concurrent DOS 286 de Digital Research desde 1985 [10] [11] [12], así como en FlexOS 286 [13] y IBM 4680 OS [14] [15] desde 1986. Marcar todos los cachés de descriptores en el GDT y los LDT como "no presentes" permitiría al sistema operativo atrapar recargas de registros de segmento, así como intentos de realizar "aritmética de segmento" específica del modo real y emular el comportamiento deseado actualizando los descriptores de segmento (LOADALL nuevamente). Sin embargo, este " modo de emulación 8086 " para el 80286 era demasiado lento para ser práctico. La idea tuvo que ser descartada en gran parte debido a erratas en algunos procesadores Intel 80286 anteriores a la versión E-2 . [10] [11] [13] Como resultado, OS/2 1.x –y también Windows en modo "estándar"– tuvieron que ejecutar programas DOS en modo real. Sin embargo, la idea no se perdió; llevó a Intel a introducir el modo 8086 virtual del 80386, permitiendo por fin la implementación de " cajas DOS " de una manera relativamente eficiente y documentada.

Debido a que LOADALL no realizó ninguna verificación sobre la validez de los datos cargados en los registros del procesador, fue posible cargar un estado del procesador al que normalmente no se podía ingresar, como usar el modo real (PE=0) junto con la paginación (PG=1) en CPU de clase 386. [2]

Un emulador en circuito (ICE) es una herramienta que se utiliza para la depuración de bajo nivel. En Intel 80386, al activar el pin no documentado en la ubicación B6, el microprocesador detiene la ejecución y entra en modo ICE. El microprocesador guarda todo su estado en un área de memoria aislada de la memoria normal del sistema. La disposición de esta área es adecuada para la instrucción LOADALL, y el código ICE utiliza esta instrucción para volver a la ejecución normal.

En procesadores posteriores, esto evolucionó al modo de administración del sistema (SMM). En SMM, la instrucción RSM se utiliza para cargar un estado completo de la CPU desde un área de memoria. El diseño de esta área de memoria es similar al utilizado por la instrucción LOADALL. [16] La instrucción LOADALL de estilo 386 también se puede ejecutar en 486, pero solo en modo SMM. En procesadores posteriores, la instrucción RSM, con una codificación diferente, asumió su papel.

Codeview 3.0 de Microsoft y Turbo Debugger 2.0 de Borland decodifican correctamente las instrucciones LOADALL 286 y 386. [1]

Como las dos instrucciones LOADALL nunca se documentaron y no existen en procesadores posteriores, los códigos de operación se reutilizaron en la arquitectura AMD64 . [17] El código de operación para la instrucción LOADALL 286, 0F05, se convirtió en la instrucción AMD64 SYSCALL; la instrucción LOADALL 386, 0F07, se convirtió en la instrucción SYSRET. Estas definiciones se implementaron incluso en las CPU Intel con la introducción de la implementación Intel 64 de AMD64. [18]

80286

Código de operación 0F05. La instrucción lee datos de las direcciones 0x00800–0x00866, independientemente del contenido de los registros del segmento.

DIRECCIÓNNúmero
de bytes
registroregistroregistroregistro
008006No utilizado
008062MSW, palabra de estado de la máquina
0080814No utilizado
008162TR (registro de tareas)
008182banderas
0081A2IP (puntero de instrucción)
0081C2LDTR,
registro de tabla de descriptores locales
0081E4×2DS ( segmento de datos )SS (segmento de pila)CS (segmento de código)ES (segmento extra)
008264×2DI (índice de destino)SI (índice de origen)BP (puntero base)SP (puntero de pila)
0082E4×2BXDXCXHACHA
008364×6Descriptor de segmento ESDescriptor de segmento CSDescriptor de segmento SSDescriptor de segmento DS
0084E4×6GDT,
tabla de descriptores globales
LDT,
tabla de descriptores locales
IDT,
tabla de descriptores de interrupciones
TSS,
segmento de estado de tarea

La instrucción LOADALL 80286 no se puede utilizar para cambiar del modo protegido al modo real [19] (no puede borrar el bit PE en el MSW). Sin embargo, el uso de la instrucción LOADALL puede evitar la necesidad de cambiar al modo protegido por completo.

80386

Código de operación 0F07. La instrucción carga datos desde la dirección ES:EDI. En realidad, utiliza ES, no el descriptor ES.

DIRECCIÓNNúmero
de bytes
registroregistroregistroregistro
ES:EDI+004CR0, registro de control 0
ES:EDI+044BANDERAS
ES:EDI+084EIP, puntero de instrucción
ES:EDI+0C4×4EDI, índice de destinoESI, índice de fuentesEBP, puntero baseESP, puntero de pila
ES:EDI+1C4×4EBXEDXExtracción electrostáticaEAX
ES:EDI+2C2×4DR6DR7
ES:EDI+344TR, selector de estado de tarea
ES:EDI+384LDTR,
tabla de descriptores locales
ES:EDI+3C4×2GS, segmento extraNo utilizadoFS, segmento adicionalNo utilizado
ES:EDI+444×2DS, segmento de datosNo utilizadoSS, segmento de pilaNo utilizado
ES:EDI+4C4×2CS, segmento de códigoNo utilizadoES, segmento extraNo utilizado
ES:EDI+544×12Descriptor TSS,
selector de estado de tarea
Descriptor IDT,
tabla de descriptores de interrupciones
Descriptor GDT,
tabla de descriptores globales
Descriptor LDT,
tabla de descriptores locales
ES:EDI+844×12Descriptor de segmento GSDescriptor de segmento FSDescriptor de segmento DSDescriptor de segmento SS
ES:EDI+B42×12Descriptor de segmento CSDescriptor de segmento ES

Véase también

Referencias

  1. ^ abcd Schulman, Andrew; Michels, Raymond J.; Kyle, Jim; Paterson, Tim ; Maxey, David; Brown, Ralf D. (1990). DOS no documentado: guía del programador para funciones y estructuras de datos reservadas de MS-DOS (1.ª ed.). Addison-Wesley . págs. 14-15. ISBN 978-0-201-57064-9.(xviii+694+viii páginas, 2× disquetes de 5,25" [1]) Erratas: [2][3]
  2. ^ de Van Gilluwe, Frank (1994). El PC indocumentado (1.ª ed.). Addison-Wesley . Págs. 62-70. ISBN 0-201-62277-7.[4]
  3. ^ ab Duncan, Ray; Petzold, Charles ; Baker, M. Steven; Schulman, Andrew; Davis, Stephen R.; Nelson, Ross P.; Moote, Robert (1990). Extending DOS (1.ª ed.). Reading, MA, EE. UU.: Addison-Wesley Publishing Company, Inc., págs. 100–103. ISBN 0-20155053-9.
  4. ^ abc Necasek, Michal (27 de octubre de 2013). «Más sobre LOADALL y OS/2». Museo OS/2 . Archivado desde el original el 17 de octubre de 2018. Consultado el 17 de octubre de 2018 .
  5. ^ Collins, Robert R. (octubre de 1991). "La instrucción LOADALL". TECH Specialist - la revista para desarrolladores avanzados de PC . 2 (10). Lawrence, Kansas, EE. UU.: R&D Publications, Inc. ISSN  1049-913X. Archivado desde el original el 20 de febrero de 2020. Consultado el 17 de octubre de 2018 .[5] (NB. La revista pronto cambió su nombre a "The DOS Developers Journal" y, finalmente, a "The Windows/DOS Developer's Journal" (ISSN 1059-2407).)
  6. ^ Necasek, Michal (18 de marzo de 2011). «HIMEM.SYS, modo irreal y LOADALL». Museo OS/2 . Archivado desde el original el 3 de enero de 2017. Consultado el 3 de enero de 2017 .
  7. ^ 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 (Dos no documentados: 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.ª edición, 2.ª edición). Reading, Massachusetts, EE. UU.: Addison Wesley Publishing Company . pág. 42. ISBN. 0-201-63287-X.(xviii+856+vi páginas, disquete de 3,5" [6]) Erratas: [7][8]
  8. ^ "Código fuente de Microsoft HIMEM.SYS 2.06".[ enlace muerto permanente ]
  9. ^ Deitel, Harvey M.; Kogan, Michael S. (1992). El diseño de OS/2 . Addison-Wesley . ISBN 0-201-54889-5.
  10. ^ ab Foster, Edward (13 de mayo de 1985). «Super DOS espera el nuevo 80286 – Concurrent DOS 286 – retrasado hasta que Intel actualice el chip – ofrece la potencia de Xenix y compatibilidad con IBM PC». InfoWorld . 7 (19). InfoWorld Media Group : 17–18. ISSN  0199-6649. Archivado desde el original el 21 de abril de 2019. Consultado el 21 de abril de 2019 .
  11. ^ ab Foster, Edward (26 de agosto de 1985). «Intel muestra un nuevo chip 80286: el futuro del DOS 286 concurrente de DRI sigue sin estar claro después de que se arregló el procesador». InfoWorld . 7 (34). InfoWorld Media Group : 21. ISSN  0199-6649. Archivado desde el original el 21 de abril de 2019. Consultado el 21 de abril de 2019 .
  12. ^ "Concurrent DOS 68K 1.2 – Kit de desarrollo para Motorola VME/10 – Disco 2". 1986-08-06 [1986-04-08]. Archivado desde el original el 2019-04-03 . Consultado el 2018-09-13 .(NB. Este paquete también incluye algunos archivos de encabezado de Concurrent DOS 286 , incluido STRUCT.H que menciona explícitamente LOADALL para la "emulación 8086").
  13. ^ ab FlexOS Supplement for Intel iAPX 286-based Computers (PDF) . 1.3 (1 ed.). Digital Research, Inc. Noviembre de 1986. Archivado (PDF) desde el original el 21 de abril de 2019 . Consultado el 14 de agosto de 2018 .
  14. ^ Calvo, Melissa; Forbes, Jim (1986-02-10). "IBM utilizará un sistema operativo DRI". InfoWorld . InfoWorld Media Group . Archivado desde el original el 2019-04-21 . Consultado el 2011-09-06 .
  15. ^ "IBM selecciona DOS-286 concurrente para el sistema de venta minorista PC AT" (PDF) . European Review (18). Digital Research : 1. Marzo de 1986. Archivado (PDF) desde el original el 2019-04-03 . Consultado el 2018-09-15 .
  16. ^ Collins, Robert R. (enero de 1997). «Modo de gestión del sistema de Intel». Archivado desde el original el 3 de enero de 2017. Consultado el 3 de enero de 2017 .
  17. ^ Necasek, Michal (18 de octubre de 2013). "LOADALL ataca de nuevo". Museo OS/2 . Archivado desde el original el 3 de enero de 2017. Consultado el 27 de enero de 2016 .
  18. ^ "Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 2B" (PDF) . Intel Corporation . Diciembre de 2015. Archivado (PDF) desde el original el 21 de abril de 2019 . Consultado el 27 de enero de 2016 .
  19. ^ Slater, Michael (octubre de 1987). "La instrucción secreta LOADALL 286 permite el acceso a la memoria extendida en modo real". Microprocessor Report .

Lectura adicional

  • IBM Operating System/2 Technical Reference – Programming Family (PDF) . Vol. 1 (1.ª ed.). IBM . Septiembre de 1987 [1986]. Archivado (PDF) desde el original el 3 de enero de 2017.
  • 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.(xxvi+738+iv páginas, disquete de 3,5" [9][10]) Erratas: [11][12][13]
  • Chappell, Geoff (3 de octubre de 2008) [18 de marzo de 1997]. «Cosas extrañas que LINK sabe sobre los procesadores 80x86». Archivado desde el original el 21 de abril de 2019. Consultado el 21 de abril de 2019 .
  • Necasek, Michal (13 de diciembre de 2014). "Instrucciones curiosas". Museo OS/2 . Archivado desde el original el 21 de abril de 2019. Consultado el 21 de abril de 2019 .
  • Más quieto, Andreas (1990). "Amargo para 32 amargos". c't - magazin für computertechnik (en alemán). vol. 1990, núm. 8. pág. 202.
  • Juffa, Norberto; Siering, Peter (1990). "Wege über die Mauer. Loadall - Memoria extendida en modo real des 80286". c't - magazin für computertechnik (en alemán). vol. 1990, núm. 11. págs. 362–366.
Retrieved from "https://en.wikipedia.org/w/index.php?title=LOADALL&oldid=1243209527"