LOADALL es el nombre común de dos instrucciones de máquina no documentadas diferentes 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 . La instrucción LOADALL para los procesadores 286 se codifica como 0Fh 05h, [ 1 ] mientras que la LOADALL para los procesadores 386 es 0Fh 07h. [ 2 ]
Ambas variantes, como su nombre 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 correspondiente almacenada en caché, 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 , Uniform Software Systems ' The Extender (1985) y The Connector (1985) para Lotus 1-2-3 , Above Disk (1986) [ 5 ] (un LIMulator 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 en 0070:0100h (que normalmente estaba ocupado por datos de BIOS de DOS ) para que no fuera necesario guardarlo y restaurarlo para LOADALL. EMM386.EXE de Microsoft trata de forma especial las instrucciones LOADALL de 286 y 386 en su controlador de código de operación no válido . [ 7 ] El examen del código del monitor de máquina virtual en Windows/386 2.10 muestra que utiliza tanto la variante de 286 como la aún menos conocida de 386. HIMEM.SYS de Microsoft versión 2.06 [ 8 ] también utilizaba LOADALL para copiar rápidamente hacia y desde la memoria extendida en sistemas 286.
Otro uso interesante de LOADALL, descrito en el libro The Design of OS/2 , [ 9 ] habría sido permitir la ejecución de programas anteriores en modo real en modo protegido de 16 bits, como lo utiliza Concurrent DOS 286 de Digital Research desde 1985, [ 10 ] [ 11 ] [ 12 ] así como FlexOS 286 [ 13 ] y IBM 4680 OS [ 14 ] [ 15 ] desde 1986. Marcar todas las cachés de descriptores en GDT y LDT como "no presentes" permitiría al sistema operativo interceptar las recargas de registros de segmento, así como los intentos de realizar "aritmética de segmento" específica del modo real y emular el comportamiento deseado actualizando los descriptores de segmento (LOADALL de nuevo). 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 su mayor parte debido a erratas en algunos procesadores Intel 80286 antiguos, anteriores a la revisión E-2 . [ 10 ] [ 11 ] [ 13 ] Como resultado, OS/2 1.x —y Windows en modo "estándar" también— tuvo que ejecutar programas DOS en modo real. Sin embargo, la idea no se perdió; llevó a Intel a introducir el modo virtual 8086 del 80386, lo que permitió la implementación de " cajas DOS " finalmente de una manera relativamente eficiente y documentada.
Debido a que LOADALL no realizaba ninguna comprobación sobre la validez de los datos cargados en los registros del procesador, era posible cargar un estado del procesador al que normalmente no se podía acceder, como por ejemplo, usar el modo real (PE=0) junto con la paginación (PG=1) en las CPU de la clase 386. [ 2 ]
Un emulador en circuito (ICE) es una herramienta utilizada para la depuración de bajo nivel . En el Intel 80386, al activar el pin no documentado en la ubicación B6, el microprocesador detiene su ejecución y entra en modo ICE. El microprocesador guarda todo su estado en un área de memoria aislada de la memoria del sistema. La disposición de esta área es adecuada para la instrucción LOADALL, que el código ICE utiliza para reanudar la ejecución normal.
En procesadores posteriores, esto evolucionó al Modo de Gestió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. La disposición de esta área de memoria es similar a la utilizada por la instrucción LOADALL. [ 16 ] La instrucción LOADALL al 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 función.
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 del 286, 0F05, se convirtió en la instrucción SYSCALL de AMD64; la instrucción LOADALL del 386, 0F07, se convirtió en la instrucción SYSRET. Estas definiciones se implementaron incluso en las CPU de Intel con la introducción de la implementación Intel 64 de AMD64. [ 18 ]
80286
Código de operación 0F05. Esta instrucción lee datos de las direcciones 0x00800–0x00866, independientemente del contenido de los registros de segmento.
La instrucción LOADALL del 80286 no se puede usar 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 por completo la necesidad de cambiar al modo protegido.
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.
Véase también
Referencias
- 1 2 3 4 Schulman, Andrew; Michels, Raymond J.; Kyle, Jim; Paterson, Tim ; Maxey, David; Brown, Ralf D. (1990). Undocumented DOS: A programmer's guide to reserved MS-DOS functions and data structures (1.ª ed.). Addison-Wesley . págs. 14–15 . ISBN 978-0-201-57064-9.(xviii+694+viii páginas, 2 disquetes de 5,25")) Erratas:
- 1 2 Van Gilluwe, Frank (1994). The Undocumented PC (1.ª ed.). Addison-Wesley . págs. 62–70 . ISBN 0-201-62277-7.
- 1 2 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.
- 1 2 3 Necasek, Michal (27-10-2013). "Más sobre LOADALL y OS/2" . Museo OS/2 . Recuperado el 17-10-2018 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ 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 del original el 20 de febrero de 2020. Consultado el 17 de octubre de 2018 . (Nota: La revista pronto pasó a llamarse "The DOS Developers Journal" y, finalmente, "The Windows/DOS Developer's Journal" (ISSN 1059-2407).)
- ↑ Necasek, Michal (18 de marzo de 2011). "HIMEM.SYS, modo irreal y LOADALL" . Museo OS/2 . Archivado del original el 3 de enero de 2017. Recuperado el 3 de enero de 2017 .
- ↑ 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ág . 42. ISBN 0-201-63287-X.(xviii+856+vi páginas, disquete de 3,5")) Erratas:
- ↑ "Código fuente de Microsoft HIMEM.SYS 2.06" . Servidor FTP ( FTP ).(Para ver los documentos, consulte Ayuda:FTP )
- ↑ Deitel, Harvey M.; Kogan, Michael S. (1992). El diseño de OS/2 . Addison-Wesley . ISBN 0-201-54889-5.
- 1 2 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 . Recuperado el 21 de abril de 2019 .
{{cite journal}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - 1 2 Foster, Edward (1985-08-26). "Intel muestra el nuevo chip 80286: el futuro del Concurrent DOS 286 de DRI sigue sin estar claro después de que se corrigió el procesador" . InfoWorld . 7 (34). InfoWorld Media Group : 21. ISSN 0199-6649 . Recuperado el 21 de abril de 2019 .
{{cite journal}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ "Concurrent DOS 68K 1.2 – Kit de desarrollo para Motorola VME/10 – Disco 2" . 6 de agosto de 1986 [8 de abril de 1986]. Archivado del original el 3 de abril de 2019. Consultado el 13 de septiembre de 2018 .(Nota: Este paquete también incluye algunos archivos de cabecera de Concurrent DOS 286 , incluido STRUCT.H que menciona explícitamente LOADALL para la "emulación de 8086").
- 1 2 Suplemento FlexOS para computadoras basadas en Intel iAPX 286 (PDF) . 1.3 (1.ª ed.). Digital Research, Inc. Noviembre de 1986. Archivado (PDF) del original el 21 de abril de 2019. Recuperado el 14 de agosto de 2018 .
- ↑ Calvo, Melissa; Forbes, Jim (1986-02-10). "IBM utilizará un sistema operativo DRI" . InfoWorld . InfoWorld Media Group . Recuperado el 2011-09-06 .
{{cite journal}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ "IBM selecciona Concurrent DOS-286 para el sistema minorista PC AT" (PDF) . European Review (18). Digital Research : 1. Marzo de 1986. Archivado (PDF) del original el 3 de abril de 2019. Recuperado el 15 de septiembre de 2018 .
- ↑ Collins, Robert R. (enero de 1997). "Modo de administración del sistema de Intel" . Archivado del original el 3 de enero de 2017. Recuperado el 3 de enero de 2017 .
- ↑ Necasek, Michal (18 de octubre de 2013). "LOADALL ataca de nuevo" . Museo OS/2 . Archivado del original el 3 de enero de 2017. Recuperado el 27 de enero de 2016 .
- ↑ "Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, volumen 2B" (PDF) . Intel Corporation . Diciembre de 2015. Archivado (PDF) del original el 21 de abril de 2019. Consultado el 27 de enero de 2016 .
- ↑ Slater, Michael (octubre de 1987). "La instrucción secreta 286 LOADALL permite el acceso a la memoria extendida en modo real". Microprocessor Report .
Lecturas adicionales
- Referencia técnica del sistema operativo IBM/2 – Familia de programación (PDF) . Vol. 1 (1.ª ed.). IBM . Septiembre de 1987 [1986]. Archivado (PDF) del 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")) Erratas:
- Chappell, Geoff (03-10-2008) [18-03-1997]. "Cosas extrañas que LINK sabe sobre los procesadores 80x86" . Archivado del original el 21-04-2019 . Recuperado el 21-04-2019 .
- Necasek, Michal (13 de diciembre de 2014). "Instrucciones curiosas" . Museo OS/2 . Archivado del original el 21 de abril de 2019. Recuperado 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 .
- Instrucciones X86