LOADALL es el nombre común para dos instrucciones de máquina diferentes e indocumentadas de procesadores Intel 80286 e Intel 80386 , que permiten el acceso a áreas del estado del procesador interno que normalmente están fuera del alcance de la API IA-32 , como los registros de caché de descriptores . LOADALL para 286 procesadores está codificado 0Fh 05h, [1] mientras que LOADALL para 386 procesadores 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 correspondiente parte en caché, lo que permite al programador llevar la CPU a estados no 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 (que requiere cambiar al modo protegido , acceder a la memoria y finalmente volver al modo real). modo). Programas como las versiones anteriores a XMS de RAMDRIVE.SYS (1985), [3] [1] [4] SMARTDRV.SYS (1986) [4] así como HIMEM.SYS (2.03, 1988-08-04; 2.04 , 08/17/1988) [4] conductores en MS-DOS , Uniforme Software Systems ' El extensor (1985) y El conector (1985) para Lotus 1-2-3 , encima de disco (1986) [5] (a LIMulator por Above Software (anteriormente Tele-Ware West también conocido como Los Angeles Securities Group ) que convirtió el espacio del disco duro o la memoria extendida en memoria expandida ), y OS / 2 1.0 [3] [1] y 1.1 [6] usaron la instrucción 286 LOADALL. DOS 3.3 y 4.0 reservaron un búfer de 102 bytes a las 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 : casos especiales para las instrucciones 286 y 386 LOADALL en su controlador de código de operación no válido. [7] El examen del código del monitor de la máquina virtual en Windows / 386 2.10 muestra que utiliza tanto el 286 [ cita requerida ] como la aún menos conocida 386 variante [ cita requerida ] . La versión 2.06 [8] de HIMEM.SYS de Microsoft también usó LOADALL para copiar rápidamente hacia y desde la memoria extendida en 286 sistemas.
Otro uso interesante de LOADALL, presentado en el libro El diseño de OS / 2 , [9] habría sido permitir la ejecución de programas anteriores en modo real en modo protegido de 16 bits, como los utilizados por Digital Research 's concurrente DOS 286 desde 1985, [10] [11] [12] , así como FlexOS 286 [13] e IBM 4680 OS [14] [15] desde 1986. Marcar todas las cachés de descriptores en el GDT y LDT como "no presentes" permitiría el funcionamiento sistema para 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). Este "modo 8086 virtual" para el 80286 era, sin embargo, demasiado lento para ser práctico. La idea tuvo que ser desechado en su mayoría, por otra parte, debido a la fe de erratas en algunos procesadores Intel 80286 temprano antes de que el E-2 paso a paso . [10] [11] [13] Como resultado, OS / 2 1.x - y Windows en modo "estándar" también - 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 la implementación de " cajas DOS " por fin de una manera relativamente eficiente y documentada.
Debido a que LOADALL no realizó ninguna verificación de la validez de los datos cargados en los registros del procesador, fue posible cargar un estado del procesador que no se podía ingresar normalmente, 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, la afirmación del pin no documentado en la ubicación B6 hace que el microprocesador detenga la ejecución y entre en modo ICE. El microprocesador guarda todo su estado en un área de memoria aislada de la memoria normal del sistema. El diseño de esta área es adecuado 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 usa para cargar un estado de CPU completo 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 de estilo 386 también se puede ejecutar en 486, pero sólo en modo SMM. En procesadores posteriores, la instrucción RSM, con una codificación diferente, tomó 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 286 LOADALL, 0F05, se convirtió en la instrucción AMD64 SYSCALL; la instrucción 386 LOADALL, 0F07, se convirtió en la instrucción SYSRET. Estas definiciones se implementaron incluso en 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 00800–00866, cualquiera que sea el contenido de los registros de segmento.
Habla a | número de bytes | Registrarse | Registrarse | Registrarse | Registrarse |
---|---|---|---|---|---|
00800 | 6 | no utilizado | |||
00806 | 2 | MSW, palabra de estado de la máquina | |||
00808 | 14 | no utilizado | |||
00816 | 2 | TR (registro de tareas) | |||
00818 | 2 | banderas | |||
0081A | 2 | IP (puntero de instrucción) | |||
0081C | 2 | LDTR, registro de tabla de descriptor local | |||
0081E | 4 × 2 | DS ( segmento de datos ) | SS (segmento de pila) | CS (segmento de código) | ES (segmento extra) |
00826 | 4 × 2 | DI (índice de destino) | SI (índice de fuente) | BP (puntero base) | SP (puntero de pila) |
0082E | 4 × 2 | BX | DX | CX | HACHA |
00836 | 4 × 6 | Descriptor de segmento ES | Descriptor de segmento CS | Descriptor de segmento SS | Descriptor de segmento DS |
0084E | 4 × 6 | GDT, tabla de descriptores globales | LDT, tabla de descriptores locales | IDT, tabla de descriptores de interrupciones | TSS, segmento de estado de tarea |
La instrucción 80286 LOADALL 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 por completo la necesidad de cambiar al modo protegido.
80386
Código de operación 0F07. La instrucción carga datos de la dirección ES: EDI. En realidad, usa ES, no el descriptor ES.
Habla a | número de bytes | Registrarse | Registrarse | Registrarse | Registrarse |
---|---|---|---|---|---|
ES: EDI + 00 | 4 | CR0, registro de control 0 | |||
ES: EDI + 04 | 4 | EFLAGS | |||
ES: EDI + 08 | 4 | EIP, puntero de instrucción | |||
ES: EDI + 0C | 4 × 4 | EDI, índice de destino | ESI, índice de fuente | EBP, puntero base | ESP, puntero de pila |
ES: EDI + 1C | 4 × 4 | EBX | EDX | ECX | EAX |
ES: EDI + 2C | 2 × 4 | DR6 | DR7 | ||
ES: EDI + 34 | 4 | TR, selector de estado de la tarea | |||
ES: EDI + 38 | 4 | LDTR, tabla de descriptores locales | |||
ES: EDI + 3C | 4 × 2 | GS, segmento extra | no utilizado | FS, segmento extra | no utilizado |
ES: EDI + 44 | 4 × 2 | DS, segmento de datos | no utilizado | SS, segmento de pila | no utilizado |
ES: EDI + 4C | 4 × 2 | CS, segmento de código | no utilizado | ES, segmento extra | no utilizado |
ES: EDI + 54 | 4 × 12 | Descriptor TSS, selector de estado de la tarea | Descriptor IDT, tabla de descriptores de interrupciones | Descriptor de GDT, tabla de descriptores globales | Descriptor LDT, tabla de descriptores locales |
ES: EDI + 84 | 4 × 12 | Descriptor de segmento GS | Descriptor de segmento FS | Descriptor de segmento DS | Descriptor de segmento SS |
ES: EDI + B4 | 2 × 12 | Descriptor de segmento CS | Descriptor de segmento ES |
Ver también
- DOS 286 concurrente
- FlexOS 286
- Sistema operativo IBM 4680
Referencias
- ^ a b c d Schulman, Andrew; Michels, Raymond J .; Kyle, Jim; Paterson, Tim ; Maxey, David; Brown, Ralf D. (1990). DOS sin documentar: una guía del programador para las 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 × 5,25 "-floppies [1] ) Fe de erratas: [2] [3]
- ^ a b Van Gilluwe, Frank (1994). La PC indocumentada (1 ed.). Addison-Wesley . págs. 62–70. ISBN 0-201-62277-7. [4]
- ^ a b Duncan, Ray; Petzold, Charles ; Baker, M. Steven; Schulman, Andrew; Davis, Stephen R .; Nelson, Ross P .; Moote, Robert (1990). Ampliación de DOS (1 ed.). Reading, MA, EE.UU .: Addison-Wesley Publishing Company, Inc. págs. 100–103. ISBN 0-20155053-9.
- ^ a b c 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 .
- ^ Collins, Robert R. (octubre de 1991). "La instrucción LOADALL" . Tech Specialist: la revista para desarrolladores avanzados de PC . Lawrence, Kansas, Estados Unidos: I + D Publications, Inc. 2 (10). 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 pasó a llamarse "The DOS Developers Journal" y, finalmente, a "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 desde el original el 3 de enero de 2017 . Consultado 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.). DOS sin documentar: una guía del programador para las estructuras de datos y funciones reservadas de MS-DOS, ampliada para incluir MS-DOS 6, Novell DOS y Windows 3.1 . The Andrew Schulman Programming Series (primera impresión, segunda edición). Reading, Massachusetts, EE.UU .: Addison Wesley Publishing Company . pag. 42 . ISBN 0-201-63287-X.(xviii + 856 + vi páginas, 3.5 "-floppy [6] ) Errata: [7] [8]
- ^ "Código fuente de Microsoft HIMEM.SYS 2.06" .
- ^ Deitel, Harvey M .; Kogan, Michael S. (1992). El diseño de OS / 2 . Addison-Wesley . ISBN 0-201-54889-5.
- ^ a b Foster, Edward (13 de mayo de 1985). "Super DOS espera el nuevo 80286 - DOS 286 concurrente - retrasado hasta que Intel actualice el chip - ofrece la potencia de Xenix y la compatibilidad con IBM PC" . InfoWorld . InfoWorld Media Group . 7 (19): 17-18. ISSN 0199-6649 . Archivado desde el original el 21 de abril de 2019 . Consultado el 21 de abril de 2019 .
- ^ a b Foster, Edward (26 de agosto de 1985). "Intel muestra un nuevo chip 80286: el futuro del DOS 286 concurrente de DRI aún no está claro después de la reparación del procesador" . InfoWorld . InfoWorld Media Group . 7 (34): 21. ISSN 0199-6649 . Archivado desde el original el 21 de abril de 2019 . Consultado el 21 de abril de 2019 .
- ^ "DOS 68K 1.2 concurrente - Kit de desarrollo para Motorola VME / 10 - Disco 2" . 6 de agosto de 1986 [8 de abril de 1986]. Archivado desde el original el 3 de abril de 2019 . Consultado el 13 de septiembre de 2018 .(NB. Este paquete también incluye algunos archivos de encabezado de DOS 286 simultáneos , incluido STRUCT.H que menciona explícitamente LOADALL para "emulación 8086").
- ^ a b Suplemento FlexOS para computadoras basadas en Intel iAPX 286 (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 .
- ^ Calvo, Melissa; Forbes, Jim (10 de febrero de 1986). "IBM para utilizar un sistema operativo DRI" . InfoWorld . InfoWorld Media Group . Archivado desde el original el 21 de abril de 2019 . Consultado el 6 de septiembre de 2011 .
- ^ "IBM selecciona Concurrent DOS-286 para PC AT sistema minorista" (PDF) . Revista europea . Investigación digital (18): 1. marzo de 1986. Archivado (PDF) desde el original el 3 de abril de 2019 . Consultado el 15 de septiembre de 2018 .
- ^ 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 .
- ^ 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 .
- ^ "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 .
- ^ Slater, Michael (octubre de 1987). "La instrucción secreta 286 LOADALL permite el acceso a la memoria extendida en modo real". Informe del microprocesador .
Otras lecturas
- Referencia técnica del sistema operativo IBM / 2 - Familia de programación (PDF) . 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.). Internos de DOS . The Andrew Schulman Programming Series (primera impresión, primera edición). Addison Wesley Publishing Company . págs. 4, 21, 100-106, 127-129. ISBN 978-0-201-60835-9.(xxvi + 738 + iv páginas, 3.5 "-floppy [9] [10] ) Fe de erratas: [11] [12] [13]
- Chappell, Geoff (3 de octubre de 2008) [18 de marzo de 1997]. "Cosas extrañas que LINK sabe sobre 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 .
- Stiller, Andreas (1990). "Bitter für 32-Bitter". c't - magazin für computertechnik (en alemán). Vol. 1990 no. 8. p. 202.
- Juffa, Norbert; Siering, Peter (1990). "Wege über die Mauer. Loadall - Extended Memory im Real Mode des 80286". c't - magazin für computertechnik (en alemán). Vol. 1990 no. 11. págs. 362–366.