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