Executable DOS: signification des overlays ?

Pour tout ce qui touche au PC d'IBM et ses nombreux descendants. Attention tout de même, au delà de quelques MHz la discussion devient vite hors sujet.

Modérateurs : Papy.G, fneck, Carl

gotcha
Messages : 2758
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

Executable DOS: signification des overlays ?

Message par gotcha »

Hello,

Je suis en train d’étudier un programme EXE DOS.
Ce programme a des infos d'overlay optionnelles entre l’entête et les infos de relocation.

Ce que je comprend, c'est que les overlays spécifient des segments qui ne sont pas chargées en mémoire immédiatement par le loader.

Dans mon cas, j'ai 2 bytes de valeur 0x01 et 0x00 au niveau des overlay. Est-ce que quelqu'un connait leur signification ? Est-ce un unique word ?
Pièces jointes
DOS Overlay.png
DOS Overlay.png (58.05 Kio) Consulté 3849 fois
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
Fool-DupleX
Messages : 2284
Inscription : 06 avr. 2009 12:07

Re: Executable DOS: signification des overlays ?

Message par Fool-DupleX »

De mémoire, les overlays sont une spécificité Borland. Je chercherais dans la doc de Turbo-C ou Turbo-Pascal, dans les chapitres des fonctionnalités dites "avancées".
gotcha
Messages : 2758
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

Re: Executable DOS: signification des overlays ?

Message par gotcha »

Borland doit avoir sa méthode pour charger les zones en overlay lors de l’exécution du programme.

Mais dans le cas que je présente ici, c'est je pense le loader du DOS qui doit interpréter ces informations d'overlay pour ne pas charger en mémoire les secteurs en overlay. Cela doit se faire avant d'appliquer les relocations et ça doit être quelque chose de standardisé par le DOS (bon, on est sur du DOS 2.11 ici et chaque fabricant fait par contre peut être sa propre sauce avec le DOS).

Si le loader du DOS ignore les infos d'overlay dans cet EXE particulier, les relocations (visant le segment 0088h) se feront dans une partie du fichier qui ne fait pas de sens (une string pour la première) et le code exécuté ne sera pas le programme.

Mon interprétation (potentiellement erronée) est que:
  • les secteurs en overlay sont placés en premier dans le fichier.
  • les 2 bytes dont je cherche la signification pourraient être un word qui indique combien de secteurs de 512 bytes du début doivent être ignorés par le loader du DOS lors du chargement du fichier en mémoire. Ça serait cohérent avec ce que je vois dans le programme
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Executable DOS: signification des overlays ?

Message par __sam__ »

Quelques infos:
* https://studylib.net/doc/9927203/overlays-in-ms-dos
* https://news.ycombinator.com/item?id=24115321
Microsoft introduced overlay support in MS-DOS 2.x, via the "load overlay" function – INT 21h,AH=4Bh,AL=03h. You can see the references in the MS-DOS source code here: https://github.com/microsoft/MS-DOS/blo ... EC.ASM#L16
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Executable DOS: signification des overlays ?

Message par 6502man »

Toute la magie Intel avec ces segments ces overlays :lol: :lol: :lol:

Quand j'y pense à l'époque je trouvé tellement plus agréable de programmer en
assembleur 68000 par rapport au 8088/86 :roll:
Et je ne pense pas avoir était le seul :wink:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
gotcha
Messages : 2758
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

Re: Executable DOS: signification des overlays ?

Message par gotcha »

Les segments du 8086 sont en effet une source de complexité, sachant qu'une même adresse peut être exprimée de pleins de manières différentes.
Les Motorala sont plus simples.

Mais cette histoire d'overlay est différente et n'est pas liée au 8086. C'est pour minimiser la mémoire utilisée lors du chargement d'un programme exécutable. Globalement, certains blocs du fichiers ne sont pas chargés immédiatement par le loader et le seront ensuite à la demande dans un espace mémoire partagé.
Ce que je comprend, c'est que cette technique existait déjà sur les mainframes.

Dès l'instant où la mémoire est petite, on met en place des techniques pour l’économiser et on crée de la complexité.

Pour l'instant, j'ai commencé à regarder dans le code du loader EXE du DOS 2.x, mais je n'ai pas encore trouvé de réponses. Le code du DOS n'est pas très simple à lire et c'est clair que la segmentation du 8086 amplifie le problème :-)
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
Zebulon
Messages : 2787
Inscription : 02 nov. 2020 14:03

Re: Executable DOS: signification des overlays ?

Message par Zebulon »

Les segments dans l'architecture x86 de cette époque m'ont toujours paru quelque chose de logique et simple à assimiler, le principal intérêt était la relogeabilité du code.

J'ai pratiqué le mécanisme des overlays Borland en Turbo Pascal mais je ne savais pas si c'était supporté par un mécanisme sous-jacent du MS-DOS.
FreddyV
Messages : 432
Inscription : 10 oct. 2018 09:16

Re: Executable DOS: signification des overlays ?

Message par FreddyV »

6502man a écrit : 06 mars 2023 10:06 Toute la magie Intel avec ces segments ces overlays :lol: :lol: :lol:

Quand j'y pense à l'époque je trouvé tellement plus agréable de programmer en
assembleur 68000 par rapport au 8088/86 :roll:
Et je ne pense pas avoir était le seul :wink:
Justement, en 68000 il faut faire de la relocation tout le temps.
Sur 8086, quand un code tiens dans le même segment, pas besoin de relocation.
C'est plus simple.....
quand on est habitue aux segments sur 8086, c'est bien pratique pour beaucoup de choses !
gotcha
Messages : 2758
Inscription : 30 mars 2017 11:39
Localisation : Isère
Contact :

Re: Executable DOS: signification des overlays ?

Message par gotcha »

Effectivement, dans le EXE que j'ai regardé, il y a très peu de relocations. C'est juste pour le code qui met des valeurs dans les registres de segments j'imagine.
Amstrad CPC et Goupil power :mrgreen:
Bénévole à l'association pour un conservatoire de l’informatique et de la télématique (https://www.aconit.org)
FreddyV
Messages : 432
Inscription : 10 oct. 2018 09:16

Re: Executable DOS: signification des overlays ?

Message par FreddyV »

Pour les "JMP Far" et pour les variables qui sont dans un autre segment
nouvelhermes
Messages : 401
Inscription : 22 juil. 2020 20:56

Re: Executable DOS: signification des overlays ?

Message par nouvelhermes »

Je déterre ce post pour indiquer deux choses :
- Les overlays sont des sortes de sous-programmes qui sont chargés "au fil de l'eau" au cours de l'exécution d'un programme et qui permettaient d'avoir des programmes plus gros que la mémoire totale disponible, qui se souvient de la fameuse barrière des 640k. Cette technique était très courante du temps des XT, avant l'invention des mémoire haute, paginée et étendue (en principe réservé aux AT et supérieurs), cette technique permettaient aussi d'avoir des programmes plus gros que les capacité des disquettes de l'époque (les disques durs n'étaient pas la règle, et même plutôt l'exception).
Effectivement Borland dans versions pro du Pascal 7 et C++ (à partir de 2) ont créé des sortes d'interface d'Overlays rendant la chose plus simple à programmer.
- Les segments : le principal intérêt à ma connaissance (mais Daniel nous en dira peut-être davantage) d'économiser la mémoire (à une époque où c'était une denrée rare) un peu comme le registre DP sur 6809, mais ici de façon généralisée en séparant bien les données du code et en exprimant les adresses sur deux octets (au lieu de trois ou quatre). Il était même prévue une pile à part, mais en général (mais ce n'est pas toujours le cas), on avait la pile quii partageait le même segment que les données (DS=SS), la pile occupant le sommet du segment de données. On remarquera que ce modèle de segmentation a complètement disparu lors du passage au mode protégé (dit à plat).
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Executable DOS: signification des overlays ?

Message par __sam__ »

Je ne crois pas que les segments aient étés inventés pour économiser de la mémoire. Mais pour sortir 20bits d'adresse avec un CPU dont les registres n'étaient que de 16bits. Ca n'a aucun rapport avec les notion de pages directe de certains cpu 8bits car contrairement aux segments, il n'y a pas addition de registres pour former des adresses plus grandes, mais uniquement une notion de zone mémoire accessible plus rapidement (et/ou de pile pour certains d'entre eux).
Dernière modification par __sam__ le 30 mars 2023 13:28, modifié 1 fois.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
nouvelhermes
Messages : 401
Inscription : 22 juil. 2020 20:56

Re: Executable DOS: signification des overlays ?

Message par nouvelhermes »

Pour le registre DP, une astuce pour gagner des octets sur les cases mémoires très utilisées consiste en utilisant un mode d'adressage (je ne me souviens plus lequel), à n'iniquer l'octet de poids faible de l'adresse en question, et DP fait office de poids fort. Par exemple LDB /$0C charge l'adresse $210C si DP vaut $21 (valeur par défaut du BASIC).
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: Executable DOS: signification des overlays ?

Message par hlide »

De plus il faut distinguer le segment en mode réel (à partir du 8086) et le segment en mode protégé (à partir du 80286).

Le segment en mode réel c'est pour pouvoir adresser une mémoire étendue sur un bus physique 20-bit. Le segment en more réel découpe la totalité de la mémoire physique en bloc de granularité de 16 octets et de taille maximum 64 Ko (donc avec chevauchement entre les segments contigus) : adresse physique (20-bit) = segment (registre 16-bit) * 16 + offset (registre ou valeur immédiate16-bit). C'est ce dont parle __sam__ dans le précédent post.

Le segment en mode protégé devient un sélecteur (un index) et passe par une table globale ou locale pour obtenir l'adresse de base et la taille. Mais je ne pense pas qu'il y ait eu des overlays en mode protégé vu que les DOS extenders se contentaient d'un modèle plat 32-bit à partir du 80386.
cathodique
Messages : 25
Inscription : 22 nov. 2022 10:38

Re: Executable DOS: signification des overlays ?

Message par cathodique »

nouvelhermes a écrit : 30 mars 2023 12:56 On remarquera que ce modèle de segmentation a complètement disparu lors du passage au mode protégé (dit à plat).
Ouh alors là on mélange tout, le mode protégé apparait sur 286 avec l'adressage segment:offset 16+4 bits (pas du tout "à plat" donc!)

On décrivait le noyau et la mémoire partagée dans la GDT (table globale de description) et pour chaque processus dans la LDT (locale), l'OS devait changer sa LDT lors des changements de contexte (on est toujours sur un CPU 16 bits là hein!). Le mode protégé c'est uniquement pour protéger de la mémoire, on dit si c'est en lecture, en écriture, ou les deux et la zone concernée.

Pour avoir un adressage à plat, il faut attendre le 386 qui est un CPU 32 bits mais...

...mais si pour compatibilité, le 386 démarre toujours en mode réel paginé. On peut utiliser des offsets 32 bits si on veut, sans dépasser 65536 :D (enfin y a ptêtre moyen sur des pages contiguës mais j'ai toujours programmé propre donc je ne saurais dire...)

Le flat-mode (à plat) n'est pas un mode protégé! C'est une grosse bidouille de démo-maker qui consiste à entrer en mode protégé (avec un 386 ou +) et à s'allouer toute la mémoire d'un coup, puis on revient en mode réel. Son petit nom était d'ailleurs flat-real-mode ou unreal mode. https://en.wikipedia.org/wiki/Unreal_mode

Par ailleurs, le 386 introduit la pagination et c'est là qu'on a vu apparaitre les Dos-Extender avec le DPMI un peu plus tard. Et grâce à ça, on pouvait enfin profiter d'un adressage à plat avec de la mémoire virtuelle gérée de façon totalement transparente pour l'utilisateur. Je me rappelle allouer un tableau de 16M avec ma machine qui n'en possédait que 4M, mais comme je n'avais pas besoin de taper partout dans le tableau... => on est à plat côté utilisateur mais pas du tout à plat côté OS qui s'occupe de fragmenter la mémoire pour gérer le swap disk

Pour en revenir au mode protégé, il y avait un compilateur dynamique InstantC 16bits pour 286 qui ouvrait un descripteur par allocation mémoire malloc, ça permettait de faire péter le programme au moindre débordement. Ce fonctionnement existe encore aujourd'hui avec la libefence sous Linux par exemple https://en.wikipedia.org/wiki/Electric_Fence

Et sinon j'ai toujours les exécutables de ce vieux compilateur InstantC, il était chouette, quand ça pétait, tu te retrouvais dans le debug, tu modifiais la fonction, tu recompilais mais ton programme n'était pas arrêté, tu pouvais reprendre et au prochain appel de la fonction, il utilisait la nouvelle! C'est amusant de voir qu'aujourd'hui un projet du même nom existe, par une personne qui fait un interpréteur pour faire du C comme du script, à des fins de debug :)
Répondre