CHARGEMENT TOUT - LOADALL
LOADALL est le nom commun de deux instructions machine différentes et non documentées des processeurs Intel 80286 et Intel 80386 , qui permettent d'accéder à des zones de l'état du processeur interne qui sont normalement en dehors de la portée de l' API IA-32 , comme les registres de cache de descripteur . Le LOADALL pour 286 processeurs est codé 0Fh 05h, tandis que le LOADALL pour 386 processeurs est 0Fh 07h.
Les deux variantes - comme leur nom l'indique - chargent tous les registres internes du CPU en une seule opération. LOADALL avait la capacité unique de configurer la partie visible des registres de segment (sélecteur) indépendamment de leur partie cache correspondante, permettant au programmeur d'amener le CPU dans des états non autorisés par le modèle de programmation officiel.
Usage
À titre d'exemple de l'utilité de ces techniques, LOADALL peut configurer le CPU pour permettre l'accès à toute la mémoire à partir du mode réel , sans avoir à le basculer en mode irréel (ce qui nécessite de passer en mode protégé , d'accéder à la mémoire et enfin de revenir en mode réel mode). Programmes tels que les versions pré- XMS des pilotes RAMDRIVE.SYS (1985), SMARTDRV.SYS (1986) ainsi que HIMEM.SYS (2.03, 1988-08-04; 2.04, 1988-08-17) sous MS-DOS , Uniform Software Systems ' The Extender (1985) and The Connector (1985) for Lotus 1-2-3 , Above Disk (1986) (un LIMulator d'Above Software (anciennement Tele-Ware West alias Los Angeles Securities Group ) qui a converti en dur espace disque ou mémoire étendue dans la mémoire paginée ), et OS / 2 1.0 et 1.1 ont utilisé l'instruction 286 LOADALL. DOS 3.3 et 4.0 ont réservé un tampon de 102 octets à 0070: 0100h (qui était normalement occupé par les données du BIOS DOS ) afin qu'il n'y ait pas besoin de le sauvegarder et de le restaurer pour LOADALL. EMM386.EXE de Microsoft casse les instructions LOADALL 286 et 386 dans son gestionnaire d'opcode invalide. L'examen du code du moniteur de machine virtuelle dans Windows / 386 2.10 montre qu'il utilise à la fois la variante 286 et la variante 386 encore moins connue. HIMEM.SYS version 2.06 de Microsoft a également utilisé LOADALL pour copier rapidement vers et depuis la mémoire étendue sur 286 systèmes.
Une autre utilisation intéressante de LOADALL, aménagé dans le livre La conception d'OS / 2 , aurait été de permettre l' exécution d' anciens programmes en mode réel en mode protégé 16 bits, comme utilisé par Digital Research de Concurrent DOS 286 depuis 1985, ainsi que FlexOS 286 et IBM 4680 OS depuis 1986. Marquer tous les caches de descripteurs dans le GDT et les LDT comme "non présents" permettrait au système d'exploitation d'intercepter les recharges de segments-registres, ainsi que les tentatives d'exécuter des segments spécifiques au mode réel " arithmétique "et émuler le comportement souhaité en mettant à jour les descripteurs de segment (LOADALL à nouveau). Ce "mode 8086 virtuel" pour le 80286 était cependant trop lent pour être pratique. L'idée a dû être mis au rebut la plupart du temps, en outre, en raison de errata dans certains processeurs Intel début 80286 avant le E-2 pas à pas . En conséquence, OS / 2 1.x - et Windows également en mode "standard" - ont dû exécuter des programmes DOS en mode réel. Néanmoins, l'idée n'a pas été perdue; elle a conduit Intel à introduire le mode virtuel 8086 du 80386, permettant enfin l'implémentation de " boîtes DOS " de manière relativement efficace et documentée.
Comme LOADALL n'a effectué aucun contrôle sur la validité des données chargées dans les registres du processeur, il était possible de charger un état du processeur qui ne pouvait normalement pas être entré, comme l'utilisation du mode réel (PE = 0) avec pagination (PG = 1 ) sur les processeurs de classe 386.
Un émulateur en circuit (ICE) est un outil utilisé pour le débogage de bas niveau. Sur Intel 80386, l'affirmation de la broche non documentée à l'emplacement B6 entraîne l'arrêt de l'exécution du microprocesseur et le passage en mode ICE. Le microprocesseur enregistre tout son état dans une zone de mémoire isolée de la mémoire système normale. La disposition de cette zone convient à l'instruction LOADALL, et cette instruction est utilisée par le code ICE pour revenir à l'exécution normale.
Dans les processeurs ultérieurs, cela a évolué vers le mode de gestion du système (SMM). Dans SMM, l'instruction RSM est utilisée pour charger un état CPU complet à partir d'une zone de mémoire. La disposition de cette zone de mémoire est similaire à celle utilisée par l'instruction LOADALL. L'instruction LOADALL de style 386 peut également être exécutée sur le 486, mais uniquement en mode SMM. Dans les processeurs ultérieurs, l'instruction RSM, avec un codage différent, a pris son rôle.
Codeview 3.0 de Microsoft et Turbo Debugger 2.0 de Borland décodent correctement les instructions LOADALL 286 et 386.
Comme les deux instructions LOADALL n'ont jamais été documentées et n'existent pas sur les processeurs ultérieurs, les opcodes ont été réutilisés dans l' architecture AMD64 . L'opcode pour l'instruction 286 LOADALL, 0F05, est devenu l'instruction AMD64 SYSCALL; l'instruction 386 LOADALL, 0F07, est devenue l'instruction SYSRET. Ces définitions ont été implémentées même sur les processeurs Intel avec l'introduction de l' implémentation Intel 64 d'AMD64.
80286
Opcode 0F05. L'instruction lit les données des adresses 00800–00866, quel que soit le contenu des registres de segments.
Adresse | nombre d'octets |
S'inscrire | S'inscrire | S'inscrire | S'inscrire |
---|---|---|---|---|---|
00800 | 6 | non utilisé | |||
00806 | 2 | MSW, mot d'état de la machine | |||
00808 | 14 | non utilisé | |||
00816 | 2 | TR (registre des tâches) | |||
00818 | 2 | drapeaux | |||
0081A | 2 | IP (pointeur d'instructions) | |||
0081C | 2 | LDTR, registre de la table des descripteurs locaux |
|||
0081E | 4 × 2 | DS ( segment de données ) | SS (segment de pile) | CS (segment de code) | ES (segment supplémentaire) |
00826 | 4 × 2 | DI (index de destination) | SI (index source) | BP (pointeur de base) | SP (pointeur de pile) |
0082E | 4 × 2 | BX | DX | CX | HACHE |
00836 | 4 × 6 | Descripteur de segment ES | Descripteur de segment CS | Descripteur de segment SS | Descripteur de segment DS |
0084E | 4 × 6 | GDT, tableau des descripteurs globaux |
LDT, table des descripteurs locaux |
IDT, table des descripteurs d'interruption |
TSS, segment d'état de tâche |
L'instruction 80286 LOADALL ne peut pas être utilisée pour passer du mode protégé au mode réel (elle ne peut pas effacer le bit PE dans le MSW). Cependant, l'utilisation de l'instruction LOADALL peut éviter de passer complètement en mode protégé.
80386
Opcode 0F07. L'instruction charge les données à partir de l'adresse ES: EDI. Il utilise en fait ES, pas le descripteur ES.
Adresse | nombre d'octets |
S'inscrire | S'inscrire | S'inscrire | S'inscrire |
---|---|---|---|---|---|
ES: EDI + 00 | 4 | CR0, registre de contrôle 0 | |||
ES: EDI + 04 | 4 | ÉFLAGS | |||
ES: EDI + 08 | 4 | EIP, pointeur d'instructions | |||
ES: EDI + 0C | 4 × 4 | EDI, index de destination | ESI, index des sources | EBP, pointeur de base | ESP, pointeur de pile |
ES: EDI + 1C | 4 × 4 | EBX | EDX | ECX | EAX |
ES: EDI + 2C | 2 × 4 | DR6 | DR7 | ||
ES: EDI + 34 | 4 | TR, sélecteur d'état des tâches | |||
ES: EDI + 38 | 4 | LDTR, table des descripteurs locaux |
|||
ES: EDI + 3C | 4 × 2 | GS, segment supplémentaire | non utilisé | FS, segment supplémentaire | non utilisé |
ES: EDI + 44 | 4 × 2 | DS, segment de données | non utilisé | SS, segment de pile | non utilisé |
ES: EDI + 4C | 4 × 2 | CS, segment de code | non utilisé | ES, segment supplémentaire | non utilisé |
ES: EDI + 54 | 4 × 12 | Descripteur TSS, sélecteur d'état des tâches |
Descripteur IDT, table des descripteurs d'interruption |
Descripteur GDT, tableau des descripteurs globaux |
Descripteur LDT, table des descripteurs locaux |
ES: EDI + 84 | 4 × 12 | Descripteur de segment GS | Descripteur de segment FS | Descripteur de segment DS | Descripteur de segment SS |
ES: EDI + B4 | 2 × 12 | Descripteur de segment CS | Descripteur de segment ES |
Voir également
Les références
Lectures complémentaires
- IBM Operating System / 2 Technical Reference - Programming Family (PDF) . 1 (1ère éd.). IBM . Septembre 1987 [1986]. Archivé (PDF) de l'original le 2017-01-03.
- Chappell, Geoff (janvier 1994). Schulman, Andrew; Pedersen, Amorette (éd.). Internals DOS . The Andrew Schulman Programming Series (1ère impression, 1ère éd.). Addison Wesley Publishing Company . pp. 4, 21, 100–106, 127–129. ISBN 978-0-201-60835-9 . (xxvi + 738 + iv pages, disquette 3,5 " [9] [10] ) Errata: [11] [12] [13]
- Chappell, Geoff (03/10/2008) [18/03/1997]. "Strange Things LINK connaît les processeurs 80x86" . Archivé de l'original le 21/04/2019 . Récupéré 21/04/2019 .
- Necasek, Michal (13/12/2014). "Instructions curieuses" . Musée OS / 2 . Archivé de l'original le 21/04/2019 . Récupéré 21/04/2019 .
- Stiller, Andreas (1990). "Bitter für 32-Bitter". c't - magazin für computertechnik (en allemand). Vol. 1990 no. 8. p. 202.
- Juffa, Norbert; Siering, Peter (1990). "Wege über die Mauer. Loadall - Mémoire étendue en mode réel des 80286". c't - magazin für computertechnik (en allemand). Vol. 1990 no. 11. pp. 362–366.